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

时间:2019-08-22 16:50:01

标签: python tensorflow conv-neural-network mnist

我正在从事深度学习,我认为我迷失了自己。让我解释一下:通过遵循Aurélien Géron's github(在单元格[21]中),我训练了“我的基本” MNIST。一切都进行得很顺利...我想.. ^^ ...我也使用了他的初始化方法..:

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

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

1 个答案:

答案 0 :(得分:0)

这不是那么简单。卷积确实在某种意义上不影响图像的翻译,但是您使用的神经网络不只是卷积层,从我在笔记本中可以看到,它包含两个卷积层层,最大池,完全连接和输出层。自然地,完全连接和输出的层对于翻译来说不是不变的,因此整个网络对于翻译来说也不是不变的。当您转移输入图像并将其馈送到网络时,第二个卷积层的输出将与原始图像相同,只是进行了相应的翻译,但是,完全连接的层经过了训练,可以“预期”激活的某些分布在卷积层中,通过手动翻译图像,您可能提供的示例与训练示例相差太大,从而导致分类失败。

对于第二点,并排4和2无效,因为该网络未接受数字对训练。与前面的情况一样,当您在单个图像中为网络提供4和2时,卷积层的输出将与训练期间发生的输出有很大不同,因此网络不会给您有意义的答案。 / p>

此外,网络的顶部有一个softmax层,因此实际上不能一次给您两个类别的100%,所有概率的总和始终为100%。

我建议尝试更深入地了解神经网络中实际发生的情况以及如何对其进行优化。一旦掌握了一些聪明的数学知识,您就会看到问题的答案。这些模型并非总是能为您提供正确答案的魔术盒。为此,我推荐Andrej Karpathy撰写的斯坦福大学CNN课程。如果您遵循该步骤,您将对发生的事情获得真正的,非肤浅的理解。

如果您想要一个能够很好地处理翻译数字的模型,则可以使用更大的图像,例如40x40,然后将原始的28x28图像放到随机位置并以此训练您的网络。然后,您应该拥有一个可以识别数字的模型,无论放置在何处。

如果您想要一个可以识别多位数的模型,请创建一个包含多位数图像示例的数据集,并为每个样本使用多个标签(为此,您可能必须停止使用softmax并使用Sigmoid,可能与MSE一起使用)错误)。然后,您应该有一个可以一次识别多个数字的模型。