系列博客链接:

(一)TensorFlow框架介绍:https://www.cnblogs.com/kongweisi/p/11038395.html

(二)TensorFlow框架之图与TensorBoard:https://www.cnblogs.com/kongweisi/p/11038517.html

(三)TensorFlow框架之会话:https://www.cnblogs.com/kongweisi/p/11038550.html

(四)TensorFlow框架之张量:https://www.cnblogs.com/kongweisi/p/11039237.html

本文概述:

  • 说明变量op的特殊作用
  • 说明变量op的trainable参数的作用
  • 应用global_variables_initializer实现变量op的初始化

1、变量

TensorFlow变量是表示程序处理的共享持久状态的最佳方法。变量通过 tf.Variable OP类以及tf.get_variable()类进行操作。

变量的特点:

  • 存储持久化
  • 可修改值
  • 可指定被训练

1.1 创建变量

  • tf.Variable(initial_value=None, trainable=True, collections=None, name=None)

    • initial_value:初始化的值
    • trainable:是否被训练
    • collections:新变量将添加到列出的图的集合中collections,默认为[GraphKeys.GLOBAL_VARIABLES],如果trainable是True变量也被添加到图形集合 GraphKeys.TRAINABLE_VARIABLES
  1. # 特殊的创建张量OP
    # 1、必须手动初始化
    var = tf.Variable(tf.random_normal([2, 2], mean=0.0, stddev=1.0), name="var", trainable=True)
  2.  
  3. with tf.Session() as sess:
  4. sess.run(var)
  • 变量需要显示初始化,才能运行值
  1. # 添加一个初始化变量的OP
    # 1、变量显示初始化
    init_op = tf.global_variables_initializer()
  2.  
  3. with tf.Session() as sess:
  4. # 2、运行初始化变量的OP
  5. sess.run(init_op)
       # 或者直接这么做 sess.run(tf.global_variables_initializer())

1.2 变量OP的方法

 

给变量赋值一个新的值,返回一个新的变量

  • new_var = assign(value)   原变量变化
  • new_var = assign_add(delta)  原变量不变
  1. var = tf.Variable(tf.random_normal([2, 2], mean=0.0, stddev=1.0), name="var", trainable=True)
    # 给变量赋值一个新的值
    var1 = var.assign([[2, 3], [4, 5]])
  1. # 初始化变量OP
    init_op = tf.global_variables_initializer()
  1. # 给变量在原值的基础上,加上新的值
    va = var.assign_add([[1, 3], [4, 5]])

    with tf.Session() as sess:
  1.   # 运行初始化op
      sess.run(init_op)
      print(sess.run(va))
      print(sess.run(var))

关于变量的被训练,我会在后面的线性回归案例当中介绍

2、命名空间与共享变量

共享变量的主要用途在一些网络当中的参数共享, 由于在TensorFlow当中,只要我们定义的不同OP, 即使name参数指定一样,但实际上也并不是同一个变量。

如果想要达到重复利用变量的效果,我们就要使用tf.variable_scope()结合tf.get_variable()一起使用

2.1 定义一个相同名字的变量

  1. var = tf.Variable(name='var', initial_value=[4], dtype=tf.float32)
  2. var_double = tf.Variable(name='var', initial_value=[4], dtype=tf.float32)
  3.  
  4. <tf.Variable 'var:0' shape=() dtype=float32_ref>
  5. <tf.Variable 'var_1:0' shape=() dtype=float32_ref>

2.2 使用tf.variable_scope()修改OP命名空间

会在OP的名字前面增加命名空间的指定名字

  1. with tf.variable_scope("name"):
  2. var = tf.Variable(name='var', initial_value=[4], dtype=tf.float32)
  3. var_double = tf.Variable(name='var', initial_value=[4], dtype=tf.float32)
  4.  
  5. <tf.Variable 'name/var:0' shape=() dtype=float32_ref>
  6. <tf.Variable 'name/var_1:0' shape=() dtype=float32_ref>

2.2 tf.get_variable共享变量

通过tf.get_variable的初始化与Variable参数一样, 但是要是实现共享需要打开 tf.variable_scope("name")中的reuse = tf.AUTO_REUSE参数

  1. # 打开共享参数
  2. # 或者
  3. # with tf.variable_scope("name") as scope:
  4. # 在需要使用共享变量的前面定义: scope.reuse_variables()
  5. with tf.variable_scope("name", reuse=tf.AUTO_REUSE):
  6. var = tf.Variable(initial_value=4.0, name="var", dtype=tf.float32)
  7. var_double = tf.Variable(initial_value=4.0, name="var", dtype=tf.float32)
  8.  
  9. var1 = tf.get_variable(initializer=tf.random_normal([2, 2], mean=0.0, stddev=1.0),
  10. name="var1",
  11. dtype=tf.float32)
  12. var1_double = tf.get_variable(initializer=tf.random_normal([2, 2], mean=0.0, stddev=1.0),
  13. name="var1",
  14. dtype=tf.float32)
  15.  
  16. with tf.Session() as sess:
  17. sess.run(tf.global_variables_initializer())
  18. print(var1)
  19. print(var1_double)

