多类语义分割 - 输出激活?

Posted

技术标签:

【中文标题】多类语义分割 - 输出激活?【英文标题】:Multiclass semantic segmentation - output activation? 【发布时间】:2018-08-29 12:27:21 【问题描述】:

我正在 Keras 中尝试多类语义分割。 现在我正在使用 Unet 架构,并且有一个类似的模型(但更深):

inputs = Input(shape=(512,512,3))
# 128

down1 = Conv2D(32, (3, 3), activation='relu', padding='same')(inputs)
down1 = BatchNormalization()(down1)
down1 = Dropout(0.1)(down1)
down1 = Conv2D(32, (3, 3), padding='same', activation='relu')(down1)
down1 = BatchNormalization()(down1)
down1_pool = MaxPooling2D((2, 2))(down1)

center = Conv2D(64, (3, 3), padding='same', activation='relu')(down1_pool)
center = BatchNormalization()(center)
center = Dropout(0.1)(center)
center = Conv2D(64, (3, 3), padding='same', activation='relu')(center)
center = BatchNormalization()(center)
# center
up1 = concatenate([Conv2DTranspose(32, (2, 2), strides=(2, 2), padding='same')(center), down1], axis=3)
up1 = Conv2D(32, (3, 3), padding='same', activation='relu')(up1)
up1 = BatchNormalization()(up1)
up1 = Dropout(0.1)(up1)
up1 = Conv2D(32, (3, 3), padding='same', activation='relu')(up1)
up1 = BatchNormalization()(up1)
# 128

classify = Conv2D(3, (1, 1), activation='softmax')(up1)

model = Model(inputs=inputs, outputs=classify]
model.compile(optimizer=Adam(lr=lr), loss='categorical_crossentropy, metrics=[losses.dice_coeff])

我的数据集由 680k 个图像(512、512、3)和 680k 个相应的标签组成。 标签是 one-hot 编码的,形状为 (512, 512, 3),即 3 个类别。

然后是我的问题: 这是设置我的模型的正确方法吗? 还是应该使用“sigmoid”激活和“binary_crossentropy”?

【问题讨论】:

【参考方案1】:

如果您的标签是二进制的,则使用 sigmoid 激活,并且如果它是通过一个热代码(即您正在实施的方式)以其他方式进行的,则应该使用 softmax 作为激活

【讨论】:

【参考方案2】:

我也有同样的问题。 我没有找到使我的模型收敛的损失函数。 所以我为每个标签使用了 3 个单独的模型。使用骰子损失函数,我对每个标签都有很好的结果。现在我正在检查联合所有 3 个模型预测的方法。 在您的模型中,softmax 是正确的激活,并且由于您的数据是二进制的,因此二进制和分类交叉熵是相同的。

【讨论】:

以上是关于多类语义分割 - 输出激活?的主要内容,如果未能解决你的问题,请参考以下文章

如何为多类语义分割预处理 RGB 分割掩码?

如何使用tensorflow实现多类语义分割

如何实现多类语义分割?

在 RGB 图像上绘制多类语义分割透明覆盖

为啥训练多类语义分割的unet模型中的分类交叉熵损失函数非常高?

keras/tensorflow中语义图像分割的多类加权损失