代码错误
您的代码中存在多个错误:
- 您不应
tf.nn.sigmoid_cross_entropy_with_logits
使用softmax层的输出进行调用,而应使用未 缩放的logits进行调用 :
警告:此操作期望未缩放的logit,因为它在内部对logit执行softmax以提高效率。不要使用softmax的输出来调用该操作,因为这会产生错误的结果。
实际上,由于您有2个类,因此应使用softmax的损失,使用
tf.nn.softmax_cross_entropy_with_logits
使用时
tf.argmax(pred, 1)
,仅将argmax应用于轴1,即输出图像的高度。您应该tf.argmax(pred, 3)
在最后一个轴(尺寸为2)上使用。- 这可以解释为什么您获得0.99的准确性
- 在输出图像上,它将使argmax超过图像的高度,默认情况下为0(因为每个通道的所有值均相等)
型号错误
最大的缺点是您的模型通常 很难 优化。
- 您的softmax超过40,000个课程,这是巨大的。
- 您不会完全利用要输出图像的事实(预测前景/背景)。
- 例如,预测2,345与预测2,346和预测2,545高度相关,但是您没有考虑到这一点
我建议先阅读一些有关语义细分的内容:
- 本文:用于语义分割的全卷积网络
- 这些来自CS231n(斯坦福大学)的幻灯片:尤其是有关上采样和去卷积的部分
推荐建议
如果您想使用TensorFlow,则需要从小处着手。首先尝试一个可能包含1个隐藏层的非常简单的网络。
您需要绘制张量的所有形状,以确保它们与您的想法相对应。例如,如果进行了绘制
tf.argmax(y, 1),您将意识到形状
[batch_size,200, 2]不是预期的
[batch_size, 200, 200]。
TensorBoard是您的朋友,您应该尝试在此处绘制输入图像以及预测,以查看它们的外观。
尝试使用10个图像的非常小的数据集进行较小的尝试,看看是否可以过拟合并预测几乎准确的响应。
总而言之,我不确定我的所有建议,但是值得尝试,我希望这对您的成功道路有所帮助!



