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

时间:2018-03-20 15:41:23

标签: python keras unet semantic-segmentation

我正在尝试在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对应标签组成。 标签是单热编码的,具有形状(512,512,3),即3类。

然后我的问题: 这是建立我的模型的正确方法吗? 或者我应该使用'sigmoid'激活和'binary_crossentropy'?

2 个答案:

答案 0 :(得分:0)

如果您的标签是二进制的,请使用sigmoid激活,如果是通过一个热代码,即您实现的方式,那么softmax应该用作激活

答案 1 :(得分:0)

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