如果不对模型参数进行保存,当训练结束以后,模型也在内存中被释放,下一轮又需要对模型进行重新训练,有没有一种方法,可以利用之前已经训练好的模型参数值,直接进行模型推理或者继续训练?这里需要引入一个数据之久化的概念,其通用定义就是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称。

OK,在tensorflow中,持久化可以是我们训练好的神经网络权重值和biase值写入到文件中,下一次直接从文件中进行读取,而不需要重新对模型进行训练。

用tensorflow写一个简单的示例:求两个变量v1和v2的和,然后将其保存result变量中,然后将其保存到文件中,下一次训练时直接读取文件。

先看保存程序:

import tensorflow as tf

# 定义两个变量,并对其进行求和
v1 = tf.Variable(tf.constant(value=1.0,dtype=tf.float32,shape=[1],name="v1"))
v2 = tf.Variable(tf.constant(value=2.0,dtype=tf.float32,shape=[1],name="v2"))
result = v1 + v2 # 将求和操作加到result集合中
tf.add_to_collection('result',result) # 新建一个持久化对象
saver = tf.train.Saver() # 运行会话,并持久化模型
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
# 如下操作执行完以后,会在sample_test目录下生成四个文件:
# checkpoint:所有模型文件列表
# model.data-00000-of-00001:
# model-index:
# model.meta:计算图的结构
saver.save(sess=sess,save_path="sample_test/model")

如果要重新加载模型,新的代码可以这么写:

import tensorflow as tf

# 从之前保存的点新建一个持久化对象
saver = tf.train.import_meta_graph(meta_graph_or_file="sample_test/model.meta") with tf.Session() as sess:
# 重新加载保存的参数值
saver.restore(sess=sess,save_path="sample_test/model")
# 注意get_collection返回一个列表,如果直接运行,结果也是一个List,注意比较下面的区别:
print(tf.get_collection(key="result"))
print(sess.run(tf.get_collection(key='result')))
'''
[<tf.Tensor 'add:0' shape=(1,) dtype=float32>]
[array([3.], dtype=float32)]
''' print(tf.get_collection(key="result")[0])
print(sess.run(tf.get_collection(key='result')[0]))
'''
tf.Tensor 'add:0' shape=(1,)
[3.]
'''

进一步,如果我们的网络结构加入了滑动平均模型,重新加载模型时,我们往往是希望用其进行验证,需要使用滑动平均模型参数的值,一个完整的示例如下:

训练时:

# 导入库
import tensorflow as tf # 定义一个变量
v = tf.Variable(initial_value=0,dtype=tf.float32,name='v') # 显示当前有哪些变量
# <tf.Variable 'v:0' shape=() dtype=float32_ref>
for variable in tf.global_variables():
print(variable) # 定义一个滑动平均模型,和变量应用模型的操作
ema = tf.train.ExponentialMovingAverage(0.999)
maintain_average_op = ema.apply(tf.global_variables()) # 显示当前有哪些变量
# <tf.Variable 'v:0' shape=() dtype=float32_ref>
# <tf.Variable 'v/ExponentialMovingAverage:0' shape=() dtype=float32_ref>
for variable in tf.global_variables():
print(variable) saver = tf.train.Saver() # 执行会话,并持久化
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
sess.run(tf.assign(ref=v,value=10))
sess.run(maintain_average_op)
saver.save(sess=sess,save_path="sample_test/model")
print(sess.run([v,ema.average(v)]))

重新加载时:

import tensorflow as tf

v = tf.Variable(0,dtype=tf.float32,name='v')

ema = tf.train.ExponentialMovingAverage(0.999)
saver = tf.train.Saver(ema.variables_to_restore()) # {'v/ExponentialMovingAverage': <tf.Variable 'v:0' shape=() dtype=float32_ref>}
print(ema.variables_to_restore()) with tf.Session() as sess:
saver.restore(sess,save_path="sample_test/model")
# 自动加载滑动平均值来代替变量的值
# 0.009999871
print(sess.run(v))

