Tensorflow模型保存与加载

1. 基本代码和模型文件介绍

1.1 保存模型

saver = tf.train.Saver(max_to_keep=5)
saver.save(sess, 'model/my_model.ckpt', global_step=epoch)

1.2 模型文件

在这里插入图片描述
checkpoint 最新的模型文件信息
data和index 训练好的权重、偏置等数据
meta 图结构,包括变量、操作、集合等

1.3 加载模型

new_saver = tf.train.import_meta_graph('./Model/my_model.ckpt.meta')
new_saver.restore(sess, tf.train.latest_checkpoint('./Model'))

2. 实例——非线性回归模型

2.1 训练模型并保存

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
# numpy生成20个随机点
x_data = np.linspace(-0.5,0.5,20)[:,np.newaxis]
noise = np.random.normal(0,0.02,x_data.shape)
y_data = np.square(x_data) + noise
# 定义两个placeholder
x = tf.placeholder(tf.float32,[None,1])
y = tf.placeholder(tf.float32,[None,1])

# 神经网络结构:1-30-1
w1 = tf.Variable(tf.random_normal([1,30]))
b1 = tf.Variable(tf.zeros([30]))
wx_plus_b_1 = tf.matmul(x,w1) + b1
l1 = tf.nn.tanh(wx_plus_b_1)

w2 = tf.Variable(tf.random_normal([30,1]))
b2 = tf.Variable(tf.zeros([1]))
wx_plus_b_2 = tf.matmul(l1,w2) + b2
prediction = tf.nn.tanh(wx_plus_b_2)

# 定义两个placeholder
x = tf.placeholder(tf.float32,name='input_x')
y = tf.placeholder(tf.float32,name='input_y')

# 神经网络结构:1-30-1
w1 = tf.Variable(tf.random_normal([1,30]))
b1 = tf.Variable(tf.zeros([30]))
z1 = tf.matmul(x,w1) + b1
a1 = tf.nn.tanh(z1)

w2 = tf.Variable(tf.random_normal([30,1]))
b2 = tf.Variable(tf.zeros([1]))
z2= tf.matmul(a1,w2) + b2
prediction = tf.nn.tanh(z2, name='prediction')

# 二次代价函数
loss = tf.losses.mean_squared_error(y,prediction)
# 使用梯度下降法最小化loss
optimizer = tf.train.GradientDescentOptimizer(0.1)
train_step = optimizer.minimize(loss, name='train_step')
saver = tf.train.Saver(max_to_keep=4)
with tf.Session() as sess:
    # 变量初始化
    sess.run(tf.global_variables_initializer())
    for epoch in range(10):
        for j in range(1000):
            sess.run(train_step,feed_dict={x:x_data,y:y_data})
        saver.save(sess, 'Model/non_linear_model.ckpt', global_step=epoch)
        print('epoch:%d, loss:%f' % (epoch, sess.run(loss,feed_dict={x:x_data,y:y_data})))
    # 获得预测值
    prediction_value = sess.run(prediction,feed_dict={x:x_data})
    # 画图
    plt.scatter(x_data, y_data)
    plt.plot(x_data, prediction_value, 'r-', lw=5)
    plt.show()
======================================== output ========================================
epoch:0, loss:0.305729
epoch:1, loss:0.171138
epoch:2, loss:0.048052
epoch:3, loss:0.007044
epoch:4, loss:0.001280

拟合结果

fig1. 训练5个周期后的拟合结果

模型文件

fig2. 模型文件

  • outputfig1可以看出,经过5个周期的训练后,损失loss=0.001280,拟合效果较好
  • fig2可以看出,虽然生成了10个(套)模型文件,但是只保留了其中4个,因为指定过最多保存4个。编号6、7、8、9则是之前定义的epoch
  • 注意:对于可能需要加载的tensorop最好先设置好name

2.2 加载模型并预测、继续训练

