2017-08-27 165 views
0

我正试图在两幅图像之间实现交叉熵损失。我的训练和输入图像都在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的。我将它们重新塑造成一个单独的矢量,并尝试做交叉熵。

+0

你是什么意思“在范围内”0,1?间隔是整数间隔还是实际间隔? –

+0

图像的类型为float,最大值为1,最小值为0. –

回答

2

首先,重塑实际上应该是(它将不运行它也为这个特殊的问题,但也算不上什么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之一。你使用的那个标准化整个图像,所以像素之和是1(显然不是真的)。你想要的是将每个像素作为一个单独的“软分类”问题,其中规范化的强度被认为是一个概率,这正是sigmoid_cross_entropy_with_logits所做的。换句话说 - 这只是一个带软目标的多标签分类。

特别是,与以前的重塑,softmax_cross_entropy_with_logits会表现得更加奇怪 - 因为你有一个输出,但仍然适用SOFTMAX,它应该永远产生输出“1”,作为一个 X:

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

谢谢。我现在能够获得递减的损失函数。请你详细说明为什么我应该选择S形交叉熵。如果你能指出理论背后的任何资源,它将是有用的。 –

+0

我在关于交叉熵丛林的链接文章中阐述了很多。这只是关于具有单独帮助功能的设置中的细微差异。对于你的情况,这可以归结为这里描述的内容 - 当目标总和为1(在你的情况 - 所有像素在一起)时,softmax_ *被使用,而sigmoid_ *当目标的每个维度**在[0,1 ](所以**每**像素独立)。 – lejlot

+0

有道理。万分感谢! –