【发布时间】:2020-05-06 08:45:56
【问题描述】:
我使用 Tensorflow 使用以下函数进行回归
import tensorflow as tf
def ff(*args, **kwargs):
model = tf.keras.models.Sequential()
model.add(tf.keras.Input(shape=[inp_train.shape[-1],]))
for i in range(n_layer):
model.add(tf.keras.layers.Dense(n_unit, activation=act))
model.add(tf.keras.layers.Dense(out_train.shape[1]))
model.compile(optimizer=opt, loss='mae')
early_stop = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=100)
check_point = tf.keras.callbacks.ModelCheckpoint('best_model.h5', monitor='val_loss', save_best_only=True)
model.fit(inp_train, out_train, epochs=n_epoch, batch_size=s_batch, validation_data=(inp_val, out_val), callbacks=[early_stop, check_point], verbose=0)
best_model = tf.keras.models.load_model('best_model.h5')
return model, best_mode
如您所见,我通过check_point 回调保存了最佳模型,并在以后使用它进行预测。问题是这样我必须先将最好的模型保存在磁盘上,然后再从磁盘加载。如果我想并行运行几次,因为每次运行都会创建一个同名文件,所以它不起作用。
那么,如何在变量中分配最佳模型而无需将其保存在磁盘上?
【问题讨论】:
-
编写一个简单的
MetricsCallback类,将model复制到任何你喜欢的地方 -
@pinkspikyhairman 好的。如何在不将其保存到磁盘的情况下获得最佳模型,然后将其加载并复制到我喜欢的任何地方?
-
在答案下方查看我更新的 cmets
-
您正在使用 EarlyStopping 监控 val_loss,因此训练以最佳模型结束。因此,只需删除您的检查点代码行并使用我的自定义回调应该适合您。如果您仍然不相信,请告诉我,我将在我的自定义回调中添加监控 val_loss,但实际上没有任何意义,因为 EarlyStopping 正在这样做。我的解决方案可以满足您的要求,即。不保存模型并存储在“变量”中。
-
@pinkspikyhairman 感谢您的更新。实际上,如果耐心大于 1,EarlyStopping 不会以最佳模型结束。我们仍然可以通过 restore_best_weights=True 恢复最佳模型。但是,这仅在调用 EarlyStopping 时才有效。看看这个:[github.com/keras-team/keras/issues/12511]
标签: python tensorflow callback