书接前文,好不容易把TensorFlow2GPU环境配好,开始试代码,参照一位高人的例子开始动手:
小例子运行成功。
Train on 60000 samples
Epoch 1/5
60000/60000 [==============================] - 3s 46us/sample - loss: 0.4979 - accuracy: 0.8257
Epoch 2/5
60000/60000 [==============================] - 3s 44us/sample - loss: 0.3735 - accuracy: 0.8644
Epoch 3/5
60000/60000 [==============================] - 3s 44us/sample - loss: 0.3330 - accuracy: 0.8788
Epoch 4/5
60000/60000 [==============================] - 3s 44us/sample - loss: 0.3128 - accuracy: 0.8861
Epoch 5/5
60000/60000 [==============================] - 3s 44us/sample - loss: 0.2904 - accuracy: 0.8938
继续探索,发现此例子脱胎于谷歌TensorFlow2官网上的教程,心里对作者产生一点鄙夷,于是干脆去对照官网的例子 官网例子点这 去重头研读,收获更丰,心满意足。可以代码改来改去突然坏掉了,结果如下。
model.fit(train_images, train_labels, epochs=5)
Train on 60000 samples
Epoch 1/5
60000/60000 [==============================] - 3s 51us/sample - loss: 2.3300 - accuracy: 0.1532
Epoch 2/5
60000/60000 [==============================] - 3s 48us/sample - loss: 2.3026 - accuracy: 0.2064
Epoch 3/5
60000/60000 [==============================] - 3s 48us/sample - loss: 2.3026 - accuracy: 0.2064
Epoch 4/5
60000/60000 [==============================] - 3s 49us/sample - loss: 2.3026 - accuracy: 0.2064
Epoch 5/5
60000/60000 [==============================] - 3s 50us/sample - loss: 2.3026 - accuracy: 0.2064
识别准确率只有20%,loss大道到2。明显是哪里有问题,而且错误很严重,有可能是数据不小心被我改坏了,因为跟师弟聊过数据除以255的问题,也有可能是网络结构被我改坏了。这两个问题分别排查,发现官网上model.fit之后model.fit,最后再probability_model.predict,predict之前加上了一层
probability_model = tf.keras.Sequential([model,tf.keras.layers.Softmax()])
而加之前仅仅是
model = keras.Sequential(
[
layers.Flatten(input_shape=[28, 28]),
layers.Dense(128, activation='relu'),
layers.Dense(10)
])
此处与csdn上的例子不同。于是改回去,加上最后一个全连接层的激活函数
layers.Dense(10, activation='softmax')
心里估计这下百分百没问题了,结果运行之后故障依旧
红了一大片,不知怎么回事儿,心烦地睡去。
隔日开机继续排查,想来想去还是网络结构有问题的可能性最大,加激活与不加,继续试,问题竟然解决了,但是如图所示,得到的数值结果不接近1,只是明显不其他类别大一些而已,也就是说蓝色柱子比较矮。
继续排查,发现要得到官网上的结果应该将官网代码model和probability_model分别改为:
model = keras.Sequential(
[
layers.Flatten(input_shape=[28, 28]),
layers.Dense(128, activation='relu'),
layers.Dense(10,activation='softmax')
#layers.Dense(10)
])
probability_model = model
此时才能得到与官网一致的结果:
几点思考
- 为什么第一天发现网络结构有问题,改正后运行看不到效果。
- 难道官网代码有误(2020年3月16日版本)?而csdn那位博主改对了?因为他的预测是这么写的predictions = model.predict(test_images)。