【问题标题】:EarlyStopping not stop trainingEarlyStopping 不停止训练
【发布时间】:2021-08-04 23:28:26
【问题描述】:

正如标题所示,我正在使用以下 EarlyStopping 定义训练我的 IRV2 网络:

callback = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=3, mode="auto")

但是,当我得到三个相等的 val_loss 值时,训练并没有停止:

history = model.fit(
    X_train_s,
    y_train_categorical,
    steps_per_epoch=steps_per_epoch,
    epochs=epochs,
    batch_size=batch_size,
    validation_data=(X_validation_s, y_validation_categorical),
    callbacks=[callback]
    )

这是我的模型:

def Inception_Resnet_V2_Binary(x_train, batch_size):

    conv_base = InceptionResNetV2(weights='imagenet', include_top=False, input_shape=image_size, pooling="avg")   

    for layer in conv_base.layers:
        layer.trainable = False

    model = models.Sequential()
    model.add(conv_base)
    model.add(layers.Dense(2, activation='softmax'))

    steps_per_epoch = (len(x_train))/ batch_size
    lr_schedule = tf.keras.optimizers.schedules.ExponentialDecay(
    initial_learning_rate=0.0002,
    decay_steps=steps_per_epoch * 2,
    decay_rate=0.7)

    opt = Adam(learning_rate=lr_schedule)

    model.compile(loss="binary_crossentropy", optimizer=opt, metrics = ["accuracy", tf.metrics.AUC()])

    return model

这是训练输出:

Epoch 28/70
151/151 [==============================] - 12s 78ms/step - loss: 0.5149 - accuracy: 0.7398 - auc_1: 0.8339 - val_loss: 0.5217 - val_accuracy: 0.7365 - val_auc_1: 0.8245
Epoch 29/70
151/151 [==============================] - 12s 78ms/step - loss: 0.5127 - accuracy: 0.7441 - auc_1: 0.8354 - val_loss: 0.5216 - val_accuracy: 0.7365 - val_auc_1: 0.8245
Epoch 30/70
151/151 [==============================] - 12s 79ms/step - loss: 0.5144 - accuracy: 0.7384 - auc_1: 0.8321 - val_loss: 0.5216 - val_accuracy: 0.7365 - val_auc_1: 0.8245
Epoch 31/70
151/151 [==============================] - 12s 78ms/step - loss: 0.5152 - accuracy: 0.7402 - auc_1: 0.8332 - val_loss: 0.5216 - val_accuracy: 0.7365 - val_auc_1: 0.8246
Epoch 32/70
151/151 [==============================] - 12s 78ms/step - loss: 0.5143 - accuracy: 0.7410 - auc_1: 0.8347 - val_loss: 0.5216 - val_accuracy: 0.7365 - val_auc_1: 0.8246
Epoch 33/70
151/151 [==============================] - 12s 78ms/step - loss: 0.5124 - accuracy: 0.7404 - auc_1: 0.8352 - val_loss: 0.5216 - val_accuracy: 0.7365 - val_auc_1: 0.8245
Epoch 34/70
151/151 [==============================] - 12s 81ms/step - loss: 0.5106 - accuracy: 0.7441 - auc_1: 0.8363 - val_loss: 0.5216 - val_accuracy: 0.7365 - val_auc_1: 0.8245
Epoch 35/70
151/151 [==============================] - 12s 78ms/step - loss: 0.5129 - accuracy: 0.7389 - auc_1: 0.8342 - val_loss: 0.5215 - val_accuracy: 0.7365 - val_auc_1: 0.8245
Epoch 36/70
151/151 [==============================] - 12s 79ms/step - loss: 0.5122 - accuracy: 0.7400 - auc_1: 0.8341 - val_loss: 0.5215 - val_accuracy: 0.7365 - val_auc_1: 0.8246
Epoch 37/70
151/151 [==============================] - 12s 78ms/step - loss: 0.5160 - accuracy: 0.7424 - auc_1: 0.8346 - val_loss: 0.5215 - val_accuracy: 0.7365 - val_auc_1: 0.8246
Epoch 38/70
151/151 [==============================] - 12s 78ms/step - loss: 0.5175 - accuracy: 0.7367 - auc_1: 0.8318 - val_loss: 0.5215 - val_accuracy: 0.7365 - val_auc_1: 0.8246

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    发生这种情况是因为损失实际上正在减少,但值非常低。如果在 early stop 回调中没有设置 min_delta,训练会将微不足道的提升视为实际提升。只需添加 min_delta 参数=0.001 即可解决问题:

    tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=3, mode="auto", min_delta=0.001)
    

    您可以根据自己的需要设置 min_delta。 min_delta=0.001 会将小于该值的损失变化视为没有改善

    【讨论】:

      【解决方案2】:

      那个 val_loss 它不是 4 个十进制数字的浮点数,你没有看到整个值,应该耐心地防止网络过度拟合运行几个小时,如果 val_loss 不断降低自己,让网络运行(并且从损失来看,学习率似乎有点高)。

      Val_loss 是一个 float32,这 4 个值只是最重要的 4 个值,要查看真正发生的情况,您不能依赖 fit 输出,您需要某种回调,以使用格式打印 val_loss你想要的。

      你可以在这里找到一些例子:

      https://keras.io/guides/writing_your_own_callbacks/

      【讨论】:

      • 我添加了我使用的模型的定义。
      • 使用衰减和像adam这样的自适应优化器的必要性是值得商榷的,当我开始弄乱NN时,我犯的一个错误是用衰减代替对学习率的微调,从来没有很好地结束我的实验
      猜你喜欢
      • 2020-03-13
      • 2016-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-17
      • 2017-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多