TensorFlow 模型载入方法汇总(小结)

一、TensorFlow常规模型加载方法

保存模型

tf.train.Saver()类,.save(sess, ckpt文件目录)方法

参数名称 功能说明 默认值
var_list Saver中存储变量集合 全局变量集合
reshape 加载时是否恢复变量形状 True
sharded 是否将变量轮循放在所有设备上 True
max_to_keep 保留最近检查点个数 5
restore_sequentially 是否按顺序恢复变量,模型较大时顺序恢复内存消耗小 True

var_list是字典形式{变量名字符串: 变量符号},相对应的restore也根据同样形式的字典将ckpt中的字符串对应的变量加载给程序中的符号。

如果Saver给定了字典作为加载方式,则按照字典来,如:saver = tf.train.Saver({"v/ExponentialMovingAverage":v}),否则每个变量寻找自己的name属性在ckpt中的对应值进行加载。

加载模型

当我们基于checkpoint文件(ckpt)加载参数时,实际上我们使用Saver.restore取代了initializer的初始化

checkpoint文件会记录保存信息,通过它可以定位最新保存的模型:

ckpt = tf.train.get_checkpoint_state('./model/')
print(ckpt.model_checkpoint_path)

.meta文件保存了当前图结构

.index文件保存了当前参数名

.data文件保存了当前参数值

tf.train.import_meta_graph函数给出model.ckpt-n.meta的路径后会加载图结构,并返回saver对象

ckpt = tf.train.get_checkpoint_state('./model/')

tf.train.Saver函数会返回加载默认图的saver对象,saver对象初始化时可以指定变量映射方式,根据名字映射变量(『TensorFlow』滑动平均)

saver = tf.train.Saver({"v/ExponentialMovingAverage":v}) 

saver.restore函数给出model.ckpt-n的路径后会自动寻找参数名-值文件进行加载

saver.restore(sess,'./model/model.ckpt-0')
saver.restore(sess,ckpt.model_checkpoint_path)

1.不加载图结构,只加载参数

由于实际上我们参数保存的都是Variable变量的值,所以其他的参数值(例如batch_size)等,我们在restore时可能希望修改,但是图结构在train时一般就已经确定了,所以我们可以使用tf.Graph().as_default()新建一个默认图(建议使用上下文环境),利用这个新图修改和变量无关的参值大小,从而达到目的。

'''
使用原网络保存的模型加载到自己重新定义的图上
可以使用python变量名加载模型,也可以使用节点名
'''
import AlexNet as Net
import AlexNet_train as train
import random
import tensorflow as tf

IMAGE_PATH = './flower_photos/daisy/5673728_71b8cb57eb.jpg'

with tf.Graph().as_default() as g:

 x = tf.placeholder(tf.float32, [1, train.INPUT_SIZE[0], train.INPUT_SIZE[1], 3])
 y = Net.inference_1(x, N_CLASS=5, train=False)

 with tf.Session() as sess:
  # 程序前面得有 Variable 供 save or restore 才不报错
  # 否则会提示没有可保存的变量
  saver = tf.train.Saver()

  ckpt = tf.train.get_checkpoint_state('./model/')
  img_raw = tf.gfile.FastGFile(IMAGE_PATH, 'rb').read()
  img = sess.run(tf.expand_dims(tf.image.resize_images(
   tf.image.decode_jpeg(img_raw),[224,224],method=random.randint(0,3)),0))

  if ckpt and ckpt.model_checkpoint_path:
   print(ckpt.model_checkpoint_path)
   saver.restore(sess,'./model/model.ckpt-0')
   global_step = ckpt.model_checkpoint_path.split('/')[-1].split('-')[-1]
   res = sess.run(y, feed_dict={x: img})
   print(global_step,sess.run(tf.argmax(res,1)))

2.加载图结构和参数

'''
直接使用使用保存好的图
无需加载python定义的结构,直接使用节点名称加载模型
由于节点形状已经定下来了,所以有不便之处,placeholder定义batch后单张传会报错
现阶段不推荐使用,以后如果理解深入了可能会找到使用方法
'''
import AlexNet_train as train
import random
import tensorflow as tf

IMAGE_PATH = './flower_photos/daisy/5673728_71b8cb57eb.jpg'

ckpt = tf.train.get_checkpoint_state('./model/')       # 通过检查点文件锁定最新的模型
saver = tf.train.import_meta_graph(ckpt.model_checkpoint_path +'.meta') # 载入图结构,保存在.meta文件中

