缺乏对 cnn 结果和效用的理解

lack of understanding cnn result and utility

我正在研究深度学习,我想我迷失在 cnn 中了。让我解释一下:通过关注 Aurélien Géron's github(在单元格 [21] 中),我训练了“我的基础” MNIST。一切顺利...我想.. ^^ ...我也使用了他的初始化.. :

..
8 最后一批精度:1.0 测试精度:0.9852,
9 最后一批精度:1.0 测试精度:0.9892,

然而,在同一作者的书中,它指定:“......一旦 CNN 学会了在一个位置识别模式,它就可以在任何其他位置识别它......”(第358).这是否意味着如果我的网络检测到 99% 的数字,我就可以将它移动到它能识别的任何地方?我问这个,因为它不起作用。预测非常糟糕,即在 28x28 图像上 100% 检测到“4”:

...
3 : 0.0 %
4 : 100.0 %
5 : 0.0 %
...

在同一张图片上,我移动了几个像素的形状(对于那些想知道如何使用油漆的人):

0 : 20.0 %
1 : 21.0 %
2 : 2.0 %
3 : 0.0 %
4 : 22.0 %
5 : 14.0 %
6 : 0.0 %
7 : 21.0 %
8 : 1.0 %
9 : 0.0 %

我真的理解 cnn 的概念吗?
此外,如果我将“4”和“2”并排放置,为什么它不起作用? 网络不应该每个都告诉我 100%?

我的import_graph代码:

saver = tf.train.import_meta_graph("./my_mnist_model.meta")  
X_prod = snt_X_prod.astype(np.float32).reshape(-1, 28*28) / 255.0 
sess = tf.Session()
saver.restore(sess, "./my_mnist_model")
result = sess.run("output/Y_proba:0", feed_dict={"inputs/X:0": X_prod})

没那么简单。卷积确实在某种意义上对图像的翻译是不变的,但是你使用的神经网络不仅仅是一个卷积层,从我在笔记本中看到的,它包含两个卷积层,最大池化层,全连接层和输出层。全连接层和输出层自然not平移不变,因此整个网络不是平移不变的。当您移动输入图像并将其馈送到网络时,第二个卷积层的输出将与原始图像相同,只是相应地进行了平移,但是,全连接层被训练为 "expect" 某种分布卷积层的激活,通过手动翻译图像,您可能提供的示例与导致分类失败的训练示例差异太大。

对于第二点,并排的 4 和 2 不起作用,因为网络未针对数字对进行训练。与之前的情况一样,当您在单个图像中向网络呈现 4 和 2 时,卷积层的输出将与训练期间发生的输出有很大不同,因此网络不会给您有意义的答案。

此外,网络在顶部有一个softmax层,所以实际上它不能一次给你两个类 100%,所有的总和概率永远是 100%。

我建议尝试更深入地了解神经网络中实际发生的事情以及它是如何优化的。一旦掌握了所涉及的一些巧妙的数学知识,您就会看到问题的答案。这些模型不是总能给你正确答案的魔法盒。为此,我推荐 Andrej Karpathy 开设的斯坦福大学 CNN 课程。如果你遵循这一点,你将对正在发生的事情有真正的、非肤浅的理解。

如果您想要一个在翻译后的数字上运行良好的模型,您可以使用更大的图像,例如40x40,然后将原始 28x28 图像放入随机位置并在其上训练您的网络。那么你应该有一个无论你把它放在哪里都能识别数字的模型。

如果您想要一个可以识别多个数字的模型,请创建一个数据集,其中包含具有多个数字的图像示例,并为每个样本使用多个标签(为此,您将不得不停止使用 softmax 并使用 sigmoid,可能取而代之的是 MSE 错误)。那么你应该有一个可以一次识别多个数字的模型。