训练和预测代码如下
model=Sequential()
model.add(Dense(units=64,
input_dim=784,
kernel_initializer=‘normal’,
activation=‘relu’))
model.add(Dense(units=10,
kernel_initializer=‘normal’,
activation=‘softmax’))
model.compile(loss=‘categorical_crossentropy’,
optimizer=‘adam’,metrics=[‘accuracy’])
model.fit(x_train_normalize,
y_trainOnehot,
epochs=20,
batch_size=64,
verbose=1,
validation_data=(x_test_normalize,y_testOnehot))
y_predict= model.predict(x_train_normalize)
y_predictlabel=y_predict.argmax(1)
其它的手写数字都分类正确,只有0,没有一个分类正确的,算法的正确率也大致在90%左右。
分析:
1keras每次run代码,训练会从上一次训练结果的模型参数开始进行下一个epoch的训练,即使改变Nodes个数(units从64改成128),重新训练,精度和分类结果仍然和之前的结果基本一样。重新启动spyder则会重新初始化开始训练
2之前训练的精度无论迭代多少次,都是在0.89以上徘徊,因为所有的0都分类错误。(写代码遍历label为0的图像,没有正确分类的)。可能是因为在训练初期达到了局部最优,梯度下降无法走出该范围。重新训练后,路径不再经过该局部最优位置,因此精度大幅度提高到0.97 0.98
3通过查看分类错误图像有利于分析分类模型的效果,查找原因。对分类效果好的模型要注意保存。重新训练未必会再次优化到该参数。
附,训练曲线
4之后的重新训练,又发生了一次所有的1都分类错误,精确度收敛在0.86左右,在局部最优达到稳定。还有一次所有9分类错误,所有3分类错误。有一次训练,直接从精度0.95开始,还有一次收敛在精度0.77。
考虑增加nodes个数,是否能减少该现象。另外考虑有无设置训练步长的参数,避免该现象。实验证明,增加nodes不能解决该问题。
或者某些图像标记错误会引起该现象?不,如果算法鲁棒性好,即使有少量错误label应该依然有更好的训练结果,比如精度达到99%。考虑到这只是初级的算法,后续通过算法学习应该能够得到更优化的结果。
Layer (type) Output Shape Param #
dense (Dense) (None, 64) 50240
dense_1 (Dense) (None, 10) 650
Total params