gpt4 book ai didi

python - from_logits=True 和 from_logits=False 为 UNet 的 tf.losses.CategoricalCrossentropy 获得不同的训练结果

转载 作者:太空狗 更新时间:2023-10-30 00:08:44 25 4
gpt4 key购买 nike

我正在用 unet 做图像语义分割工作,如果我像这样为最后一层设置 Softmax Activation:

...
conv9 = Conv2D(n_classes, (3,3), padding = 'same')(conv9)
conv10 = (Activation('softmax'))(conv9)
model = Model(inputs, conv10)
return model
...

然后使用 loss = tf.keras.losses.CategoricalCrossentropy(from_logits=False)即使只有一张训练图像,训练也不会收敛

但是如果我没有像这样为最后一层设置 Softmax Activation:

...
conv9 = Conv2D(n_classes, (3,3), padding = 'same')(conv9)
model = Model(inputs, conv9)
return model
...

然后使用 loss = tf.keras.losses.CategoricalCrossentropy(from_logits=True)训练将为一张训练图像收敛

我的 groundtruth 数据集是这样生成的:

X = []
Y = []
im = cv2.imread(impath)
X.append(im)
seg_labels = np.zeros((height, width, n_classes))
for spath in segpaths:
mask = cv2.imread(spath, 0)
seg_labels[:, :, c] += mask
Y.append(seg_labels.reshape(width*height, n_classes))

为什么?我的使用有问题吗?

这是我的git实验代码:https://github.com/honeytidy/unet您可以 checkout 并运行(可以在 cpu 上运行)。你可以更改CategoricalCrossentropy的Activation层和from_logits,看看我说的。

最佳答案

将“softmax”激活插入交叉熵损失层显着简化了损失计算并使其在数值上更加稳定。
可能是这样的情况,在您的示例中,数字问题非常重要,足以使训练过程对 from_logits=False 选项无效。

您可以在 this post 中找到交叉熵损失(“信息增益”损失的特例)的推导。 .这个推导说明了将 softmax 与交叉熵损失相结合时可以避免的数值问题。

关于python - from_logits=True 和 from_logits=False 为 UNet 的 tf.losses.CategoricalCrossentropy 获得不同的训练结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57253841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com