为什么我的CNN无法学习?

时间:2016-05-14 16:21:58

标签: computer-vision neural-network tensorflow deep-learning

我是深度学习的新手。我刚刚使用Tensorflow实现了CNN,并在CIFAR-10上进行了尝试(一个对象识别基准,其中图像在 10个不同的类中)。

在训练过程中,训练开始时开始减少(从100000到3),但随后总是停留在 2.30 附近(大约是log(1/10)) )。由于我使用交叉熵作为损失函数,因此损失2.30意味着我的模型具有大约10%的准确度----与随机猜测完全相同(我已经检查了模型的实际输出,实际上几乎都是10%左右)每节课)。

我试图增加模型的大小,以便尝试是否因为我的模型不够强大而不适合过度。但事实证明,无论我如何增加或减少模型尺寸,训练损失总是会在2.30附近停止下降。

我非常有信心我正确地实现了它,因为我的模型适用于更简单的任务,如MNIST(手写数字识别)。所以我真的很想知道问题是什么。非常感谢。 enter image description here

conv1:带relu的卷积层

pooling1:max pooling layer

fc1:带有relu的完全连接层

输出:带softmax的全连接层

CODE:

$(document).ready ->
  $("#new_article").on("ajax:success", (e, data, status, xhr) ->
    $("#new_article").append xhr.responseText
  ).on "ajax:error", (e, xhr, status, error) ->
    $("#new_article").append "<p>ERROR</p>"

修改

正如我所说。我试图通过添加更多图层来增加模型的复杂性,并且几乎尝试了教程中的那个,除了我没有标准层(conv1,pooling1,conv2,pooling2,fc1,fc2,softmax)和预处理像美白等。为简单起见,我认为这可能不会影响我的表现,从86%到10%。

我认为可能有帮助的另一个线索是我发现图层nn = NeuralNetwork(optimizer=Adam(0.001), log_dir='logs') nn.add(Input('input', [32, 32, 3], )) nn.add(Convolution2D(name='conv1', filter_height=3, filter_width=3, n_output_channels=256, activation_fn='relu')) nn.add(Pooling2D('pooling1', mode='max', pool_shape=(3, 3), padding='SAME')) nn.add(Convolution2D(name='conv2', filter_height=3, filter_width=3, n_output_channels=128, activation_fn='relu')) nn.add(Pooling2D('pooling2', mode='max', pool_shape=(3, 3), padding='SAME')) nn.add(FullyConnected('fc1', 384, activation_fn='relu', weight_init=truncated_normal(), bias_init=constant(0.1))) nn.add(FullyConnected('fc2', 192, activation_fn='relu', weight_init=truncated_normal(), bias_init=constant(0.1))) nn.add(Output(loss_fn='sparse_softmax_cross_entropy', output_fn='softmax', name='output', target_shape=[], target_dtype=tf.int64, output_shape=10)) nn.build() 的输出非常稀疏(几乎99%的元素都是零)。由于我使用ReLU作为激活函数,这意味着fc1中的单位大部分都是死的。我有什么可以做的吗?

1 个答案:

答案 0 :(得分:7)

您可能只是严重低估了在此任务上取得合理结果所需的架构。您描述的模型(输入 - &gt; conv1-&gt; pooling1-&gt; fc1-&gt;输出)可能适用于MNIST,但这并不意味着它可以在图像分类任务上实现比随机结果更好的效果涉及真彩色图像。

现实情况是,您需要为人们提供实际代码以提供更具体的建议,但根据您所描述的模型,我至少会建议您查看其他可以解决的模型这个问题。例如,Tensorflow带有example CNN,可以在CIFAR-10上达到约86%的准确率,但这种模型更复杂。即使有额外的卷积和完全连接的层,规范化和输入预处理(白化,数据增强等)和调整的超参数,在强大的GPU上仍然需要几个小时的培训才能获得良好的结果。 / p>

无论如何,长话短说,我认为您应该查看示例模型,以了解所需的架构类型。很容易低估识别随机彩色图像中的对象与黑白数字对象的复杂程度。