You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在不保存模型的前提下选用TF Keras训练中损失最低的模型?

不保存模型前提下保留训练中损失最低的Keras模型

当然可以,不需要依赖磁盘保存就能追踪并保留训练过程中损失最低的模型,核心思路是在训练时将最优权重直接存在内存中,训练结束后再加载回模型。

具体实现方法

1. 基于model.fit()的回调方案

如果你用Keras内置的model.fit()训练,可以自定义一个回调类,在每轮训练结束后监控损失,实时更新内存中的最优权重:

import tensorflow as tf
from tensorflow.keras.callbacks import Callback

class TrackBestModel(Callback):
    def __init__(self):
        super().__init__()
        self.best_loss = float('inf')
        self.best_weights = None

    def on_epoch_end(self, epoch, logs=None):
        # 优先用验证集损失判断,避免过拟合训练集
        current_loss = logs.get('val_loss') or logs.get('loss')
        if current_loss < self.best_loss:
            self.best_loss = current_loss
            # 将当前权重存入内存
            self.best_weights = self.model.get_weights()

# 实例化回调并传入训练流程
track_best = TrackBestModel()
model.fit(x_train, y_train, epochs=n, validation_data=(x_val, y_val), callbacks=[track_best])

# 训练结束后加载最优权重
model.set_weights(track_best.best_weights)

2. 自定义训练循环方案

如果用自定义训练逻辑(而非model.fit()),可以直接在循环内监控损失并更新最优权重:

best_loss = float('inf')
best_weights = None
loss_fn = tf.keras.losses.MeanSquaredError()
optimizer = tf.keras.optimizers.Adam()

for epoch in range(n):
    # 训练批次
    for x_batch, y_batch in train_dataset:
        with tf.GradientTape() as tape:
            y_pred = model(x_batch, training=True)
            train_loss = loss_fn(y_batch, y_pred)
        grads = tape.gradient(train_loss, model.trainable_variables)
        optimizer.apply_gradients(zip(grads, model.trainable_variables))
    
    # 计算验证集损失
    val_loss = 0.0
    for x_val_batch, y_val_batch in val_dataset:
        y_val_pred = model(x_val_batch, training=False)
        val_loss += loss_fn(y_val_batch, y_val_pred).numpy()
    val_loss /= len(val_dataset)

    # 更新内存中的最优权重
    if val_loss < best_loss:
        best_loss = val_loss
        best_weights = model.get_weights()

# 加载最优权重
model.set_weights(best_weights)

注意事项

  • 优先用验证集损失筛选最优模型,能有效避免过拟合训练集的情况
  • 这种纯内存方案的缺点是:如果训练过程中程序意外中断,内存中的最优权重会丢失,长周期训练建议结合磁盘保存做双重保障
  • get_weights()和set_weights()是Keras模型的原生方法,权重以numpy数组形式存储,内存占用和模型参数规模成正比

内容的提问来源于stack exchange,提问作者python_interest

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 12:54:57