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 都是二维的。我将它们重塑为单个向量并尝试进行交叉熵。
首先,重塑实际上应该是(对于这个特定问题,它也可以在没有它的情况下运行,但实际上并不是 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)
| 归档时间: |
|
| 查看次数: |
4727 次 |
| 最近记录: |