Tensorflow的模型保存和读取tf.train.Saver

本文介绍如何在TensorFlow中保存和恢复模型。通过实例化tf.train.Saver,可在训练过程中保存模型,并在后续训练或测试中恢复。文章提供了一个完整的示例,演示了模型保存与恢复的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

深度学习平台:TensorFlow    

目标:训练网络后想保存训练好的模型,以及在程序中读取以保存的训练好的模型。

简介

首先,保存和恢复都需要实例化一个 tf.train.Saver。

  • saver = tf.train.Saver()

然后,在训练循环中,定期调用 saver.save() 方法,向文件夹中写入包含了当前模型中所有可训练变量的 checkpoint 文件。

  • saver.save(sess, FLAGS.train_dir, global_step=step)

之后,就可以使用 saver.restore() 方法,重载模型的参数,继续训练或用于测试数据。

  • saver.restore(sess, FLAGS.train_dir)

一次 saver.save() 后可以在文件夹中看到新增的四个文件,

实际上每调用一次保存操作会创建后3个数据文件并创建一个检查点(checkpoint)文件,简单理解就是权重等参数被保存到 .ckpt.data 文件中,以字典的形式;图和元数据被保存到 .ckpt.meta 文件中,可以被 tf.train.import_meta_graph 加载到当前默认的图。

 

示例

下面代码是简单的保存和读取模型:(不包括加载图数据)


 
  1. import tensorflow as tf

  2. import numpy as np

  3. import os

  4.  
  5. #用numpy产生数据

  6. x_data = np.linspace(-1,1,300)[:, np.newaxis] #转置

  7. noise = np.random.normal(0,0.05, x_data.shape)

  8. y_data = np.square(x_data)-0.5+noise

  9.  
  10. #输入层

  11. x_ph = tf.placeholder(tf.float32, [None, 1])

  12. y_ph = tf.placeholder(tf.float32, [None, 1])

  13.  
  14. #隐藏层

  15. w1 = tf.Variable(tf.random_normal([1,10]))

  16. b1 = tf.Variable(tf.zeros([1,10])+0.1)

  17. wx_plus_b1 = tf.matmul(x_ph, w1) + b1

  18. hidden = tf.nn.relu(wx_plus_b1)

  19.  
  20. #输出层

  21. w2 = tf.Variable(tf.random_normal([10,1]))

  22. b2 = tf.Variable(tf.zeros([1,1])+0.1)

  23. wx_plus_b2 = tf.matmul(hidden, w2) + b2

  24. y = wx_plus_b2

  25.  
  26. #损失

  27. loss = tf.reduce_mean(tf.reduce_sum(tf.square(y_ph-y),reduction_indices=[1]))

  28. train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

  29.  
  30. #保存模型对象saver

  31. saver = tf.train.Saver()

  32.  
  33. #判断模型保存路径是否存在,不存在就创建

  34. if not os.path.exists('tmp/'):

  35. os.mkdir('tmp/')

  36.  
  37. #初始化

  38. with tf.Session() as sess:

  39. if os.path.exists('tmp/checkpoint'): #判断模型是否存在

  40. saver.restore(sess, 'tmp/model.ckpt') #存在就从模型中恢复变量

  41. else:

  42. init = tf.global_variables_initializer() #不存在就初始化变量

  43. sess.run(init)

  44.  
  45. for i in range(1000):

  46. _,loss_value = sess.run([train_op,loss], feed_dict={x_ph:x_data, y_ph:y_data})

  47. if(i%50==0):

  48. save_path = saver.save(sess, 'tmp/model.ckpt')

  49. print("迭代次数:%d , 训练损失:%s"%(i, loss_value))

注:

  1. saver 的操作必须在 sess 建立后进行。
  2. model.ckpt 必须存在给定文件夹中,'tmp/model.ckpt' 这里至少要有一层文件夹,否则无法保存。
  3. 恢复模型时同保存时一样,是 ‘tmp/model.ckpt’,和那3个文件名都不一样。
