TensorFlow 2 自定义损失:"No gradients provided for any variable" 错误

TensorFlow 2 custom loss: "No gradients provided for any variable" error

我有一个图像分割问题必须在 TensorFlow 2 中解决。

特别是我有一个由航拍图像及其各自的面具组成的训练集。在面具中,地形为黑色,建筑物为白色。目的是预测测试集中图像的掩码。

我使用带有最终 Conv2DTranspose 的 UNet,带有 1 个过滤器和 sigmoid 激活函数。对最终sigmoid层的输出按如下方式进行预测:如果y_pred>0.5,则为建筑物,否则为背景。

我想实现一个dice loss,所以写了下面的函数

def dice_loss(y_true, y_pred):
    print("[dice_loss] y_pred=",y_pred,"y_true=",y_true)
    y_pred = tf.cast(y_pred > 0.5, tf.float32)
    y_true = tf.cast(y_true, tf.float32)
    numerator = 2 * tf.reduce_sum(y_true * y_pred)
    denominator = tf.reduce_sum(y_true + y_pred)

    return 1 - numerator / denominator

我通过以下方式传递给 TensorFlow:

loss = dice_loss
optimizer = tf.keras.optimizers.Adam(learning_rate=config.learning_rate)
metrics = [my_IoU, 'acc']
model.compile(optimizer=optimizer, loss=loss, metrics=metrics)

但在训练时 TensorFlow 抛出以下错误:

ValueError: No gradients provided for any variable:

问题出在你的损失函数上(很明显)。特别是下面的操作。

y_pred = tf.cast(y_pred > 0.5, tf.float32)

这不是微分运算。这导致梯度为 None。将您的损失函数更改为以下内容,它将起作用。

def dice_loss(y_true, y_pred):
    print("[dice_loss] y_pred=",y_pred,"y_true=",y_true)
    y_true = tf.cast(y_true, tf.float32)
    numerator = 2 * tf.reduce_sum(y_true * y_pred)
    denominator = tf.reduce_sum(y_true + y_pred)

    return 1 - numerator / denominator