添加一个/两个以上的卷积层时,CNN模型不会学习

时间:2017-06-09 06:33:51

标签: tensorflow deep-learning

我正在尝试在tensorflow中的图片中实现模型。只有6个输出神经元而不是1000个。我这样做是为了预测重量。enter image description here

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

以下是s1s2是转化步幅的附加图层的代码:

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)

这个额外的层使模型毫无价值。我尝试过不同的超参数(学习率,批量大小,时代)但没有成功。这个问题在哪里?

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

如果它有用,我使用一个非常好的至强XX 980。

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

更新

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

橙色是程序完全没有学习的准确性和损失(张量板和终端)。我被终结期间的损失所迷惑。正如@hars所指出的那样,为了检查准确性和损失的日志,我发现在张量板中的损失在第一步中有所不同。通过将学习率从0,01更改为0,001,分歧消失了,正如您在青色中看到的那样,模型正在学习(在1分钟内过度注入了一小部分图像)。enter image description here enter image description here {{3 }}

1 个答案:

答案 0 :(得分:2)

模型末尾有一个ReLU层可能会剪切所有渐变,然后是训练部分中带有logits的softmax。因此,该模型可能会陷入贫困的本地极小。

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

以下是您的部分代码:

最后几行模型:

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))

培训部分代码:

'str'