Python-标准神经网路DNN第三篇

和之前比较不一样的是我们还要做 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

  • 26
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值