【问题标题】:Best model weights in neural network in case of early stopping在提前停止的情况下,神经网络中的最佳模型权重
【发布时间】:2020-05-03 20:55:34
【问题描述】:

我正在使用以下代码训练模型

model=Sequential()
model.add(Dense(100, activation='relu',input_shape=(n_cols,)))
model.add(Dense(100, activation='relu'))
model.add(Dense(2,activation='softmax'))
model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])
early_stopping_monitor = EarlyStopping(patience=3)
model.fit(X_train_np,target,validation_split=0.3, epochs=100, callbacks=[early_stopping_monitor])

这是为了在 val_loss: 参数在 3 个 epoch 后没有改善时停止训练。结果如下所示。我的问题是模型会以第 8 或第 7 轮的权重停止。因为第 8 轮的性能变差了,所以它停止了。但是该模型以一个糟糕的性能参数前进了 1 个 epoch,因为之前的一个(epoch 7)更好。我现在需要用 7 个 epoch 重新训练模型吗?

Train on 623 samples, validate on 268 samples
Epoch 1/100
623/623 [==============================] - 1s 1ms/step - loss: 4.0365 - accuracy: 0.5923 - val_loss: 1.2208 - val_accuracy: 0.6231
Epoch 2/100
623/623 [==============================] - 0s 114us/step - loss: 1.4412 - accuracy: 0.6356 - val_loss: 0.7193 - val_accuracy: 0.7015
Epoch 3/100
623/623 [==============================] - 0s 103us/step - loss: 1.4335 - accuracy: 0.6260 - val_loss: 1.3778 - val_accuracy: 0.7201
Epoch 4/100
623/623 [==============================] - 0s 106us/step - loss: 3.5732 - accuracy: 0.6324 - val_loss: 2.7310 - val_accuracy: 0.6194
Epoch 5/100
623/623 [==============================] - 0s 111us/step - loss: 1.3116 - accuracy: 0.6372 - val_loss: 0.5952 - val_accuracy: 0.7351
Epoch 6/100
623/623 [==============================] - 0s 98us/step - loss: 0.9357 - accuracy: 0.6645 - val_loss: 0.8047 - val_accuracy: 0.6828
Epoch 7/100
623/623 [==============================] - 0s 105us/step - loss: 0.7671 - accuracy: 0.6934 - val_loss: 0.9918 - val_accuracy: 0.6679
Epoch 8/100
623/623 [==============================] - 0s 126us/step - loss: 2.2968 - accuracy: 0.6629 - val_loss: 1.7789 - val_accuracy: 0.7425

【问题讨论】:

    标签: keras neural-network early-stopping


    【解决方案1】:

    使用 restore_best_weights 并将 monitor 值设置为目标数量。所以,最好的权重会在训练后自动恢复。

    early_stopping_monitor = EarlyStopping(patience=3, 
                                           monitor='val_loss',  # assuming it's val_loss
                                           restore_best_weights=True )
    

    来自文档:

    restore_best_weights:是否从监测量的最佳值的epoch恢复模型权重(此处为'val_loss')。如果False,则使用最后一步训练得到的模型权重(默认False)。

    Docmentation link

    【讨论】:

    • 这不适用于主题。但是您可能希望在训练期间使用ModelCheckpoint 来节省权重。另外,训练曲线很不稳定,所以检查学习率值等。
    • 谢谢,这很有帮助:) 我会接受你的建议,你在结果中观察到什么让你说曲线不稳定?
    • @jyotiska 这些图不会逐个时代递减:val loss ...0.71, 1.38, 2.73, 0.59...;和 train loss ...1.44, 1.43, 3.57, 1.31 .... 我不知道这是由于数据集相对较小还是由于学习率高(因此模型不能停在局部最小值)。
    【解决方案2】:

    我放置的所有代码都在 TensorFlow 2.0 中

    • 文件路径: 是一个字符串,可以有格式选项,例如纪元数。例如下面是一个常见的文件路径(weights.{epoch:02d}-{val_loss:.2f}.hdf5)
    • 监控器:(通常是“val_loss”或“val_accuracy”)
    • 模式: 是最小化还是最大化监控值 (通常是“最小”或“最大”)
    • save_best_only: 如果设置为 true,那么它只会保存 当前时代的模型,如果是度量值,则优于 以前发生了什么。但是,如果您将 save_best_only 设置为 false 它将在每个 epoch 之后保存每个模型(无论 该模型是否比以前的模型更好)。

    代码

    model=Sequential()
    model.add(Dense(100, activation='relu',input_shape=(n_cols,)))
    model.add(Dense(100, activation='relu'))
    model.add(Dense(2,activation='softmax'))
    model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])
    fname = "weights.{epoch:02d}-{val_loss:.2f}.hdf5"
    checkpoint = tf.keras.callbacks.ModelCheckpoint(fname, monitor="val_loss",mode="min", save_best_only=True, verbose=1) 
    model.fit(X_train_np,target,validation_split=0.3, epochs=100, callbacks=[checkpoint])
    

    【讨论】:

      猜你喜欢
      • 2016-12-04
      • 1970-01-01
      • 2014-03-22
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-21
      • 2015-06-29
      相关资源
      最近更新 更多