在MNIST数据集上使用可变图像输入分辨率的问题(使用CNN时)

时间:2020-11-06 04:18:30

标签: python tensorflow opencv cnn mnist

关于CNN,我有点新,所以请尽可能纠正我!

我一直在尝试使用MNIST数据集进行数字分类。我决定通过将自己的手写数字传递到模型的预测方法中来进一步向前迈进。我知道MaxPooling2D层仅允许固定的输入分辨率,因此经过一些研究,我使用了GlobalMaxPooling2D。这解决了可变输入图像分辨率的问题。我现在面临的问题是,预测方法可以根据MNIST数据集的测试集准确地预测图像,但是无法预测我自己的手写数字。 这是我的模特:

model=Sequential()
model.add(Conv2D(128,(5,5),input_shape=(None,None,1), data_format='channels_last'))
model.add(Dense(80, activation='relu'))
model.add(GlobalMaxPooling2D())
model.add(BatchNormalization())
model.add(Dense(10,activation='softmax'))

该模型的训练准确性为94.98%,测试准确性为94.52%。为了预测自己的手写数字,我使用了分辨率为200x200的图像。该模型可以以某种方式预测特定数字,例如8、6和1,但是当我测试任何其他数字时,它仍将其分类为8、6或1。 任何人都可以指出我要去哪里了吗? 任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

有几件事可以促进您在这里看到的内容。
优化过程不好,优化模型的方式可能直接影响模型的性能。适当的选择优化器,学习率,学习率衰减机制,适当的正则化只是其中的一部分。
除此之外,您的网络非常简单,设计也很糟糕。您没有足够的Conv图层来利用图像结构并提供可用于执行您要执行的操作的良好抽象。您的模型也不够深入。

MNIST本身是一项非常简单的任务,使用线性分类器,您可以达到的精度非常高,甚至可能更高。这表明您没有以任何好的方式利用CNN或深度架构功能。如果经过适当培训,即使是简单的一两个完全连接的层也可以为您提供更高的准确性。

请尝试使您的网络更深,使用更多的CNN层,依次使用BatchNormalization和ReLU,并避免对输入要素图进行快速下采样。下采样时,您会丢失信息,为了弥补这一点,通常需要在下一层上增加过滤器,以弥补由此导致的表示能力下降。
换句话说,尝试逐渐减小特征图的尺寸,并增加神经元数量。

一开始的大量神经元对于您的特定用例是浪费的,随着网络的不断深入,更多的抽象功能是建立在早期层的更原始功能之上的,因此32/64可能绰绰有余。通常,在后面的层中更多的神经元通常更合理。

早期的层负责创建原始过滤器,在某些情况下,更多的过滤器将对性能无济于事,它只是创建重复的工作,而这些工作已经由先前的过滤器完成了。

看到准确性差异的原因仅仅是因为您最终遇到了另一个局部最小值!使用相同的精确配置,如果您训练100次,则将获得100个不同的结果,其中一些结果要好于其他结果,而某些结果却比其他结果差,永远不会有相同的精确值,除非您通过使用特定种子使用确定性行为并且仅在cpu模式。