【问题标题】:The CNN model does not learn when adding one/two more convolutional layers增加一/两个卷积层时 CNN 模型不学习
【发布时间】:2017-11-11 01:28:17
【问题描述】:

我正在尝试在tensorflow中实现图中的模型。我有 1000 个而不是 6 个输出神经元。我这样做是为了获得预训练的权重。

我实现了完整的模型,但只有一个 (14,14,128) 层;只是为了测试等等。现在 porgram 已经成熟,我实现了另外两层(或一层)。这使得模型没有学到任何东西;损失是恒定的(围绕一个小噪声),并且在训练图像上测试的准确度在随机猜测时是恒定的。在添加层之前,我可以非常快(5-10 分钟)在训练数据集中的 1000 个图像子集中达到 70-80% 的准确度。如前所述,附加层并非如此。

这是附加层的代码,其中s1s2 是conv 的步幅:

w2 = weight_variable([3,3,64,128])
b2 = bias_variable([128])
h2 = tf.nn.relu(conv2d_s2(h1_pool,w2)+b2)
h2_pool = max_pool_2x2(h2)

#Starts additional layer
w3 = weight_variable([3,3,128,128])
b3 = bias_variable([128])
h3 = tf.nn.relu(conv2d_s1(h2_pool,w3)+b3)
#Ends additional layer

w5 = weight_variable([3,3,128,256])
b5 = bias_variable([256])
h5 = tf.nn.relu(conv2d_s1(h3,w5)+b5)
h5_pool = max_pool_2x2(h5)

这个额外的层使模型一文不值。我尝试了不同的超参数(学习率、批量大小、时期)但没有成功。问题出在哪里?

另一个问题可能是:是否有人知道这种规模的小型(和/或更好)网络,以便我可以改进和测试。我的目标是检测不同物体(物体图像)中的抓取位置?

如果有帮助,我会使用一台 GTX 980 和非常好的至强。

可以在https://github.com/tnikolla/grasp-detection 中找到存储库。

更新

问题是损失的分歧。通过降低学习率解决

橙色是程序完全没有学习时的准确性和损失(张量板和终端)。我被终端显示的损失愚弄了。正如@hars 所指出的那样检查准确性和损失的日志,我发现张量板中的损失在第一步中是不同的。通过将学习率从 0,01 更改为 0,001,分歧消失了,正如您在青色中看到的那样,模型正在学习(在 1 分钟内过度拟合了一小部分图像)。

【问题讨论】:

  • 您能发布您的完整模型代码和训练/优化器代码和参数吗?
  • 这里是github 链接。
  • 添加层并不总能提高性能,因为优化问题更难,您是否尝试过使用 Batch Normalization?
  • 我将添加批量标准化。我也想辍学。但首先是一些数据增强。我一次只用一种方法来丰富程序,并伴随着论文阅读、实验、张量流……我正在使用这个项目来收集一些知识和经验:)

标签: tensorflow deep-learning


【解决方案1】:

您在模型末尾有一个 ReLU 层,它可能会裁剪所有梯度,然后是训练部分中带有 logits 的 softmax。因此,模型可能会陷入糟糕的局部最小值。

尝试在推理的最后一行删除 tf.nn.relu,看看它是否训练良好。

这是你的部分代码:

模型的最后几行:

# fc1 layer
W_fc3 = weight_variable([512, 1000])
b_fc3 = bias_variable([1000])
output = tf.nn.relu(tf.matmul(h_fc2, W_fc3) + b_fc3)
#print("output: {}".format(output.get_shape()))

return output

训练部分代码:

logits = inference_redmon.inference(images)
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(
        logits=logits, labels=labels_one))        
tf.summary.scalar('loss', loss)
correct_pred = tf.equal( tf.argmax(logits,1), tf.argmax(labels_one,1))
accuracy = tf.reduce_mean( tf.cast( correct_pred, tf.float32))

【讨论】:

  • 谢谢@hars。应该是滑倒了。但我仍然不知道为什么它与更简单的网络一起工作?你能详细说明一下(也许编辑你接受的答案)或给我一个链接吗?
  • 我猜,您的数据集足够小,并且局部最小值获得了不错的性能。如果没有它,您可能会获得更好的性能。可以通过去掉 1 层网络中的 relu 来测试。
  • 虽然您发现了一个错误,但这并没有解决问题。我在运行程序时出错。我在inference_redmon.inference 中进行了更改,但再次执行了inference.inference。抱歉,添麻烦了。如果你能看到一些其他的东西不见了,我会很感激的。干杯。
  • 请您更新您的 github 代码。我对您所做的更改以及您正在运行的脚本感到困惑?另外,请将新的损失/准确性日志作为更新添加到您的帖子中。
  • 我从inference_redmon.py的输出层取出了relu,但执行了inference.py。无论如何,通过检查张量板而不是终端的损失,我可以看到分歧。通过将学习率降低十倍,分歧消失了,当然可以训练模型。感谢您指出正确的方向(两次)。
猜你喜欢
  • 2020-09-17
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
  • 1970-01-01
  • 2017-06-17
  • 2017-01-12
相关资源
最近更新 更多