和之前比较不一样的是我们还要做 compile 才正式把我们的神经网路建好。你可以发现我们还需要做几件事:
1.决定使用的 loss function, 一般是 mse
2.决定 optimizer, 我们用标准的 SGD
3.设 learning rate
4.为了一边训练一边看到结果, 我们加设 metrics=['accuracy']
本行基本上和我们的神经网路功能没有什么关系。
model.compile(loss='mse', optimizer=SGD(lr=0.1), metrics=['accuracy'])
檢視我們的神經網路
我们可以检视我们神经网路的架构, 可以确认一下是不是和我们想像的一样。
看 model 的 summary
model.summary()
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_1 (Dense) (None, 500) 392500
_________________________________________________________________
activation_1 (Activation) (None, 500) 0
_________________________________________________________________
dense_2 (Dense) (None, 500) 250500
_________________________________________________________________
activation_2 (Activation) (None, 500) 0
_________________________________________________________________
dense_3 (Dense) (None, 10) 5010
_________________________________________________________________
activation_3 (Activation) (None, 10) 0
=================================================================
Total params: 648,010
Trainable params: 648,010
Non-trainable params: 0
_________________________________________________________________
画出结构图
要使用这个功能要安装 pydot 及 graphviz 两个套件, 请在终端机 (Anaconda Prompt) 安装:
conda install pydot
conda install graphviz
from keras.utils import plot_model
plot_model(model, show_shapes=True, to_file='.\data\model01.png')
训练你的第一个神经网路
恭喜! 我们完成了第一个神经网路。现在要训练的时候, 你会发现不是像以前没头没脑把训练资料送进去就好。这里我们还有两件事要决定:
一次要训练几笔资料 (batch_size), 我们就 100 笔调一次参数好了
这 6 万笔资料一共要训练几次 (epochs), 我们训练个 20 次试试
于是最精彩的就来了。你要有等待的心理准备...
model.fit(x_train, y_train, batch_size=100, epochs=20)
Epoch 1/20
60000/60000 [==============================] - 11s - loss: 0.0834 - acc: 0.3414
Epoch 2/20
60000/60000 [==============================] - 10s - loss: 0.0638 - acc: 0.6270
Epoch 3/20
60000/60000 [==============================] - 11s - loss: 0.0459 - acc: 0.7645
Epoch 4/20
60000/60000 [==============================] - 10s - loss: 0.0334 - acc: 0.8397
Epoch 5/20
60000/60000 [==============================] - 10s - loss: 0.0257 - acc: 0.8739
Epoch 6/20
60000/60000 [==============================] - 11s - loss: 0.0213 - acc: 0.8895
Epoch 7/20
60000/60000 [==============================] - 11s - loss: 0.0186 - acc: 0.8991
Epoch 8/20
60000/60000 [==============================] - 11s - loss: 0.0168 - acc: 0.9061
Epoch 9/20
60000/60000 [==============================] - 11s - loss: 0.0154 - acc: 0.9119
Epoch 10/20
60000/60000 [==============================] - 11s - loss: 0.0144 - acc: 0.9164
Epoch 11/20
60000/60000 [==============================] - 11s - loss: 0.0135 - acc: 0.9210
Epoch 12/20
60000/60000 [==============================] - 11s - loss: 0.0129 - acc: 0.9247
Epoch 13/20
60000/60000 [==============================] - 11s - loss: 0.0122 - acc: 0.9278
Epoch 14/20
60000/60000 [==============================] - 12s - loss: 0.0117 - acc: 0.9308
Epoch 15/20
60000/60000 [==============================] - 11s - loss: 0.0112 - acc: 0.9338
Epoch 16/20
60000/60000 [==============================] - 11s - loss: 0.0108 - acc: 0.9364
Epoch 17/20
60000/60000 [==============================] - 11s - loss: 0.0105 - acc: 0.9382
Epoch 18/20
60000/60000 [==============================] - 11s - loss: 0.0101 - acc: 0.9404
Epoch 19/20
60000/60000 [==============================] - 12s - loss: 0.0098 - acc: 0.9429
Epoch 20/20
60000/60000 [==============================] - 13s - loss: 0.0095 - acc: 0.9448
<keras.callbacks.History at 0x7f9ce0d7c978>
试用我们的结果
我们来用比较炫的方式来看看可爱的神经网路学习成果。对指令有问题可以参考我们之前的 MOOC 影片教学。
from ipywidgets import interact_manual
我们 "predict" 放的是我们神经网路的学习结果。这里用 predict_classes 会让我们 Keras 选 10 个输出机率最大的那类。
predict = model.predict_classes(x_test)
9984/10000 [============================>.] - ETA: 0s
不要忘了我们的 x_test 每笔资料已经换成 784 维的向量, 我们要整型回 28x28 的矩阵才能当成图形显示出来!
def test(测试编号):
plt.imshow(x_test[测试编号].reshape(28,28), cmap="Greys")
print("神经网路判断为:", predict[测试编号])
interact_manual(test, 测试编号 = (0, 9999));
interactive(children=(IntSlider(value=4999, description='测试编号', max=9999), Button(description='Run Interact', …
到底测试资料总的状况如何呢? 我们可以给我们神经网路「考一下试」。
score = model.evaluate(x_test, y_test)
9536/10000 [===========================>..] - ETA: 0s
print('测试资料的 loss:', score[0])
print('测试资料正确率:', score[1])
训练好的神经网路存起来!
如果对训练成果满意, 我们当然不想每次都再训练一次! 我们可以把神经网路的架构和训练好的参数都存起来, 以供日后使用!
之前还没装 pyh5 要在终端机 (Anaconda Prompt) 下安装:
conda install h5py
model_json = model.to_json()
open('./data/handwriting_model_architecture.json', 'w').write(model_json)
model.save_weights('./data/handwriting_model_weights.h5')
reference