<think>好的,我现在需要解决用户的问题:如何在TensorFlow 2.x中同时使用TensorBoard Projector插件并禁用Eager Execution。首先,我得回顾一下TensorFlow 2.x的变化,尤其是关于tf.contrib的移除Eager Execution的默认启用。 用户提到旧版代码使用了tensorflow.contrib.tensorboard.plugins.projector,而TensorFlow 2.x已经移除了tf.contrib,所以需要找到替代方案。根据之前的引用,比如引用[3]引用[5],可能Projector插件现在集成到了TensorBoard中,或者需要其他导入方式。可能需要使用tensorboard.plugins.projector或者通过兼容性模块来引入。 然后,禁用Eager Execution在TensorFlow 2.x中可以通过tf.compat.v1.disable_eager_execution()来实现,但需要注意这个函数必须在任何操作之前调用,否则会报错。所以代码中需要先禁用Eager,再导入其他模块或定义计算图。 接下来,需要处理Projector的API。查看引用[4],用户提到了从tensorflow.contrib.tensorboard.plugins导入projector,但2.x中这个路径不存在了。可能需要改用其他的包,比如从tensorboard.plugins.projector导入,或者使用tf.compat.v1中的兼容性函数。 另外,引用[3]提到了使用Embedding Projector的在线工具,但代码中可能需要将嵌入向量元数据保存到日志目录,然后启动TensorBoard来查看。因此,代码示例需要包含保存嵌入向量的逻辑,配置Projector的参数,并生成相应的文件如metadata.tsv。 可能还需要使用tf.summary.create_file_writer来创建日志文件,然后使用Projector的API配置嵌入层。同时,需要确保在禁用Eager Execution的情况下,使用Session来运行初始化操作,比如保存检查点,因为Projector需要从检查点读取嵌入向量。 现在,综合这些信息,编写代码的大致步骤应该是: 1. 禁用Eager Execution。 2. 导入必要的模块,包括TensorBoard的Projector插件。 3. 定义模型嵌入层。 4. 配置Projector参数,指定嵌入变量元数据路径。 5. 创建日志目录文件写入器。 6. 使用Session运行初始化,保存检查点。 需要注意的坑:在禁用Eager后,必须使用tf.compat.v1.Session来运行初始化操作,并且检查点的保存可能需要手动处理。同时,metadata.tsv文件需要正确生成并放在指定的路径,供Projector读取。 最后,验证代码是否能在TensorFlow 2.x中运行,并启动TensorBoard查看投影结果。如果有错误,可能需要检查导入路径是否正确,以及禁用Eager后的计算图模式是否兼容旧代码。</think>要在TensorFlow 2.x中兼容旧版`tensorflow.contrib`中的Projector插件并禁用Eager Execution,需结合`tf.compat.v1`接口TensorBoard的独立包实现。以下是分步示例: --- ### **1. 兼容性代码实现** ```python import tensorflow as tf from tensorboard.plugins import projector # 新版Projector插件路径 import numpy as np # 禁用Eager Execution(必须放在最前面) tf.compat.v1.disable_eager_execution() # 定义嵌入变量(示例数据) embedding_var = tf.compat.v1.get_variable("embedding", shape=[1000, 128], initializer=tf.random_normal_initializer()) # 创建元数据文件(如标签) metadata_path = "logs/projector/metadata.tsv" with open(metadata_path, 'w') as f: for i in range(1000): f.write(f'label_{i}\n') # 配置Projector参数 config = projector.ProjectorConfig() embedding = config.embeddings.add() embedding.tensor_name = embedding_var.name embedding.metadata_path = metadata_path # 保存配置到日志目录 summary_writer = tf.compat.v1.summary.FileWriter('logs/projector') projector.visualize_embeddings(summary_writer, config) # 初始化变量并保存检查点 with tf.compat.v1.Session() as sess: sess.run(tf.compat.v1.global_variables_initializer()) saver = tf.compat.v1.train.Saver() saver.save(sess, 'logs/projector/model.ckpt', global_step=0) ``` --- ### **2. 关键点说明** 1. **禁用Eager Execution** `tf.compat.v1.disable_eager_execution()`需在代码开头调用,确保后续操作处于计算图模式[^1]。 2. **Projector插件迁移** TensorFlow 2.x将Projector从`tf.contrib`移至独立包`tensorboard.plugins.projector`,需通过`from tensorboard.plugins import projector`导入[^3][^5]。 3. **检查点保存** 在计算图模式下,需手动创建`tf.compat.v1.Session``Saver`对象保存嵌入变量,Projector依赖检查点文件解析嵌入数据[^4]。 4. **元数据文件格式** `metadata.tsv`需与嵌入数据维度匹配,并通过`embedding.metadata_path`指定路径。 --- ### **3. 启动TensorBoard** ```bash tensorboard --logdir=logs/projector ``` 访问`http://localhost:6006`后,在**Projector**标签页中可查看高维向量投影结果[^2][^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值