tensorflow 基础学习七:模型的持久化

tf.train.Saver类的使用

保存模型:

import tensorflow as tf 

v1=tf.Variable(tf.constant(1.0,shape=[1]),name=‘v1‘)
v2=tf.Variable(tf.constant(2.0,shape=[1]),name=‘v2‘)
result=v1+v2

init_op=tf.global_variables_initializer()
saver=tf.train.Saver()

with tf.Session() as sess:
    sess.run(init_op)
    saver.save(sess,‘log/model.ckpt‘)

加载模型:

import tensorflow as tf 

v1=tf.Variable(tf.constant(1.0,shape=[1]),name=‘v1‘)
v2=tf.Variable(tf.constant(2.0,shape=[1]),name=‘v2‘)
result=v1+v2

saver=tf.train.Saver()

with tf.Session() as sess:
    ckpt = tf.train.get_checkpoint_state(‘log‘)
    if ckpt and ckpt.model_checkpoint_path:
        saver.restore(sess, ckpt.model_checkpoint_path)  

  在加载模型时,也是先定义tensorflow计算图上的所有运算,但不需要运行变量的初始化,因为变量的值可以通过已经保存的模型加载进来。如果不希望重复定义图上的运算,也可以直接加载已经 持久化的图。

加载计算图:

import tensorflow as tf
# 直接加载持久化的图
saver=tf.train.import_meta_graph(‘log/model.ckpt.meta‘)
with tf.Session() as sess:
    saver.restore(sess,‘log/model.ckpt‘)
    # 通过张量的名称来获取张量
    print(sess.run(tf.get_default_graph().get_tensor_by_name(‘add:0‘)))

tf.train.Saver类还支持在保存和加载模型时给变量重命名。

在加载模型时给变量重命名:

import tensorflow as tf
# 这里声明的变量名称和已经保存的模型中变量的名称不同。
v1=tf.Variable(tf.constant(1.0,shape=[1]),name=‘new-v1‘)
v2=tf.Variable(tf.constant(2.0,shape=[1]),name=‘new-v2‘)

# 直接使用tf.train.Saver()加载模型会提示变量找不到的错误# 需要使用一个字典来重命名变量。这个字典指定
# 原来名称为v1的变量现在加载在变量v1中(‘new-v1‘),名称为v2的变量加载到
# 变量v2中(‘new-v2‘)
saver=tf.train.Saver({‘v1‘:v1,‘v2‘:v2})

with tf.Session() as sess:
    saver.restore(sess, ‘log/model.ckpt‘)  

  重命名的好处是可以方便使用变量的滑动平均值。使用变量的滑动平均值可以让神经网络模型更加健壮。在tensorflow中,每一个变量的滑动平均值是通过影子变量维护的,获取变量的滑动平均值实际上就是获取这个影子变量的取值。如果在加载模型时直接将影子变量映射到变量自身,那么在使用训练好的模型时就不需要再调用函数来获取变量的滑动平均值了。这样方便了滑动平均模型的使用。以下代码给出了一个保存滑动平均模型的样例。

import tensorflow as tf 

v=tf.Variable(0,dtype=tf.float32,name=‘v‘)
# 没有声明滑动平均模型时,只有一个变量v,所以下面语句只会输出‘v:0‘
for variables in tf.global_variables():
    print(variables.name)

ema=tf.train.ExponentialMovingAverage(0.99)
maintain_averages_op=ema.apply(tf.global_variables())
# 在声明滑动平均模型后,tensorflow会自动生成一个影子变量
# 下面语句会输出:‘v:0‘和‘v/ExponentialMovingAverage:0‘
for variables in tf.global_variables():
    print(variables.name)

saver=tf.train.Saver()
with tf.Session() as sess:
    init_op=tf.global_variables_initializer()
    sess.run(init_op)
    sess.run(tf.assign(v,10))
    sess.run(maintain_averages_op)
    # 保存时,tensorflow会将‘v:0‘和‘v/ExponentialMovingAverage:0‘两个变量都保存下来
    saver.save(sess,‘log/model.ckpt‘)
    print(sess.run([v,ema.average(v)])) # 输出:[10.0, 0.099999905]

  基于上面的代码,通过变量重命名直接读取变量的滑动平均值。从程序输出可以看出,读取的变量v的值实际上是上面代码中变量v的滑动平均值。通过该方法,就可以使用完全一样的代码来计算滑动平均模型前向传播的结果。

v=tf.Variable(0,dtype=tf.float32,name=‘v‘)
# 通过变量重命名将原来变量v的滑动平均值直接赋值给v
saver=tf.train.Saver({‘v/ExponentialMovingAverage‘:v})
with tf.Session() as sess:
    saver.restore(sess,‘log/model.ckpt‘)
    print(sess.run(v)) # 输出:0.099999905

  为了方便加载时重命名滑动平均变量,tf.train.ExpoentialMovingAverage类提供了variables_to_restore函数来生成tf.train.Saver类所需要的变量重命名字典。示例代码如下:

import tensorflow as tf 

v=tf.Variable(0,dtype=tf.float32,name=‘v‘)
ema=tf.train.ExponentialMovingAverage(0.99)

# 通过使用variables_to_restore函数来直接生成上面代码中提供的字典
# {‘v/ExponentialMovingAverage‘:v}
# 以下代码会输出:
# {‘v/ExponentialMovingAverage‘: <tf.Variable ‘v:0‘ shape=() dtype=float32_ref>}
print(ema.variables_to_restore())

