如何从Keras的早停模型中查看最佳时期的损失?

5

我成功地将早期停止功能应用到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)。但我猜想这不是你想要的,因为这有点显而易见。 - Nicolas Gervais
1个回答

8

将Keras中的fit()函数赋值给一个变量,以便您可以跟踪每个周期的指标。

history = model.fit(tr_x, ...

它将返回一个字典,可以像这样访问它:
loss_hist = history.history['loss']

使用min()获取最小损失,使用argmin()获取最佳epoch(从0开始计数)。

np.min(loss_hist)
np.argmin(loss_hist)

3
np.min(loss_hist)将得到最佳损失而不是对应的最佳时期。要找到后者,可以运行best_epochs = np.argmin(history.history['val_loss']) + 1 - Sander Vanden Hautte
+1 的作用是将最佳损失的索引转换为实际所需的时期数(基于0的索引 => 基于1的时期数)。请注意,最好在验证损失而不是训练损失上找到最佳时期数。 - Sander Vanden Hautte
@SanderVandenHautte 我们只是以这种方式获得索引吗?我们如何在该索引处获取实际的模型权重? - Yan Yang
1
嗨@YanYang,如果你指定restore_best_weights=True,keras会保存在最佳时期发现的权重,可以参考问题中提到的代码。配置好后,在训练完成并找到最佳时期后,您可以从模型对象中检索权重:model.get_weights(),请参见https://keras.io/api/models/model_saving_apis/#get_weights-method。祝你好运! - Sander Vanden Hautte

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接