一边学,一边写出的人工智能教程(一)

lamdba
8个月前 阅读 262 点赞 3

(keras安装可参考我的文章:Windows 下 Python 3.6 下安装 TensorFlow,和pyopencl没关系)


首先,你要有一些数学和哲学知识,比如:

  • 听说过【向量】 (知道可以把数写成(1,2,3,4)这种形式即可)
  • 懂一点【抽象】,能提炼出一些事物的关联 (比如,汽车和自行车有什么共同点?)
  • 能不看教程写出python小程序(比如打印helloworld)
  • (技巧:看不很懂就试图“观其大略”)


对于向量,如果想进一步了解,可以参考视频:

3Blue1Brown的视频教程(线性代数) 

(你至少会从中习惯,可以把向量竖着写)


接下来的三个视频也是同样的来源。显然他们说的比我好,我只需要放链接……

3Blue1Brown的视频教程(神经网络)1

3Blue1Brown的视频教程(神经网络)2

3Blue1Brown的视频教程(神经网络)3 (分上下篇)


再放一个:(我是按顺序放的)

知乎回答(卷积层)(卷积神经网络简称CNN)

(作者:地球的外星人君;来源:知乎)

下面的代码就出自上方回答。但我处理了一下,写成了伪代码……


### 准备原料

 

### 制作饲料

 

### 制作猫

 

### 喂猫


(笑)大概就是这么个过程,虽然比较抽象,但能够说明问题。具体一点的话,第一步是这样的:


### 准备原料!

import numpy

 

from keras.datasets import mnist

    # data数据,set集合,datasets数据集;  mnist是一个著名的数字图像识别数据集

 

from keras.models import Sequential

    # model模型;  Sequential 序贯模型(应该就是最简单的模型——层与层相继连接而已)

 

from keras.layers import Dense

    # layer层;  dense密集的(可能是指普通的一层)

 

from keras.layers import Dropout

    # dropout丢弃

 

from keras.layers import Flatten

    # flatten压平,numpy中此名称对应函数是把不管多少维的矩阵中的数 列为一行

 

from keras.layers.convolutional import Conv2D

    # convolutional卷积;  Conv2D大概是2维卷积

 

from keras.layers.convolutional import MaxPooling2D

    # MaxPooling 区域中共同最大值 (记得那个回答中的“池化”么)

 

from keras.utils import np_utils

    # util工具;  np应该是numpy

 

seed = 7

numpy.random.seed(seed)

    # 随机数初始化,seed种子(如果你知道我的世界种子,就很好理解)

    # 种子随机就是说,用同一个种子会生成同一个随机数列,即使反复运行


第二步:(你可能需要事先理解多维数组)


### 制作饲料!

 

# 加载信息

(X_train, y_train), (X_test,y_test) = mnist.load_data()

    # 两个X都是列表,其元素为图像(二维矩阵表示);两个y也都是列表,其元素是X中图像对应的数字;train表示训练用,test表示测试用

 

# 使信息成为模型能处理的格式

X_train = X_train.reshape(X_train.shape[0],28, 28,1).astype('float32')

    # (张量,英文tensor,0维张量是标量,1维是向量,2维是矩阵,3维大概是立方阵,等等)

    # n维张量的shape是由各维度上的元素个数组成的n元向量,比如三阶方阵的shape是(3,3)

    # reshape就是把矩阵按顺序展平后重新拼(比如全是1的三阶方阵一般是这么表示的:[[1,1,1],[1,1,1],[1,1,1]],展平就是只留最外层括号)

    # 另:最后一个1是图像通道数,灰度图自然是1,三色应该就是3

 

X_test = X_test.reshape(X_test.shape[0],28, 28,1).astype('float32')

    # 整数类型化为浮点类型

 

X_train = X_train / 255

X_test = X_test / 255

    # (0-255 -> 0-1)

 

y_train = np_utils.to_categorical(y_train)

y_test = np_utils.to_categorical(y_test)

    # 序列化,即用[1,0,0,0,0,0,0,0,0,0] 代替 0,[0,1,0,0,0,0,0,0,0,0] 代替 1,[0,0,1,0,0,0,0,0,0,0] 代替 2,等等,

    # 记得3Blue1Brown视频里输出的样子么?一列

 

num_classes = y_test.shape[1]

    # 结果数量


第三步:


### 制作猫!

 

def baseline_model():

 

  model = Sequential()

      # 建一个空的“序贯模型”

 

  model.add(Conv2D(32, (3, 3), padding='valid', input_shape=(28, 28,1), activation='relu'))

  model.add(MaxPooling2D(pool_size=(2, 2)))

      # 添加卷积层

 

  model.add(Conv2D(15, (3, 3), padding='valid' ,activation='relu'))

  model.add(MaxPooling2D(pool_size=(2, 2)))

      # 似乎是再加一个卷积层  (导入部分已经翻译了函数名称)

 

  model.add(Flatten())

      # 进入一维模式  (记得视频里把图像一维化么,这里是先卷积再一维化)

 

  model.add(Dense(128, activation='relu'))

  model.add(Dense(num_classes, activation='softmax'))

      # “密集层”(似乎也叫“全连接”)

 

  model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

      # compile编译,这总不该解释运行了……

  return model

 

model = baseline_model()

    # (用函数加调用来创建模型“看起来更清晰”)


第四步:

### 喂猫

 

model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=5, batch_size=128, verbose=2)


使用这个模型(这似乎才是主体),和训练非常相似,返回一个预测的结果组成的数组。


model.predict(X_train, batch_size=128, verbose=2)


运行非常慢(这可是神经网络!),我没有GPU,训练一次大约要40秒(最后一行的epoch表示训练次数)。看着别人的个位数秒数,有点难过。



(2018-2-6 于地球)

| 3
登录后可评论,马上登录吧~
评论 ( 0 )

还没有人评论...