saver=tf.train.Saver(ema.variables_to_restore())
with tf.Session() as sess:
    saver.restore(sess,‘log/model.ckpt‘)
    print(sess.run(v)) # 输出:0.099999905

   

原文地址:https://www.cnblogs.com/hypnus-ly/p/8319571.html

时间: 2024-07-31 17:57:26

tensorflow 基础学习七:模型的持久化的相关文章

tensorflow 基础学习五:MNIST手写数字识别

MNIST数据集介绍: from tensorflow.examples.tutorials.mnist import input_data # 载入MNIST数据集,如果指定地址下没有已经下载好的数据,tensorflow会自动下载数据 mnist=input_data.read_data_sets('.',one_hot=True) # 打印 Training data size:55000. print("Training data size: {}".format(mnist.

tensorflow 基础学习九:mnist卷积神经网络

mnist_inference.py: # -*- coding:utf-8 -*- import tensorflow as tf # 配置神经网络参数 INPUT_NODE=784 OUTPUT_NODE=10 IMAGE_SIZE=28 NUM_CHANNELS=1 NUM_LABELS=10 # 第一层卷积层的尺寸和深度 CONV1_DEEP=32 CONV1_SIZE=5 # 第二层卷积层的尺寸和深度 CONV2_DEEP=64 CONV2_SIZE=5 # 全连接层的节点个数 FC_

深度学习框架-Tensorflow基础学习

Tensorflow简介 1. Tensorflow是一个编程系统,使用图来表示计算任务.使用图来表示计算任务. 图中的节点被称之为 op (operation 的缩写). 一个 op 获得 0 个或多个 Tensor, 执行计算, 产生 0 个或多个 Tensor. 每个 Tensor 是一个类型化的多维数组. TensorFlow 程序通常被组织成一个构建阶段和一个执行阶段. 在构建阶段, op 的执行步骤 被描述成一个图. 在执行阶段, 使用会话执行执行图中的 op. 2. Tensorf

tensorflow 基础学习三:损失函数讲解

交叉熵损失: 给定两个概率分布p和q,通过q来表示p的交叉熵为: 从上述公式可以看出交叉熵函数是不对称的,即H(p,q)不等于H(q,p). 交叉熵刻画的是两个概率分布之间的距离,它表示通过概率分布q来表示概率分布p的困难程度.所以使用交叉熵作为 神经网络的损失函数时,p代表的是正确答案,q代表的是预测值.当两个概率分布越接近时,它们的交叉熵也就越小. 由于神经网络的输出并不是一个概率分布,所以需要先使用softmax将网络输出变成一个概率分布,再计算交叉熵. 比如,原始的神经网络输出为y1,y

tensorflow 基础学习八:重构MNIST神经网络

使用前面介绍的技术,实践一个神经网络模型.将训练和测试分成两个独立的程序,训练网络的程序可以持续输出训练好的模型,测试程序可以每隔一段时间检验最新模型的正确率. # -*- coding:utf-8 -*- import tensorflow as tf # 定义神经网络结构相关的参数 INPUT_NODE=784 OUTPUT_NODE=10 LAYER1_NODE=500 # 通过tf.get_variable函数来获取变量.在训练神经网络时会创建这些变量:在测试时会通过 # 保存的模型加载

SpringMVC基础学习(二)&mdash;模型数据

一.处理模型数据 1.处理模型数据的途径      SpringMVC提供以下几种途径输出模型数据:      (1)ModelAndView: 处理方法返回值类型为ModelAndView,方法体即可通过该对象添加模型数据.      (2)Map及Model: 入参为Map和Model,处理方法返回时,Map中的数据会自动添加到模型中.      (3)@SessionAttributes: 将模型中的某个属性暂存到HttpSession中,以便多个轻轻能共享这个属性.      (4)@M

Redis基础学习(四)&mdash;Redis的持久化

一.概述      Redis的强大性能很大程度上都是因为数据时存在内存中的,然而当Redis重启时,所有存储在内存中的数据将会丢失,所以我们要将内存中的数据持久化. Redis支持两种数据持久化的方式: RDB方式和AOF方式. (1)RDB方式会根据配置的规则定时的将内存中的数据持久化到硬盘上. (2)AOF则是在每次执行写命令之后将命令记录下来.   1.RDB方式      RDB方式的持久化是通过快照的方式完成的.当符合某种规则时,会将内存中的数据全部生成一个副本存储在硬盘上,Redi

tensorflow 基础学习二:实现一个神经网络

tensorflow变量 在tensorflow中,变量(tf.Variable)的作用就是用来保存和更新神经网络中的参数,在声明变量的同时需要指定其初始值. tensorflow中支持的随机数生成器: 函数名称 随机数分布 主要参数 tf.random_normal 正态分布 平均值.标准差.取值类型 tf.truncated_normal 正态分布,但如果随机出来的值偏离平均值超过2个标准差,那么这个数将会被重新随机 平均值.标准差.取值类型 tf.random_uniform 平均分布 最

python基础学习23----IO模型(简)

对于一个网络IO(network IO),它会涉及到两个系统对象,一个是调用这个IO的process (or thread),另一个就是系统内核(kernel).当一个read操作发生时,该操作会经历两个阶段: 1.等待数据准备 2.将数据从系统内核拷贝到进程当中 当收到数据后,这些数据会先存放到系统所用的内存当中,之后在由系统将数据从内核中拷贝到使用的进程当中 不同的IO模型的区别就在于上述的两个阶段 一.阻塞IO  (blocking IO) recvfrom进行系统调用后,等待数据和拷贝数