输入格式整理
我们现在要用标准神经网路学学手写辨识。原来的每笔数据是个 28x28 的矩阵 (array), 但标准神经网路只吃「平平的」, 也就是每次要 28x28=784 长的向量。因此我们要用 reshape 调校一下。
x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
输出格式整理
我们可能会想, 我们想学的函数是这样的型式:
其实这样不太好! 为什么呢? 比如说我们的输入 x 是一张 0 的图, 因为我们训练的神经网路总会有点误差, 所以可能会得到:
那这意思是有可能是 0, 也有可能是 1 吗!!?? 可是 0 和 1 根本不像啊。换句话说分类的问题这样做其实不合理! 于是我们会做 "1-hot enconding", 也就是
- 1 -> [0, 1, 0, 0, 0, 0, 0, 0, 0]
- 5 -> [0, 0, 0, 0, 0, 1, 0, 0, 0]
等等。因为分类问题基本上都要做这件事, Keras 其实已帮我们准备好套件!
from keras.utils import np_utils
y_train = np_utils.to_categorical(y_train,10)
y_test = np_utils.to_categorical(y_test,10)
我们来看看刚刚是 1 的 9487 号数据的答案。
y_train[9487]
array([0., 1., 0., 0., 0., 0., 0., 0., 0., 0.])
和我们想的一样! 至此我们可以打造我们的神经网路了。
打造第一个神经网路 我们决定了我们的函数是
这个样子。而我们又说第一次要用标准神网路试试, 所以我们只需要再决定要几个隐藏层、每层要几个神经元, 用哪个激发函数就可以了。
决定神经网路架构、读入相关套件
使用 2 个 hidden layers 每个 hidden layer 用 500 个神经元 Activation Function 唯一指名 sigmoid 于是从 Keras 把相关套件读进来。
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import SGD
建构我们的神经网路
和以前做回归或机器学习一样, 我们就打开个「函数学习机」。标准一层一层传递的神经网路叫 Sequential, 于是我们打开一个空的神经网路。
model = Sequential()
我们每次用 add 去加一层, 从第一个隐藏层开始。而第一个隐藏层因为 Keras 当然猜不到输入有几个 features, 所以我们要告诉它
model.add(Dense(500, input_dim=784))
model.add(Activation('sigmoid'))
第二层 hidden layer 因为前面输出是 500, 现在输入是 500, 就不用再说了! 这里的 500 只告诉 Keras, 我们第二层还是用 500!
model.add(Dense(500))
model.add(Activation('sigmoid'))
输出有 10 个数字, 所以输出层的神经元是 10 个! 而如果我们的网路输出是
我们还希望
这可能吗, 结果是很容易, 就用 softmax 当激发函数就可以!!
model.add(Dense(10))
model.add(Activation('softmax'))
至此我们的第一个神经网路就建好了!