with tf.Session() as sess:
 saver.restore(sess,ckpt.model_checkpoint_path)      # 载入参数,参数保存在两个文件中,不过restore会自己寻找

 img_raw = tf.gfile.FastGFile(IMAGE_PATH, 'rb').read()
 img = sess.run(tf.image.resize_images(
  tf.image.decode_jpeg(img_raw), train.INPUT_SIZE, method=random.randint(0, 3)))
 imgs = []
 for i in range(128):
  imgs.append(img)
 print(sess.run(tf.get_default_graph().get_tensor_by_name('fc3:0'),feed_dict={'Placeholder:0': imgs}))

 '''
 img = sess.run(tf.expand_dims(tf.image.resize_images(
  tf.image.decode_jpeg(img_raw), train.INPUT_SIZE, method=random.randint(0, 3)), 0))
 print(img)
 imgs = []
 for i in range(128):
  imgs.append(img)
 print(sess.run(tf.get_default_graph().get_tensor_by_name('conv1:0'),
     feed_dict={'Placeholder:0':img}))

注意,在所有两种方式中都可以通过调用节点名称使用节点输出张量,节点.name属性返回节点名称。

3.简化版本

# 连同图结构一同加载
ckpt = tf.train.get_checkpoint_state('./model/')
saver = tf.train.import_meta_graph(ckpt.model_checkpoint_path +'.meta')
with tf.Session() as sess:
 saver.restore(sess,ckpt.model_checkpoint_path)

# 只加载数据,不加载图结构,可以在新图中改变batch_size等的值
# 不过需要注意,Saver对象实例化之前需要定义好新的图结构,否则会报错
saver = tf.train.Saver()
with tf.Session() as sess:
 ckpt = tf.train.get_checkpoint_state('./model/')
 saver.restore(sess,ckpt.model_checkpoint_path)

二、TensorFlow二进制模型加载方法

这种加载方法一般是对应网上各大公司已经训练好的网络模型进行修改的工作

# 新建空白图
self.graph = tf.Graph()
# 空白图列为默认图
with self.graph.as_default():
 # 二进制读取模型文件
 with tf.gfile.FastGFile(os.path.join(model_dir,model_name),'rb') as f:
  # 新建GraphDef文件,用于临时载入模型中的图
  graph_def = tf.GraphDef()
  # GraphDef加载模型中的图
  graph_def.ParseFromString(f.read())
  # 在空白图中加载GraphDef中的图
  tf.import_graph_def(graph_def,name='')
  # 在图中获取张量需要使用graph.get_tensor_by_name加张量名
  # 这里的张量可以直接用于session的run方法求值了
  # 补充一个基础知识,形如'conv1'是节点名称,而'conv1:0'是张量名称,表示节点的第一个输出张量
  self.input_tensor = self.graph.get_tensor_by_name(self.input_tensor_name)
  self.layer_tensors = [self.graph.get_tensor_by_name(name + ':0') for name in self.layer_operation_names]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • TensorFlow实现MLP多层感知机模型

    一.多层感知机简介 Softmax回归可以算是多分类问题logistic回归,它和神经网络的最大区别是没有隐含层.理论上只要隐含节点足够多,即时只有一个隐含层的神经网络也可以拟合任意函数,同时隐含层越多,越容易拟合复杂结构.为了拟合复杂函数需要的隐含节点的数目,基本上随着隐含层的数量增多呈指数下降的趋势,也就是说层数越多,神经网络所需要的隐含节点可以越少.层数越深,概念越抽象,需要背诵的知识点就越少.在实际应用中,深层神经网络会遇到许多困难,如过拟合.参数调试.梯度弥散等. 过拟合是机器学习中的

  • TensorFlow入门使用 tf.train.Saver()保存模型

    关于模型保存的一点心得 saver = tf.train.Saver(max_to_keep=3) 在定义 saver 的时候一般会定义最多保存模型的数量,一般来说,如果模型本身很大,我们需要考虑到硬盘大小.如果你需要在当前训练好的模型的基础上进行 fine-tune,那么尽可能多的保存模型,后继 fine-tune 不一定从最好的 ckpt 进行,因为有可能一下子就过拟合了.但是如果保存太多,硬盘也有压力呀.如果只想保留最好的模型,方法就是每次迭代到一定步数就在验证集上计算一次 accurac

  • 利用TensorFlow训练简单的二分类神经网络模型的方法

    利用TensorFlow实现<神经网络与机器学习>一书中4.7模式分类练习 具体问题是将如下图所示双月牙数据集分类. 使用到的工具: python3.5    tensorflow1.2.1   numpy   matplotlib 1.产生双月环数据集 def produceData(r,w,d,num): r1 = r-w/2 r2 = r+w/2 #上半圆 theta1 = np.random.uniform(0, np.pi ,num) X_Col1 = np.random.unifo

  • TensorFlow实现模型评估

    我们需要评估模型预测值来评估训练的好坏. 模型评估是非常重要的,随后的每个模型都有模型评估方式.使用TensorFlow时,需要把模型评估加入到计算图中,然后在模型训练完后调用模型评估. 在训练模型过程中,模型评估能洞察模型算法,给出提示信息来调试.提高或者改变整个模型.但是在模型训练中并不是总需要模型评估,我们将展示如何在回归算法和分类算法中使用它. 训练模型之后,需要定量评估模型的性能如何.在理想情况下,评估模型需要一个训练数据集和测试数据集,有时甚至需要一个验证数据集. 想评估一个模型时就

  • TensorFlow实现Softmax回归模型

    一.概述及完整代码 对MNIST(MixedNational Institute of Standard and Technology database)这个非常简单的机器视觉数据集,Tensorflow为我们进行了方便的封装,可以直接加载MNIST数据成我们期望的格式.本程序使用Softmax Regression训练手写数字识别的分类模型. 先看完整代码: import tensorflow as tf from tensorflow.examples.tutorials.mnist imp

  • 浅谈Tensorflow模型的保存与恢复加载

    近期做了一些反垃圾的工作,除了使用常用的规则匹配过滤等手段,也采用了一些机器学习方法进行分类预测.我们使用TensorFlow进行模型的训练,训练好的模型需要保存,预测阶段我们需要将模型进行加载还原使用,这就涉及TensorFlow模型的保存与恢复加载. 总结一下Tensorflow常用的模型保存方式. 保存checkpoint模型文件(.ckpt) 首先,TensorFlow提供了一个非常方便的api,tf.train.Saver()来保存和还原一个机器学习模型. 模型保存 使用tf.trai

  • TensorFlow模型保存和提取的方法

    一.TensorFlow模型保存和提取方法 1. TensorFlow通过tf.train.Saver类实现神经网络模型的保存和提取.tf.train.Saver对象saver的save方法将TensorFlow模型保存到指定路径中,saver.save(sess,"Model/model.ckpt") ,实际在这个文件目录下会生成4个人文件: checkpoint文件保存了一个录下多有的模型文件列表,model.ckpt.meta保存了TensorFlow计算图的结构信息,model

  • TensorFlow模型保存/载入的两种方法

    TensorFlow 模型保存/载入 我们在上线使用一个算法模型的时候,首先必须将已经训练好的模型保存下来.tensorflow保存模型的方式与sklearn不太一样,sklearn很直接,一个sklearn.externals.joblib的dump与load方法就可以保存与载入使用.而tensorflow由于有graph, operation 这些概念,保存与载入模型稍显麻烦. 一.基本方法 网上搜索tensorflow模型保存,搜到的大多是基本的方法.即 保存 定义变量 使用saver.s

  • 将TensorFlow的模型网络导出为单个文件的方法

    有时候,我们需要将TensorFlow的模型导出为单个文件(同时包含模型架构定义与权重),方便在其他地方使用(如在c++中部署网络).利用tf.train.write_graph()默认情况下只导出了网络的定义(没有权重),而利用tf.train.Saver().save()导出的文件graph_def与权重是分离的,因此需要采用别的方法. 我们知道,graph_def文件中没有包含网络中的Variable值(通常情况存储了权重),但是却包含了constant值,所以如果我们能把Variable

  • python使用tensorflow保存、加载和使用模型的方法

    使用Tensorflow进行深度学习训练的时候,需要对训练好的网络模型和各种参数进行保存,以便在此基础上继续训练或者使用.介绍这方面的博客有很多,我发现写的最好的是这一篇官方英文介绍: http://cv-tricks.com/tensorflow-tutorial/save-restore-tensorflow-models-quick-complete-tutorial/ 我对这篇文章进行了整理和汇总. 首先是模型的保存.直接上代码: #!/usr/bin/env python #-*- c

随机推荐