(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)


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


  (2018-2-6 于地球)