Tensorflow CNN模型在添加1/2个卷积层时无法学习

Tensorflow CNN模型在添加1/2个卷积层时无法学习,tensorflow,deep-learning,Tensorflow,Deep Learning,我试图在tensorflow中实现图中的模型。我有1000个输出神经元,而不是6个。我这样做是为了预先训练体重 我实现了完整的模型,但只有一个(14,14128)层;只是为了测试等等。现在porgram已经成熟,我实现了另外两层(或一层)。这使得模型没有学到任何东西;损耗是恒定的(在小噪声附近),在随机猜测时,在训练图像上测试的精度是恒定的。在添加层之前,我可以从train数据集中的1000个图像子集中快速(5-10分钟)获得70-80%的精度。如前所述,附加层的情况并非如此 下面是附加层的代码

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

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

下面是附加层的代码,
s1
s2
是conv的步幅:

w2=weight_变量([3,3,64128])
b2=偏差_变量([128])
h2=tf.nn.relu(conv2d_s2(h1_池,w2)+b2)
h2_池=最大_池_2x2(h2)
#启动附加层
w3=权重_变量([3,3128128])
b3=偏差_变量([128])
h3=tf.nn.relu(conv2d_s1(h2_池,w3)+b3)
#末端附加层
w5=重量_变量([3,3128256])
b5=偏差_变量([256])
h5=tf.nn.relu(conv2d_s1(h3,w5)+b5)
h5_池=最大_池2x2(h5)
这个额外的层使模型毫无价值。我尝试过不同的超参数(学习率、批量大小、年代),但没有成功。问题出在哪里

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

如果它有帮助,我使用一个GTX980与一个非常非常好的xeon

可以在中找到存储库

更新

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


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

在模型末尾有一个ReLU层,该层可能会剪切所有梯度,然后是一个softmax,其中包含训练部分的登录。因此,模型可能会陷入局部极小值较差的状态

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

以下是您的代码部分:

模型的最后几行:

#fc1层
W_fc3=重量_变量([512,1000])
b_fc3=偏差变量([1000])
输出=tf.nn.relu(tf.matmul(h_fc2,W_fc3)+b_fc3)
#打印(“输出:{}.format(output.get_shape()))
返回输出
守则的训练部分:

logits=inference\u redmon.inference(图像)
损失=tf.减少平均值(tf.nn.softmax\u交叉熵)(
logits=logits,labels=labels(一)
tf.汇总.标量('损失',损失)
正确的pred=tf.equal(tf.argmax(logits,1),tf.argmax(labels,1))
准确度=tf.reduce_平均值(tf.cast(correct_pred,tf.float32))

您能发布完整的模型代码、培训/优化器代码和参数吗?这里是链接。添加层并不总是能提高性能,因为这样优化问题就更难了,您是否尝试过使用批标准化?我将添加批标准化。我也想辍学。但首先是一些数据扩充。我一次用一种方法丰富这个程序,并伴随着论文阅读、实验、tensorflow等等。。。。我用这个项目来收集一些知识和经验:)谢谢@hars。一定是滑倒了。但我还是不知道为什么它要用更简单的网络?你能详细说明一下(也许编辑你接受的答案)或给我一个链接吗?我想,你的数据集足够小,局部极小值的性能也不错。如果你没有它,你可能会有更好的表现。您可以通过删除1层网络中的relu来测试它。虽然您发现了一个错误,但这并没有解决问题。我在运行程序时出错了。我在
推理\u redmon.inference
中进行了更改,但再次执行了
推理.inference
。抱歉给你添麻烦了。如果你能看到其他东西丢失了,我会很高兴的。干杯。请更新您的github代码。我对您所做的更改和正在运行的脚本感到困惑?另外,请在您的帖子中添加新的丢失/准确性日志作为更新。我在
推断\u redmon.py
中从输出层取出了relu,但执行了
推断.py
。无论如何,通过检查张力板的损耗,而不是终端的损耗,我可以看到发散。通过将学习率降低十倍,发散消失,当然,模型可以训练。感谢您指向正确的方向(两次)。