MNIST tensorflow 实现
模型说明
model = tf.keras.Sequential(
[
tf.keras.layers.Flatten(input_shape=(28,28)),
tf.keras.layers.Dense(128,activation='relu'),
tf.keras.layers.Dropout(0.55),
tf.keras.layers.Dense(10,activation='softmax')
]
)
模型由tf.keras的api实现
tf.keras.layers.Flatten : 将二维的输入一维化
tf.keras.layers.Dense : 对原矩阵进行变换,通过矩阵变化得到矩阵形状
tf.keras.layers.dropout: 防止网络过拟合
正常训练
- epoch设置为5
- optimizer 为adam
- loss函数 为 sparse_categorical_crossentropy
- metrics accuracy
准确率为 97.2%左右
-
将激活函数改为 sigmoid 后,准确率下降为96.2%左右
将训练数据减少到5000组,进行相同次数的训练。relu仍能达到92%左右,sigmoid只有90%
符合sigmoid函数收敛缓慢的特点
将训练次数增多,sigmoid和relu都能达到近似97%的正确率
-
将Dense层中的输出维度进行修改以下为修改后数据与其相应结果
为了让效果更明显,减少训练的次数
Dense维度 结果 128 92.21% 1024 94.37% 32 90.07% Dense层维度的增大可以提高模型的准确率,但是会降低其训练速度
-
修改Dropout
Dropout 结果 0 94.96% 0.1 95.23% 0.5 94.63% 0.9 93.80% 0.99 72.39% dropout是为了提高模型的泛化能力,因为MNIST的测试集和训练集较为特殊,dropout不需要太高
-
修改optimizer
optimizer 结果 adam 98.04% sgd 94.41% nadam 97.97% adamax 97.61% 但是nadam明显慢于其余三个优化器
5.增加Dense层
Dense层数 | 每层的维度 | 结果 |
---|---|---|
2 | (512,128) | 98.00% |
2 | (512,512) | 98.11% |
2 | (128,512) | 97.53% |
3 | (512,512,512) | 98.00% |
fashion_mnist
fashion_mnist 也能用上述模型去拟合数据,只是需要再添加Dense层,提高Epoch到50-100之间,我设置Epoch=100后居然准确率能达到100%,真的是很神奇