【问题标题】:How to properly use CategoricalCrossentropy loss for image segmentation in Tensorflow 2.0/Keras?如何在 Tensorflow 2.0/Keras 中正确使用分类交叉熵损失进行图像分割?
【发布时间】:2019-12-31 04:44:19
【问题描述】:

我正在尝试训练 U-Net 导数来进行单类图像分割,但在 Keras 中使用 tf.keras.losses.SparseCategoricalCrossentropy() 和 tf.keras.losses.CategoricalCrossentropy() 函数时遇到问题。哪个更合适,如何正确使用?

如果我尝试使用SpareCategoricalCrossentropy,我会收到错误:

收到一个标签值 1,它超出了 [0, 1) 的有效范围

如果我尝试使用CategoricalCrossentropy,我会得到:

您正在传递一个形状为(3600, 64, 64, 1) 的目标数组,同时用作损失categorical_crossentropy。 categorical_crossentropy 期望目标是形状(样本、类)的二进制矩阵(1 和 0)。如果您的目标是整数类,您可以通过以下方式将它们转换为预期格式:y_binary = tf.keras.utils.to_categorical(y_int)

使用to_categorical 解决我的蒙版与背景分割问题,它会将最后一个维度增加到 2,这不是必需的。我的预测应该是单个“通道”中介于 0 和 1 之间的数字。

模型定义sn-p:

input_x = tf.keras.Input(batch_shape=(batch_size, xsze, ysze, 3), name='input_x') 
predictions = tf.keras.layers.Conv2D(1, [1, 1], activation='linear', name='output_x')(drop11) 

loss = tf.keras.losses.SparseCategoricalCrossentropy()
model.compile(optimizer=tf.keras.optimizers.Adam(),  # Optimizer
              loss=loss, 
              metrics=[tf.keras.metrics.SparseCategoricalAccuracy()]) 

checkpointer = tf.keras.callbacks.ModelCheckpoint(session_name + '_backup.h5', save_best_only=True, monitor = 'acc', verbose = 0)
early_stopper = tf.keras.callbacks.EarlyStopping(monitor='val_loss',patience=5, verbose=1,min_delta=0.005)
history = model.fit(data_train, roi_train,
                    batch_size=batch_size,
                    epochs = 10,
                    validation_data=(data_val, roi_zoom_val),callbacks=[checkpointer,early_stopper]) 

我的roi_train 是一个 numpy 数组,类型为 float32 的 0 和 1。

【问题讨论】:

标签: python tensorflow keras image-segmentation loss-function


【解决方案1】:

由于您只有一个类,并且您希望分割图中的每个值都介于 0 和 1 之间,因此您应该使用sigmoid 作为最后一层的激活,binary_crossentropy 作为损失函数。这是因为对于每个像素,您都面临一个二元决策:该像素属于前景还是背景?

【讨论】:

    猜你喜欢
    • 2017-06-26
    • 2017-08-19
    • 2018-09-12
    • 2020-03-03
    • 1970-01-01
    • 2017-11-11
    • 2020-03-16
    • 2021-07-17
    • 2019-06-05
    相关资源
    最近更新 更多