首页 > 解决方案 > 使用 Deeplabv3+ keras 进行二元语义分割(专为多类语义分割而设计)

问题描述

我是 Keras 的新手,如果这个问题很愚蠢,我很抱歉。

我在这里https://keras.io/examples/vision/deeplabv3_plus/找到了用于执行多类语义分割的 deeplabv3+ 模型。我需要将此代码调整到另一个目的,因为我需要对医学图像执行二进制语义分割。改变从

NUM_CLASSES = 20

到 NUM_CLASSES = 1?

如果我输入 NUM_CLASSES = 2,则会收到关于 logits 和标签之间不匹配的错误。

关于损失函数,代码行是 loss = keras.losses.SparseCategoricalCrossentropy(from_logits=True)

我想把它改成

损失 = keras.losses.BinaryCrossentropy(from_logits=True)

但损失变为负数。我应该添加其他东西吗?

谢谢!

编辑:用于多类语义分割的 deeplabv3+ 在最后一层使用 keras.activations.linear(x)。出于我的目的,我是否应该使用 softmax 而不是 keras.activations.linear(x) 和 BinaryCrossEntropy 并输入 from_logits=False?

标签: pythontensorflowkerasimage-segmentation

解决方案


我解决了这个问题,如果有人需要答案:“......对于二进制分割,最好保持 NUM_CLASS = 1,因为你试图预测一个二进制掩码,它代表背景中的单个类。如果你想预测one-hot-encoded 分割掩码(在当前上下文中,设置 NUM_CLASS = 2),然后才使用 softmax 激活和稀疏分类交叉熵损失,否则使用 sigmoid 激活和二进制交叉熵。”

https://github.com/keras-team/keras-io/issues/648


推荐阅读