TensorFlow语义分割出现零损失

3
我正在训练一个模型来从图像中分割机器打印文本。这些图像可能还包含条形码和手写文本。地面真实图像被处理过,0表示机器打印,1表示其他部分。我使用5层CNN与扩张(dilation)输出两个映射。我的损失计算如下:
def loss(logits, labels):

    logits = tf.reshape(logits, [-1, 2])
    labels = tf.reshape(labels, [-1])

    cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=labels)
    cross_entropy_mean = tf.reduce_mean(cross_entropy, name='cross_entropy')

我有一些只包含手写文本的图像,它们对应的标准答案是空白页,用1表示。
在训练模型时,对于这些图像,我得到了0的损失和100%的训练精度。这正确吗?为什么损失可以为零? 对于其他包含条形码或机器打印的图像,我得到了一些损失,并且它们正在逐渐收敛。
当我测试这个模型时,条形码被正确忽略。但它会输出机器打印和手写文本,而我只需要机器打印。
请问有人能指导我错在哪里吗?
更新1:
之前我使用的学习率是0.01,将其更改为0.0001后,我得到了一些损失,它似乎收敛了,但不是很好。 但是,高学习率如何会给出0的损失?
当我在Caffe中使用相同的模型和学习率0.01时,与Tensorflow相比,它给出了一些损失并且收敛良好。

你的logits和labels是否进行了one-hot编码? - marcopah
@marcopah 是的。我认为我在问题描述中的损失函数的前两行就是这样做的。我的logits形状为[batch_size,num_classes],标签形状为[batch_size],正如tensorflow文档中推荐的那样。 - Aravindh Kuppusamy
我遇到了同样的问题。你解决了吗? - Tahlil
1个回答

1
您的损失计算看起来没问题,但是零损失在您的情况下很奇怪。您尝试过调整学习率吗?也许可以降低它。我遇到过奇怪的损失值,降低学习率有所帮助。

虽然这可能是有用的反馈,但我认为将其作为评论而不是答案更有意义。 - Max von Hippel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接