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

Kau*_*kar 2 deep-learning tensorflow

我正在尝试为完全转换网络实现两个图像之间的交叉熵损失。我的训练图像和输入图像都在 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) )
Run Code Online (Sandbox Code Playgroud)

显然我做得不对,因为我的损失函数不断增加。需要注意的是 logits 和 y 都是二维的。我将它们重塑为单个向量并尝试进行交叉熵。

lej*_*lot 5

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

logits=tf.reshape(logits,[BATCH_SIZE,480*640])
y=tf.reshape(y,[BATCH_SIZE,480*640])
Run Code Online (Sandbox Code Playgroud)

那么唯一的错误就在于TF有一个交叉熵函数的“丛林”。您正在寻找的是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
Run Code Online (Sandbox Code Playgroud)