注意:TensorFlow和python不同, 它是维护一个所有OP名字的列表,不是以取的最前面的名字(自定义的接收结果,python变量)区分。

共享变量就相当于全局变量。

(第一章第五部分)TensorFlow框架之变量OP的更多相关文章

  1. (第一章第二部分)TensorFlow框架之图与TensorBoard

    系列博客链接: (一)TensorFlow框架介绍:https://www.cnblogs.com/kongweisi/p/11038395.html 本文概述: 说明图的基本使用 应用tf.Grap ...

  2. (第二章第二部分)TensorFlow框架之读取图片数据

    系列博客链接: (第二章第一部分)TensorFlow框架之文件读取流程:https://www.cnblogs.com/kongweisi/p/11050302.html 本文概述: 目标 说明图片 ...

  3. NHibernate.3.0.Cookbook第一章第五节Setting up a base entity class

    Setting up a base entity class设置一个实体类的基类 在这节中,我将给你展示怎么样去为我们的实体类设置一个通用的基类. 准备工作 完成前面三节的任务 如何去做 1.在Ent ...

  4. 第一章-第五题(你所在的学校有计算机科学专业和软件工程专业么?相关专业的教学计划和毕业出路有什么不同?阅读有关软件工程和计算机科学的区别的文章,谈谈你的看法。)--By 侯伟婷

    我所在的本科学校和研究生学校都有计算机科学专业和软件工程专业.具体的教学计划无从得到,所以此情况无从对比,但是我从本科教务处网站找到了计算机科学专业和软件工程专业有关专业方面的课程,现列表如下. 表格 ...

  5. tensorflow2.0学习笔记第一章第五节

    1.5简单神经网络实现过程全览

  6. 04373 C++程序设计 2019版 第一章习题五、程序设计题

    题目: 1.编写一个程序,将从键盘输入的n个字符串保存在一个一维数组A中.在输入字符串之前,先输入n的值.要求,数组A需要动态申请空间,程序运行结束前再释放掉. #include <iostre ...

  7. (第一章第六部分)TensorFlow框架之实现线性回归小案例

    系列博客链接: (一)TensorFlow框架介绍:https://www.cnblogs.com/kongweisi/p/11038395.html (二)TensorFlow框架之图与Tensor ...

  8. (第二章第四部分)TensorFlow框架之TFRecords数据的存储与读取

    系列博客链接: (第二章第一部分)TensorFlow框架之文件读取流程:https://www.cnblogs.com/kongweisi/p/11050302.html (第二章第二部分)Tens ...

  9. (第二章第三部分)TensorFlow框架之读取二进制数据

    系列博客链接: (第二章第一部分)TensorFlow框架之文件读取流程:https://www.cnblogs.com/kongweisi/p/11050302.html (第二章第二部分)Tens ...

随机推荐

  1. MySQL OOM

    问题 前几天遇到一个奇怪的问题,服务器内存明明够用,结果在对 MySQL 进行测压的时候却出现了 OOM,是 Linux 内核出错了吗? 具体现象如下:使用 sysbench 对 mysql 进行压测 ...

  2. 【存】008 Linux 文件查找 find

    01 一起来认识 find! 在 Linux 系统,find 毫无疑问是最强的文件查找工具.find 一般会与其他命令结合,将查找到的结果作为参数传入到后置命令中,进行删除.统计.复制迁移等操作. 0 ...

  3. Spring源码-IOC部分-Bean实例化过程【5】

    实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...

  4. IntelliJ IDEA 学习笔记 - 修改编码

    感谢原文作者:codeke 原文链接:https://blog.csdn.net/cgl125167016/article/details/78666432 仓库:https://github.com ...

  5. Git提示“warning: LF will be replaced by CRLF”

    感谢原文作者:萌新李同学(李俊德-大连理工大学) 原文链接:https://blog.csdn.net/wq6ylg08/article/details/88761581 问题描述 windows平台 ...

  6. Java之static静态关键字详解|final关键字详解

    前言 在Java语言中,static表示"静态"的意思,使用场景可以用来修饰成员变量和成员方法,当然也可以是静态代码块.static的主要作用在于创建独立于具体对象的域变量或者方法 ...

  7. bom-client

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 浅谈VPC (转)

    来源于知乎:https://zhuanlan.zhihu.com/p/33658624 VPC全称是Virtual Private Cloud,翻译成中文是虚拟私有云.但是在有些场合也被翻译成私有网络 ...

  9. 前端常见原生方法的实现(bind,promise,new,extends,深拷贝,函数防抖,函数节流)

    前端原生方法的实现,这里写一下常见的一些实现: 1.bind Function.prototype.bind2 = function (context) { var self = this; retu ...

  10. 【转载】Locust实现集合点

    直接编写接口事务脚本对后台接口进行测试:有时测试需要让所有并发用户完成初始化后再进行压力测试,这就需要类似于LoadRunner中的集合点的概念,由于框架本身没有直接封装,有如下办法实现: from ...