day-20 tensorflow持久化之入门学习的更多相关文章

  1. 人工智能新手入门学习路线和学习资源合集(含AI综述/python/机器学习/深度学习/tensorflow)

    [说在前面]本人博客新手一枚,象牙塔的老白,职业场的小白.以下内容仅为个人见解,欢迎批评指正,不喜勿喷![握手][握手] 1. 分享个人对于人工智能领域的算法综述:如果你想开始学习算法,不妨先了解人工 ...

  2. TensorFlow.NET机器学习入门【8】采用GPU进行学习

    随着网络越来约复杂,训练难度越来越大,有条件的可以采用GPU进行学习.本文介绍如何在GPU环境下使用TensorFlow.NET. TensorFlow.NET使用GPU非常的简单,代码不用做任何修改 ...

  3. msp430入门学习20

    msp430的USART模式 msp430入门学习

  4. TensorFlow.NET机器学习入门【4】采用神经网络处理分类问题

    上一篇文章我们介绍了通过神经网络来处理一个非线性回归的问题,这次我们将采用神经网络来处理一个多元分类的问题. 这次我们解决这样一个问题:输入一个人的身高和体重的数据,程序判断出这个人的身材状况,一共三 ...

  5. MyBatis入门学习教程-使用MyBatis对表执行CRUD操作

    上一篇MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对use ...

  6. opengl入门学习

    OpenGL入门学习 说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640 ...

  7. MyBatis入门学习(二)

    在MyBatis入门学习(一)中我们完成了对MyBatis简要的介绍以及简单的入门小项目测试,主要完成对一个用户信息的查询.这一节我们主要来简要的介绍MyBatis框架的增删改查操作,加深对该框架的了 ...

  8. OpenGL入门学习(转)

    OpenGL入门学习 http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html 说起编程作图,大概还有很多人想起TC的#includ ...

  9. Bootstrap3.0入门学习系列

    Bootstrap3.0入门学习系列规划[持续更新]   前言 首先在此多谢博友们在前几篇博文当中给与的支持和鼓励,以及在回复中提出的问题.意见和看法. 在此先声明一下,之前在下小菜所有的随笔文章中, ...

随机推荐

  1. DQL-分组查询

    一.语法   select 分组函数,分组后的字段   from 表 [ where 筛选条件]   group by 分组的字段[having 分组后的筛选][order by 排序列表] 例如 S ...

  2. SQL 二

    1.执行DML语句的步骤:在数据库缓冲区缓存中搜索相关的块:将块从数据文件复制到缓冲区:将变更向量写入日志缓冲区:将变更向量应用于数据库缓冲区缓存.2.重做可以保护的段类型:索引段.表段.撤销段.3. ...

  3. 获取DOM

    <template> <div> <header-vue :msg="msg" ref="header">heheh< ...

  4. jQuery树形控件zTree使用小结

    作者:Fonour 字体:[增加 减小] 类型:转载 时间:2016-08-02我要评论 这篇文章主要为大家详细介绍了jQuery树形控件zTree使用方法,zTree树插件的基本使用方法,感兴趣的小 ...

  5. XSS攻击 && CSRF攻击 基础理解

    一个网站,不管多么的帅气,多么的风骚,如果你不安全,那始终都是一个弟弟啊~ 今天又看了下XSS和CSRF攻击的文章,我也想发点什么普及下大家的安全意识,毕竟作为一名拥有伟大梦想的程序员,基本的安全意识 ...

  6. 支付宝PC端的支付(PHP)

    现在的一个项目支付宝PC支付还是用的以前网关:https://mapi.alipay.com/gateway.do  (是支付宝 2012年7月13日的3.3版本) 所以现在要做下支付宝PC支付的升级 ...

  7. 2017Facebook面试题改编“一面砖墙 ”

    题目:一面砖墙 这道题改编自网上Facebook去年的一道面试题,是hihoCoder的1494题(https://hihocoder.com/problemset/problem/1494) 这道题 ...

  8. 如何在VMware Fusion中导入windows下的虚拟机

    最近换了新款的mbp,因为偷懒,便将之前在windows台式机上的虚拟机搬了过来. 特此记录下搬运过程,方便以后查看. 一 操作过程 安装激活VMware 常规操作,无需赘言 拷贝windows下虚拟 ...

  9. java基础之while语句的练习

    计算1-100,7的倍数的数的总和 代码如下: public class Demo1 { public static void main(String[] args) { int num=1; int ...

  10. CodeForces 547D Mike and Fish 思维

    题意: 二维平面上给出\(n\)个点,然后对每个点进行染色:红色和蓝色,要求位于同一行或同一列的点中,红色点和蓝色点的个数相差不超过1 分析: 正解是求欧拉路径,在这篇博客中看到一个巧妙的思路: 对于 ...