【发布时间】: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。
【问题讨论】:
-
如果答案解决了您的问题,请接受点击答案旁边的复选标记 (✔) 将其标记为“已回答” - 请参阅 What should I do when someone answers my question?
标签: python tensorflow keras image-segmentation loss-function