TensorFlow训练中如何按指定epoch间隔保存模型并自定义存储目录
常见问题解答
末尾现有model.save命令的生效性问题
你目前写在代码末尾的保存逻辑存在两个高频踩坑点,很可能导致保存失败:
- Windows路径里的反斜杠
\在Python字符串中是转义标识,直接写'C:\Users\Omar\Desktop\trainedmodel.h5'时,\U``\D这类组合会被解析成非法转义序列,导致路径无效。正确写法可以三选一:用原始字符串r'C:\Users\Omar\Desktop\trainedmodel.h5'、把反斜杠替换为正斜杠'C:/Users/Omar/Desktop/trainedmodel.h5'、双写反斜杠'C:\\Users\\Omar\\Desktop\\trainedmodel.h5'。 - 只要路径修正无误,这个保存命令在训练全流程跑完后是可以正常触发的,缺点是完全依赖训练全流程不中断,一旦中途训练报错、手动终止,之前训练的权重会全部丢失,也拿不到中间阶段的模型快照。
按固定epoch间隔保存、自定义保存路径的实现方案
不需要手动修改训练循环的内部逻辑,直接用TensorFlow内置的ModelCheckpoint回调即可实现自动保存,这个逻辑只需要在调用fit/fit_generator前配置好,传入训练参数就能生效:
- 自定义保存文件夹路径
不需要手动在资源管理器里新建文件夹,直接用代码指定路径、自动创建目录即可,路径同样要遵循上面提到的Windows路径写法规则,避免转义错误。 - 配置间隔保存规则
给ModelCheckpoint设置带epoch占位符的文件路径模板,让每个阶段保存的模型自动带上当前epoch编号,避免互相覆盖;再设置间隔参数,定义每隔多少个epoch触发一次保存,不需要写额外的判断逻辑。
整合后的完整可运行代码
import os from tensorflow.keras.callbacks import ModelCheckpoint model.compile(optimizer='Adam',loss='categorical_crossentropy',metrics=['accuracy']) # Adam optimizer # loss function will be categorical cross entropy # evaluation metric will be accuracy # ---- 新增:自定义模型保存路径 + 间隔保存回调配置 ---- # 自定义模型保存的根目录路径 custom_model_save_dir = r'C:\Users\Omar\Desktop\image_training_model_snapshots' # 自动创建目标文件夹,存在则跳过,不会报目录不存在的错误 os.makedirs(custom_model_save_dir, exist_ok=True) # 配置按epoch间隔保存的回调 interval_save_callback = ModelCheckpoint( # 保存路径带epoch占位符,每个模型文件自动携带对应的训练轮次 filepath=os.path.join(custom_model_save_dir, 'model_epoch_{epoch:02d}.h5'), # 设置每2个epoch保存一次,可根据需求调整为任意整数 period=2, # 关闭“仅保存最优模型”逻辑,严格按固定间隔保存所有阶段的模型 save_best_only=False ) # ---- 新增逻辑结束 ---- step_size_train=train_generator.n//train_generator.batch_size model.fit_generator(generator=train_generator, steps_per_epoch=step_size_train, epochs=15, # 将配置好的回调传入训练流程,自动在对应epoch触发保存 callbacks=[interval_save_callback]) # 保留全量训练完成后的最终模型保存,路径指向自定义文件夹 model.save(os.path.join(custom_model_save_dir, 'final_trained_model.h5'))
效果说明
按照上面的配置,训练15个epoch的过程中,会自动在你指定的文件夹内依次保存epoch=2、4、6…14的阶段模型,每完成2个epoch就会触发一次保存,就算训练中途意外中断,已经完成的epoch对应的模型也不会丢失,不需要等全量训练结束才拿到所有模型快照。
补充说明:
fit_generator是TensorFlow 2.x中已经弃用的旧API,后续可以替换为功能完全一致的model.fit方法,传入的训练参数、回调参数都不需要修改。
内容的提问来源于stack exchange,提问作者Omar Inuwa
相关产品推荐
相关产品推荐

