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

如何使用SavedModel API定期保存TensorFlow模型?

解决TensorFlow SavedModel定期保存的问题

嘿,我完全懂你遇到的这个困扰——用SavedModel API做训练后的一次性保存没问题,但想中途定期存模型时,builder.save()根本没把最新的变量值存进去,只更新了点元数据对吧?这确实是TF1时代SavedModelBuilder的一个容易踩的坑,我来给你捋清楚怎么解决:

核心原因先搞懂

builder.add_meta_graph_and_variables()是首次初始化保存,它会把变量的初始值、计算图结构、签名等一次性打包进去。但之后你再调用builder.save(),它默认只会更新SavedModel的元数据(比如签名定义),不会同步变量的最新训练值——因为这个API设计上就不是用来做定期checkpoint的。

两种靠谱的定期保存方案

方案1:用tf.saved_model.simple_save()(推荐,TF1.12+支持)

这个API是官方后来推出的简化版,能直接把当前会话的最新变量、计算图和签名打包成SavedModel,不用手动折腾Builder。代码示例如下:

import tensorflow as tf
import time

# 假设你已经构建好计算图,拿到了输入输出张量input_tensor、output_tensor
# 训练循环中定期保存
save_steps = 1000  # 每1000步存一次
total_steps = 10000

with tf.Session() as sess:
    # 初始化变量
    sess.run(tf.global_variables_initializer())
    
    for step in range(total_steps):
        # 执行训练操作
        sess.run(train_op)
        
        if step % save_steps == 0:
            # 用时间戳+步数做版本号,避免覆盖旧模型
            save_dir = f"./my_saved_model/step_{step}_time_{int(time.time())}"
            # 直接保存当前会话的模型状态
            tf.saved_model.simple_save(
                sess,
                save_dir,
                inputs={"input": input_tensor},
                outputs={"output": output_tensor}
            )
            print(f"定期模型已保存到 {save_dir}")

这种方式每次保存都会生成一个独立的目录,包含当前最新的变量值,还能通过目录名快速回溯到某一步的模型状态,非常实用。

方案2:复用SavedModelBuilder(适合需要自定义签名的场景)

如果你必须用SavedModelBuilder来定制签名或其他细节,那每次定期保存时需要重新创建Builder,把当前会话的变量状态重新打包:

import tensorflow as tf
import time

def save_periodic_model(sess, input_tensor, output_tensor, step):
    save_dir = f"./my_saved_model/periodic_step_{step}"
    builder = tf.saved_model.builder.SavedModelBuilder(save_dir)
    
    # 定义自定义签名(如果需要)
    signature_def = tf.saved_model.signature_def_utils.predict_signature_def(
        inputs={"input": input_tensor},
        outputs={"output": output_tensor}
    )
    
    # 这里注意:因为变量已经初始化过,所以要设置clear_devices=True,避免设备绑定问题
    builder.add_meta_graph_and_variables(
        sess,
        [tf.saved_model.tag_constants.SERVING],
        signature_def_map={"serving_default": signature_def},
        clear_devices=True
    )
    
    builder.save()
    print(f"第{step}步模型已保存到 {save_dir}")

# 训练流程
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    save_steps = 1000
    total_steps = 10000
    
    for step in range(total_steps):
        sess.run(train_op)
        
        if step % save_steps == 0:
            save_periodic_model(sess, input_tensor, output_tensor, step)

这里的关键是每次定期保存都新建Builder,这样才能把当前会话中变量的最新值重新写入SavedModel,而不是复用第一次保存的初始变量值。

避坑提醒

  • 不要试图在同一个Builder实例上多次调用add_meta_graph_and_variables(),它只能执行一次(会触发变量初始化),第二次调用会报错。
  • 尽量不要覆盖同一个SavedModel目录,用版本化命名(步数、时间戳)保留历史模型,方便训练出问题时回滚。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:08:04