在张量流中实现两幅图像之间的交叉熵损失

时间:2017-08-27 20:36:31

标签: tensorflow deep-learning

我正在尝试为完全转换网络实现两个图像之间的交叉熵损失。我的训练和输入图像都在0-1范围内。现在,我试图只为一类图像实现这一点。为了说明我说我有不同的橙色图片,但只有橙色图片。我已经构建了我的模型,并且我已经实现了交叉熵损失功能。

def loss_func_entropy(logits,y):
    logits=tf.reshape(logits,[BATCH_SIZE*480*640,1])
    y=tf.reshape(y,[BATCH_SIZE*480*640,1])
    print (logits.get_shape(),y.get_shape())
    return tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits,labels=y,dim=0) )

显然我没有做到这一点,因为我的损失功能不断增加。需要注意的是logits和y都是2D。我将它们重塑为单个载体并尝试进行交叉熵。

1 个答案:

答案 0 :(得分:3)

首先,重塑应该实际上是(对于这个特定的问题它也会没有它,但实际上并不是TF期望看到的模型输出):

logits=tf.reshape(logits,[BATCH_SIZE,480*640])
y=tf.reshape(y,[BATCH_SIZE,480*640])

然后唯一的错误在于TF has a "jungle" of cross-entropy functions。您要查找的是 sigmoid_cross_entropy_with_logits ,而不是softmax。你使用的那个标准化整个图像,所以像素的总和是一个(显然不是这样)。你想要的是将每个像素视为一个单独的“软分类”问题,其标准化强度被认为是概率,这正是sigmoid_cross_entropy_with_logits所做的。换句话说 - 这只是一个带有软目标的多标签分类。

特别是,通过之前的重塑,softmax_cross_entropy_with_logits会表现得更奇怪 - 因为你有一个输出,但仍然应用了softmax,它应该总是产生输出“1”,就像标量 x:

softmax(x) = exp(x) / SUM exp(x) = 1