【问题标题】:How to see the loss of the best epoch from early stopping in Keras?怎么看早停在Keras失去了最佳纪元?
【发布时间】:2020-03-16 05:51:06
【问题描述】:

我已经设法在我的 Keras 模型中实现了提前停止,但我不确定如何看待最佳时期的损失。

es = EarlyStopping(monitor='val_out_soft_loss', 
            mode='min',
            restore_best_weights=True, 
            verbose=2, 
            patience=10)

model.fit(tr_x,
          tr_y,
          batch_size=batch_size,
          epochs=epochs,
          verbose=1,
          callbacks=[es],
          validation_data=(val_x, val_y))
loss = model.history.history["val_out_soft_loss"][-1]
return model, loss

我定义损失分数的方式,意味着返回的分数来自最终时期,而不是最佳时期。

例子:

from sklearn.model_selection import train_test_split, KFold
losses = []
models = []
for k in range(2):
    kfold = KFold(5, random_state = 42 + k, shuffle = True)
    for k_fold, (tr_inds, val_inds) in enumerate(kfold.split(train_y)):
        print("-----------")
        print("-----------")
        model, loss = get_model(64, 100)
        models.append(model)
        print(k_fold, loss)
        losses.append(loss)
print("-------")
print(losses)
print(np.mean(losses))

Epoch 23/100
18536/18536 [==============================] - 7s 362us/step - loss: 0.0116 - out_soft_loss: 0.0112 - out_reg_loss: 0.0393 - val_loss: 0.0131 - val_out_soft_loss: 0.0127 - val_out_reg_loss: 0.0381

Epoch 24/100
18536/18536 [==============================] - 7s 356us/step - loss: 0.0116 - out_soft_loss: 0.0112 - out_reg_loss: 0.0388 - val_loss: 0.0132 - val_out_soft_loss: 0.0127 - val_out_reg_loss: 0.0403

Restoring model weights from the end of the best epoch
Epoch 00024: early stopping
0 0.012735568918287754

所以在这个例子中,我希望看到 Epoch 00014(即 0.0124)的损失。

我还有一个单独的问题:如何设置 val_out_soft_loss 分数的小数位?

【问题讨论】:

  • 您想如何访问它?你只想要最小的损失?因为那时你可以编辑这一行:loss = model.history.history["val_out_soft_loss"][-1] 并删除[-1] 并调用np.min(loss)。但我猜这不是你想要的,因为它有点明显。

标签: python tensorflow machine-learning keras neural-network


【解决方案1】:

将 Keras 中的 fit() 调用分配给一个变量,以便您可以跟踪各个时期的指标。

history = model.fit(tr_x, ...

它会返回一个字典,像这样访问它:

loss_hist = history.history['loss']

然后获取min()max() 或任何你想要的。

np.min(loss_hist)

【讨论】:

  • np.min(loss_hist) 将导致找到最佳损失,而不是相应的最佳时期。要找到后者,您可以运行best_epochs = np.argmin(history.history['val_loss']) + 1
  • +1 是将最佳损失的索引转换为您需要的实际 epoch 数(0-based index => 1-based epochs)。请注意,最好在验证损失而不是训练损失上找到最佳时期。
猜你喜欢
  • 1970-01-01
  • 2019-03-23
  • 2016-05-09
  • 2021-01-25
  • 1970-01-01
  • 1970-01-01
  • 2018-10-22
  • 2018-12-01
  • 2020-09-16
相关资源
最近更新 更多