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

Python 多类语义分割-输出激活?,python,keras,unet,semantic-segmentation,Python,Keras,Unet,Semantic Segmentation,我正在Keras中尝试多类语义切分。 现在我正在使用Unet体系结构,并且有一个与此类似的模型(但更深入): 我的数据集由68000个图像(512、512、3)和68000个相应的标签组成。 标签是一个热编码的,具有形状(512、512、3),即3个类 然后是我的问题: 这是建立我的模型的正确方法吗? 或者我应该使用‘sigmoid’激活和‘binary_crossentropy’?如果您的标签是二进制的,则使用sigmoid激活,如果它是通过一个热代码(即您正在实现的方式)实现的,则应使用so

我正在Keras中尝试多类语义切分。 现在我正在使用Unet体系结构,并且有一个与此类似的模型(但更深入):

我的数据集由68000个图像(512、512、3)和68000个相应的标签组成。 标签是一个热编码的,具有形状(512、512、3),即3个类

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

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

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

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])