能否在不保存模型的前提下选用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
相关产品推荐
相关产品推荐

