(keras安装可参考我的文章:Windows 下 Python 3.6 下安装 TensorFlow,和pyopencl没关系)
首先,你要有一些数学和哲学知识,比如:
对于向量,如果想进一步了解,可以参考视频:
(你至少会从中习惯,可以把向量竖着写)
接下来的三个视频也是同样的来源。显然他们说的比我好,我只需要放链接……
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 于地球)
还没有人评论...