TensorFlow模型恢复疑问:恢复时需使用训练同款程序吗?
TensorFlow模型恢复:是否需要同款训练程序?
兄弟,我太懂你搜教程搜得一头雾水的感觉了!关于TensorFlow恢复模型要不要用训练时的同款程序,其实答案很明确——不需要完全一致,但得抓住几个核心要点,不然很容易踩坑。
核心原则
恢复模型的关键是匹配模型结构和权重映射,具体来说:
- 你不需要保留训练时的优化器、损失函数、训练循环这些代码,只需要保证恢复时的网络结构(输入输出维度、变量名称/参数数量)和训练时完全一致
- 如果用TensorFlow的SavedModel格式保存整个模型,甚至可以不用手动定义结构,直接加载就能用;如果只保存了权重文件,那必须先搭建好和训练时一样的网络骨架,再加载权重
结合你的线性回归代码示例
我把你的代码补全,分别展示训练时保存和单独恢复的两种常见方式:
1. 训练阶段:保存模型(以SavedModel格式为例)
import numpy as np import tensorflow as tf tf.set_random_seed(777) # 训练数据 x_data = [[73., 80., 75.], [93., 88., 93.], [89., 91., 90.], [96., 98., 100.], [73., 66., 70.]] y_data = [[152.], [185.], [180.], [196.], [142.]] # 定义模型结构 X = tf.placeholder(tf.float32, shape=[None, 3]) Y = tf.placeholder(tf.float32, shape=[None, 1]) W = tf.Variable(tf.random_normal([3, 1]), name='weight') b = tf.Variable(tf.random_normal([1]), name='bias') hypothesis = tf.matmul(X, W) + b cost = tf.reduce_mean(tf.square(hypothesis - Y)) optimizer = tf.train.GradientDescentOptimizer(learning_rate=1e-5) train = optimizer.minimize(cost) # 启动会话训练模型 sess = tf.Session() sess.run(tf.global_variables_initializer()) for step in range(2001): cost_val, hy_val, _ = sess.run([cost, hypothesis, train], feed_dict={X: x_data, Y: y_data}) if step % 100 == 0: print(step, "Cost:", cost_val, "\nPrediction:\n", hy_val) # 保存整个模型到指定路径(包含结构和权重) tf.saved_model.simple_save(sess, "./linear_reg_model", inputs={"X": X}, outputs={"hypothesis": hypothesis}) sess.close()
2. 单独的恢复预测代码(无需训练相关代码)
你可以新建一个完全独立的Python文件来恢复模型,不用包含训练时的损失函数、优化器这些内容:
import tensorflow as tf import numpy as np # 方式1:直接加载SavedModel,无需手动定义结构 sess = tf.Session() # 加载保存的模型(指定标签和路径) loaded_model = tf.saved_model.loader.load(sess, [tf.saved_model.tag_constants.SERVING], "./linear_reg_model") # 从加载的图中获取输入和输出张量 X = sess.graph.get_tensor_by_name("Placeholder:0") hypothesis = sess.graph.get_tensor_by_name("add:0") # 测试预测 test_data = [[80., 85., 82.]] prediction = sess.run(hypothesis, feed_dict={X: test_data}) print(f"预测结果:{prediction}") sess.close() # 方式2:如果之前用tf.train.Saver保存权重文件(比如saver.save(sess, "./model.ckpt")) # 需要先定义和训练时完全一致的模型结构,再加载权重: # X = tf.placeholder(tf.float32, shape=[None, 3]) # W = tf.Variable(tf.random_normal([3, 1]), name='weight') # b = tf.Variable(tf.random_normal([1]), name='bias') # hypothesis = tf.matmul(X, W) + b # # saver = tf.train.Saver() # sess = tf.Session() # saver.restore(sess, "./model.ckpt") # # 之后就可以正常预测了
总结一下
简单来说,模型的网络结构是“骨架”,权重是“血肉”:
- 保存整个模型时,骨架和血肉都存下来了,恢复时直接用就行,不用重复写结构
- 只保存权重时,必须先搭好和训练时一模一样的骨架,才能把权重“装”进去
内容的提问来源于stack exchange,提问作者Aaditya Ura
相关产品推荐
相关产品推荐

