(keras安装可参考我的文章:Windows 下 Python 3.6 下安装 TensorFlow,和pyopencl没关系)
首先,你要有一些数学和哲学知识,比如:
听说过【向量】 (知道可以把数写成(1,2,3,4)这种形式即可)
懂一点【抽象】,能提炼出一些事物的关联 (比如,汽车和自行车有什么共同点?)
能不看教程写出python小程序(比如打印helloworld)
(技巧:看不很懂就试图“观其大略”)
对于向量,如果想进一步了解,可以参考视频:
(你至少会从中习惯,可以把向量竖着写)
接下来的三个视频也是同样的来源。显然他们说的比我好,我只需要放链接……
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)
运行非常慢(这可是神经网络!),我没有GPU,训练一次大约要40秒(最后一行的epoch表示训练次数)。看着别人的个位数秒数,有点难过。
(2018-2-6 于地球)