x_da = np.linspace(-0.5,0.5,20)[:,np.newaxis]
noise = np.random.normal(0,0.02,x_da.shape)
y_da = np.square(x_da) + noise
with tf.Session() as sess:
    meta = tf.train.import_meta_graph('./Model/non_linear_model.ckpt-9.meta')
    meta.restore(sess, './Model/non_linear_model.ckpt-9')
    graph = tf.get_default_graph()
    x = graph.get_tensor_by_name('input_x:0')
    y = graph.get_tensor_by_name('input_y:0')
    prediction = graph.get_tensor_by_name('prediction:0')
    loss = tf.losses.mean_squared_error(y,prediction)
    train_step = graph.get_operation_by_name('train_step')
    for epoch in range(10):
        for j in range(100):
            sess.run(train_step,feed_dict={x:x_da, y:y_da})
        print(sess.run(loss,feed_dict={x:x_da,y:y_da}))
    # 获得预测值
    prediction_value = sess.run(prediction,feed_dict={x:x_da})
    # 画图
    plt.scatter(x_da, y_da)
    plt.plot(x_da, prediction_value, 'r-', lw=5)
    plt.show()
======================================== output ========================================
epoch:0, loss:0.052003
epoch:1, loss:0.039929
epoch:2, loss:0.033029
epoch:3, loss:0.007565
epoch:4, loss:0.002487
epoch:5, loss:0.001337
epoch:6, loss:0.000974
epoch:7, loss:0.000806
epoch:8, loss:0.000706
epoch:9, loss:0.000642

第二次拟合

fig3. 再次训练10个周期后的拟合结果

  • outputfig3可以看出,最开始的loss就较小,这就是因为模型已经有过5个周期的预训练了,事实上如果预训练10个周期,这里最开始的loss约为0.0004,效果更加明显。另外可以看到,拟合效果有了进一步提升。
  • 注意点:
  1. 以下3行代码是固定的,前两行是读取模型文件,第3行是获取当前默认的计算图,因为张量和运算都是在图上的,所以这一步不可少。
    meta = tf.train.import_meta_graph('./Model/non_linear_model.ckpt-9.meta')
    meta.restore(sess, './Model/non_linear_model.ckpt-9')
    graph = tf.get_default_graph()
    
  2. 要分清楚tensorop的概念, 两者的引用方式也不一样,比如在上面的代码中:
    • 引用tensorx = graph.get_tensor_by_name('input_x:0'),后面的:0是系统保存tensor时自动加上去的,op不会加。
    • 引用optrain_step = graph.get_operation_by_name('train_step')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TensorFlow是一个强大的机器学习库,可以用于构建和训练各种深度学习模型。在训练完一个模型后,我们通常会将模型保存到磁盘上以备将来使用。TensorFlow提供了一种简单的方法来保存加载模型。 在 TensorFlow 中,我们可以使用 `tf.saved_model` API 将模型保存到一个文件夹中。该文件夹包含了模型的图和变量等信息。保存模型时,我们可以指定要保存的内容,例如只保存变量或只保存图等等。 以下是一个保存加载模型的示例: ```python import tensorflow as tf from tensorflow import keras # 构建一个简单的模型 model = keras.Sequential([ keras.layers.Dense(64, activation='relu', input_shape=(784,)), keras.layers.Dense(10, activation='softmax') ]) # 训练模型 model.compile(optimizer=tf.train.AdamOptimizer(), loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train, epochs=5) # 保存模型 export_path = './saved_model' tf.saved_model.simple_save( keras.backend.get_session(), export_path, inputs={'input_image': model.input}, outputs={t.name: t for t in model.outputs}) # 加载模型 with tf.Session(graph=tf.Graph()) as sess: tf.saved_model.loader.load(sess, [tf.saved_model.tag_constants.SERVING], export_path) graph = tf.get_default_graph() inputs = graph.get_tensor_by_name('input_image:0') outputs = graph.get_tensor_by_name('dense_1/Softmax:0') result = sess.run(outputs, feed_dict={inputs: x_test}) print(result) ``` 在上面的示例中,我们首先构建了一个简单的神经网络模型并训练了它。然后我们使用 `tf.saved_model.simple_save` 将模型保存到一个文件夹中。在保存模型时,我们指定了模型的输入和输出。最后,我们使用 `tf.saved_model.loader.load` 方法加载模型并运行它。 值得注意的是,在加载模型时,我们需要使用 `tf.Session` 和 `tf.Graph` 来创建一个新的计算图,并使用 `tf.saved_model.loader.load` 方法从文件夹中加载模型。在加载模型后,我们可以使用 `tf.get_default_graph` 方法获取默认的计算图,并使用 `graph.get_tensor_by_name` 方法获取输入和输出张量的引用。 这就是 TensorFlow保存加载模型的基本方法。当我们需要在生产环境中使用模型时,我们可以使用保存模型轻松地加载和运行它。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值