Yah*_*Nik 2 python save keras tensorflow
如果这个问题看起来很简单,我很抱歉。但是阅读 Keras 保存和恢复帮助页面:
https://www.tensorflow.org/beta/tutorials/keras/save_and_restore_models
我不明白如何在训练期间使用“ModelCheckpoint”进行保存。帮助文件提到它应该提供 3 个文件,我只看到一个,MODEL.ckpt。
这是我的代码:
checkpoint_dir = FolderName + "/tmp/model.ckpt"
cp_callback = k.callbacks.ModelCheckpoint(checkpoint_dir,verbose=1,save_weights_only=True)
parallel_model.compile(optimizer=tf.keras.optimizers.Adam(lr=learning_rate),loss=my_cost_MSE, metrics=['accuracy])
parallel _model.fit(image, annotation, epochs=epoch,
batch_size=batch_size, steps_per_epoch=10,
validation_data=(image_val,annotation_val),validation_steps=num_batch_val,callbacks=callbacks_list)
Run Code Online (Sandbox Code Playgroud)
另外,当我想在训练后加载重量时:
model = k.models.load_model(file_checkpoint)
Run Code Online (Sandbox Code Playgroud)
我收到错误:
"raise ValueError('Unknown ' + printable_module_name + ':' + object_name)
ValueError: Unknown loss function:my_cost_MSE"
Run Code Online (Sandbox Code Playgroud)
my-cost_MSE 是我在训练中使用的成本函数。
首先,看起来您正在使用tf.keras(来自tensorflow)实现而不是keras(来自keras-team/keras repo)。在这种情况下,如tf.keras 指南中所述:
保存模型权重时,tf.keras 默认为检查点格式。传递 save_format='h5' 以使用 HDF5。
另一方面,请注意,添加回调ModelCheckpoint通常大致相当于model.save(...)在每个时期结束时进行调用,因此这就是为什么您应该期望保存三个文件(根据检查点格式)。
它不这样做的原因是,通过使用选项save_weights_only=True,您只节省了权重。大致相当于在每个纪元结束时替换对model.savefor 的调用。model.save_weights因此,唯一被保存的文件是带有权重的文件。
从这里开始,您可以通过两种不同的方式进行操作:
您需要预先加载模型(比如说结构),然后调用而model.load_weights不是keras.models.load_model:
model = MyModel(...) # Your model definition as used in training
model.load_weights(file_checkpoint)
Run Code Online (Sandbox Code Playgroud)
请注意,在这种情况下,您不会遇到自定义定义 ( my_cost_MSE) 的问题,因为您只是加载模型权重。
另一种方法是存储整个模型并相应地加载它:
cp_callback = k.callbacks.ModelCheckpoint(
checkpoint_dir,verbose=1,
save_weights_only=False
)
parallel_model.compile(
optimizer=tf.keras.optimizers.Adam(lr=learning_rate),
loss=my_cost_MSE,
metrics=['accuracy']
)
model.fit(..., callbacks=[cp_callback])
Run Code Online (Sandbox Code Playgroud)
然后你可以通过以下方式加载它:
model = k.models.load_model(file_checkpoint, custom_objects={"my_cost_MSE": my_cost_MSE})
Run Code Online (Sandbox Code Playgroud)
请注意,在后一种情况下,您需要指定custom_objects,因为反序列化模型需要它的定义。
| 归档时间: |
|
| 查看次数: |
5200 次 |
| 最近记录: |