【问题标题】:What to do when a CNN model suddenly stops learning and returns blank outputs?CNN模型突然停止学习,返回空白输出怎么办?
【发布时间】:2021-03-07 20:38:41
【问题描述】:

我正在使用 TensorFlow 2 和 Keras 训练 3D CNN (U-Net)。我对得到的损失曲线感到非常困惑:

图例:bs=batch_size, eager=在急切模式下执行

模型开始学习得很好,然后在第一个 epoch 的中间它突然停止并且只返回空的分割(模型的预测输出)。在模型训练时,我通过将图像/预测保存到磁盘来进行检查。从 ~15k 开始(红色曲线,~5k 绿色),只有空白输出(全为零,始终如一)。图像和真实的分割(掩码)看起来还不错,即使在模型行为发生变化之后也是如此。

损失函数是加权交叉熵,我单独查了一下:

def weighted_cross_entropy(weight_alpha=0.9):
    def _loss(y_true, y_pred):
        y_true = K.cast(y_true, y_pred.dtype)
        weights = y_true * (weight_alpha/(1.-weight_alpha)) + 1.
        bce = K.binary_crossentropy(y_true, y_pred, from_logits=False)
        weighted_loss = K.mean(bce * weights)
        return weighted_loss
    return _loss

优化器是tf.keras.optimizers.Adam(learning_rate=1e-4)

数据集来自tfrecords,是一个tf.Dataset:

ds = tf.data.TFRecordDataset(tfrecords)
ds = ds.map(load_image_train, num_parallel_calls=tf.data.experimental.AUTOTUNE)
ds = ds.shuffle(100)
ds = ds.batch(batch_size)

有什么想法吗?

【问题讨论】:

    标签: tensorflow keras tensorboard loss-function


    【解决方案1】:

    可能有数百万种可能性导致您的模型执行怪异的事情。

    您可以先尝试将学习率降低到一个非常小的数字。

    如果您的模型没有使用 tensorflow 函数(例如 model.fit)进行训练,则可能会出现实现错误,因为这些函数至少在一个 epoch 内会继续做同样的事情。

    如果没有完整的代码,这个问题是无法回答的,因为你的断裂部分似乎没有问题。请将训练循环和模型架构一起发布。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-23
      • 1970-01-01
      • 2018-09-06
      • 2017-02-18
      相关资源
      最近更新 更多