TensorFlow中的变量(Variables)

2023-11-04

在TensorFlow中,变量(Variable)是特殊的张量(Tensor),它的值可以是一个任何类型和形状的张量。
与其他张量不同,变量存在于单个 session.run 调用的上下文之外,也就是说,变量存储的是持久张量,当训练模型时,用变量来存储和更新参数。除此之外,在调用op之前,所有变量都应被显式地初始化过。

1.创建变量

最常见的创建变量方式是使用Variable()构造函数。
import tensorflow as tf
v = tf.Variable([1,2,3])   #创建变量v,为一个array
print(v)  #查看v的shape,不是v的值。结果是: <tf.Variable 'Variable:0' shape=(3,) dtype=int32_ref>
with tf.Session() as sess:
    sess.run(v.initializer)     #运行变量的initializer。调用op之前,所有变量都应被显式地初始化过。
    sess.run(v)     #查看v的值,结果是:array([1, 2, 3])
除了我们自己填写变量的值外,一般可以使用TensorFlow提供了一系列操作符来初始化张量,初始值是常量或是随机值。
r = tf.Variable(tf.random_normal([20, 10], stddev=0.35))     #以标准差0.35的正太分布初始化一个形状为[20,40]的张量
z = tf.Variable(tf.zeros([20]))  #初始化一个形状为[20]的张量, 里面的元素值全部为0.
类似的函数还有tf.eye, tf.ones,tf.constant等。
创建变量还可以调用 tf.get_variable 函数。此函数要求您指定变量的名称。此名称将被其他副本用来访问同一变量,以及在检验和导出模型时命名此变量的值。tf.get_variable 还允许您重用先前创建的同名变量,从而轻松定义重用层的模型。
要使用 tf.get_variable 创建变量,只需提供名称和形状即可
my_variable = tf.get_variable("my_variable", [1, 2, 3]) #这将创建一个名为“my_variable”的变量,该变量是形状为 [1, 2, 3] 的三维张量。
R1.8中Variable的构造函数如下:
Variable(
    initial_value=None,
    trainable=True,
    collections=None,
    validate_shape=True,
    caching_device=None,
    name=None,
    variable_def=None,
    dtype=None,
    expected_shape=None,
    import_scope=None,
    constraint=None
)
新变量将添加到列出的图集合中collections,默认为[GraphKeys.GLOBAL_VARIABLES]。
如果trainable是True变量也被添加到图形集合 GraphKeys.TRAINABLE_VARIABLES。下面会讲一下变量集合。
这个构造函数创建一个variableOp和一个assignOp来将变量设置为其初始值。
参数:
initial_value:变量的初始值可以是一个张量,或者是可转换为张量的Python对象。初始值必须具有指定的形状,除非validate_shape参数设置为False。也可以是一个无参数调用,调用时返回初始值。在这种情况下,dtype必须指定。(请注意,init_ops.py中的初始化函数在使用之前必须先绑定到一个形状。)
trainable:如果是True(默认值),会将变量添加到图形变量集合GraphKeys.TRAINABLE_VARIABLES中。这个集合被用作Optimizer类使用的默认变量列表。
collections:图形集合键的列表。新变量被添加到这些集合中。默认为[GraphKeys.GLOBAL_VARIABLES]。
validate_shape:如果是False,允许变量初始化为未知形状的值。如果是True,initial_value的形状必须是已知的。
caching_device:可选设备字符串,描述变量应该被缓存以供读取的位置。默认为变量所在的设备。如果不是None,则缓存在另一台设备上。典型用途是在使用该变量的Ops所驻留的设备上进行缓存。
name:变量的可选名称。默认为'Variable'并自动赋值。
variable_def:VariableDef协议缓冲区。如果不是None,则重新创建Variable对象及其内容,而且该内容中引用图中变量的节点必须已经存在。而且图形不能被改变。 variable_def与其他参数是相互排斥的。
dtype:如果设置,initial_value将被转换为给定的类型。如果为None,数据类型将被保留(前提是initial_value是张量),或者由convert_to_tensor决定。
expected_shape:一个Tensor形状。如果设置,initial_val将会是这个形状。
import_scope:可选的string类型。名称作用域会添加到 Variable.仅在从协议缓冲区初始化时使用。
constraint:一个可选的投影函数,在被Optimizer(例如,用于实现层权重的范数约束或值约束)更新之后应用于该变量。该函数必须将代表变量值的未投影张量作为输入,并返回投影值的张量(它必须具有相同的形状)。进行异步分布式训练时,约束条件不安全。

2.变量集合

由于 TensorFlow 程序的未连接部分可能需要创建变量,因此能有一种方式访问所有变量有时十分受用。为此,TensorFlow 提供集合,它们是张量或其他对象(如 tf.Variable 实例)的命名列表。已定义的集合类型在tf.GraphKeys中有介绍。
默认情况下,每个 tf.Variable 都放置在以下两个集合中:

  • tf.GraphKeys.GLOBAL_VARIABLES - 可以在多个设备共享的变量
  • tf.GraphKeys.TRAINABLE_VARIABLES - TensorFlow 将计算其梯度的变量。
如果您不希望变量被训练,可以将其添加到 tf.GraphKeys.LOCAL_VARIABLES 集合中。例如,以下代码段展示了如何将名为 my_local 的变量添加到此集合中:
my_local = tf.get_variable("my_local", shape=(),collections=[tf.GraphKeys.LOCAL_VARIABLES])
或者指定 trainable=False:
t=tf.Variable([1,2,3], trainable=False)
也可以使用自己的集合。集合名称可为任何字符串,而且无需显式创建集合。创建变量(或任何其他对象)后,要将其添加到集合,请调用 tf.add_to_collection。例如,以下代码将名为 my_local 的现有变量添加到名为 my_collection_name 的集合中:
tf.add_to_collection("my_collection_name", my_local)
要检索您放置在某个集合中的所有变量(或其他对象)的列表,您可以使用:
tf.get_collection("my_collection_name")
3.变量初始化
前面说过,变量的初始化必须在模型的其它操作运行之前先明确地完成。如果您在低级别 TensorFlow API 中进行编程(即显式创建自己的图和会话),则必须明确初始化变量。tf.contrib.slim、tf.estimator.Estimator 和 Keras 等大多数高级框架在训练模型前会自动初始化变量。
那么在低级别API里面,最简单的方法就是添加一个给所有变量初始化的操作(比如tf.global_variables_initializer()),并在使用模型之前首先运行那个操作。
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())     #运行变量的initializer。调用op之前,所有变量都应被显式地初始化过。
    sess.run(v)     #查看v的值,结果是:array([1, 2, 3])
除此之外,还有前面所提到的单个变量的初始化(v.initializer)。
可以查询哪些变量尚未初始化。例如,以下代码会打印所有尚未初始化的变量名称:
print(sess.run(tf.report_uninitialized_variables()))
请注意,默认的 tf.global_variables_initializer 不会指定变量的初始化顺序。因此,如果变量的初始值取决于另一变量的值,那么很有可能会出现错误。
参考文档:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TensorFlow中的变量(Variables) 的相关文章

随机推荐

  • cnpm、vue、vue-cli全局安装

    cnpm安装
  • ESP-NOW无线通信

    本文由铁熊与默联合创作 在学习 Arduino 开发的过程中 无线通讯是我们学习道路上一道必过的坎 无线通讯摆脱了线材的束缚 使用更加灵活且通讯距离根据不同无线模块可达几十米甚至是数公里 常见的无线通讯方式有蓝牙 WiFi LoRa NB
  • C++十种排序方法(快速排序、冒泡排序等等)

    C 十种排序方法 快速排序 冒泡排序等等 一 冒泡排序 1 概念及思路 冒泡排序顾名思义就是大的数沉下去 小的数浮上来 就跟气泡在水底浮上来一样 基本的思路很简单 就是相邻的两个数相比较 如果前面那个数比后面那个数大 则换位置 否则不需要换
  • innodb下的mvcc_浅谈MVCC

    简介 MVCC Multi Version Concurrency Control 即多版本并发控制 MVCC的实现原理 我们在了解MVCC之前 首先先了解一下几个比较常见的锁 读锁 也叫共享锁 S锁 若事务T对数据对象A加上S锁 则事务T
  • APISIX-dashboard安装篇

    一 简介 apisix dashboard是官方提供的web图形界面 可以方便的添加组件以及配置服务 适合我这种咸鱼使用 项目地址 https github com apache apisix dashboard 二 安装 本文使用rpm的
  • showtext

    R语言绘图的字体设置是个老大难的问题 它默认情况下只提供三种字体 本篇推文介绍两种字体设置方法 针对Windows系统 一种是R语言本身的字体设置方法 另一种是showtext等工具包提供的相关方法 1 系统设置方法 1 1 原生样式 R语
  • Android适配器(Adapter)的简单介绍

    什么是适配器呢 顾名思义 就是把一些数据给弄得适当 适合以便于在View上显示 适配器就像显示器 把复杂的东西按人可以接受的方式来展现 可以说适配器就是数据和视图之间的桥梁 学好适配器还是非常重要的 适配器的工作原理 适配器是怎么处理得到的
  • cocoapods 引入 三方库 历程

    在已有的工程中没有使用 pod 新建一个demo手动导入protobuf时报错GPB文件找不到 直接使用pod导入没有出现类似错误 所以就在项目工程中引入pod去集成protobuf platform ios 8 0 use framewo
  • 2022年Android中高级面试框架

    目录 Java 泛型 集合 ArrayList LinkedList HashMap LinkedHashMap ConcurrentHashMap 多线程并发 volatile 线程 反射 JVM 类加载 怎么判断对象是否已死 垃圾回收机
  • 容器适配器

    C 顺序容器的底层能够模拟一些常见的数据结构 方法是通过容器适配器 队列 queue 只允许在一端插入数据操作 在另一端进行删除数据操作的特殊线性表 进行插入操作的一端称为队尾 入队列 进行删除操作的一端称为队头 出队列 队列具有先进先出
  • opencv读取&裁剪&写入图片

    opencv读取 裁剪 写入图片 1 英文路径 1 1 导包 1 2 找到英文路径 1 3 英文路径读取 1 4 图像白边裁剪 1 5 英文路径写入 1 6 结果展示 2 直接读取中文路径常见错误示范 2 1 读取 2 2 写入 3 正确读
  • HDL4SE:软件工程师学习Verilog语言(六)

    6 表达式与赋值 我们终于可以继续学习了 也是没有办法 其实工作的80 的时间都是在忙杂事 就像打游戏一样 其实大部分时间都在打小怪 清理现场 真正打终极BOSS的时间是很少的 但是不清小怪 打BOSS就束手束脚 也很难通关啊 我们先来复习
  • php调用海康威视4200软件同步考勤数据到sql_server ,并通过html实时显示。

    海康威视4200软件同步考勤数据到sql server 并通过html实时显示 安装环境 这个不多说了 肯定得先设置好sql server吧 数据库设置好后同步一下就可以直接获取信息到数据库中了 有了数据后我们使用php调用一下 time
  • Windows Server 2012 R2 WSUS-5:组策略配置自动更新

    如果公司具备域环境的话 我们可以根据不同的计算机组的要求 来配置不同的WSUS的自动更新策略 比如测试机器链接一套GPO 生产服务器链接一套GPO 针对于测试环境和生产环境的服务器和客户端的策略都是不一样 可以进行自定义设置的 当然如果机器
  • Command (Start this RegionServer (64250)) has failed CDH hbase 节点重启失败报错

    hbase 节点重启报错 问题描述 重启Hbase RegionServer和Hmaster失败 查看主 从节点日志后发现如下报错 解决办法 经排查后发现各节点date时间不同 相差较大 导致启动失败 设置ntp时间同步或者批量操作各节点同
  • Redis的启动、使用和停止

    1 Redis的启动 1 前端模式启动 直接运行bin redis server将以前端模式启动 切换到 usr local redis bin目录下 然后 redis server 前端模式的缺点是启动完成后 不能再进行其他操作 如果要操
  • 《深入解析Android虚拟机》Dalvik和Art基础:读书笔记

    1 Dalvik虚拟机和普通java虚拟机的区别 a dalvik虚拟机基于寄存器 java虚拟机基于栈 b dalvik会通过dx将所有的class打包到dex文件 普通的java虚拟机将所有的class打包到jar文件 c dalvik
  • 面试合集:数据库+数据结构+JVM+网络+JAVA+分布式+操作系统

    第一个模块 数据库 1 1 腾讯数据库面试问题 解释ACID四大特性 原子性的底层实现 数据库宕机后恢复的过程 如何保证事务的ACID特性 MySQL日志类型 这5个题目相对来说是比较普遍的 这里我就不一一给出答案了 给大家看下我的那个数据
  • 使用驱动器f中的光盘之前需要格式化什么意思_使用驱动器中的光盘之前需要将其格式化如何解决?...

    电脑硬盘分区 移动硬盘 U盘等在使用过程中有时会出现错误 使分区打不开无法读取分区中的数据 并且提示 使用驱动器中的光盘之前需要将其格式化 使用驱动器中的光盘之前需要将其格式化如何解决 使用驱动器中的光盘之前需要将其格式化如何解决 工具 软
  • TensorFlow中的变量(Variables)

    在TensorFlow中 变量 Variable 是特殊的张量 Tensor 它的值可以是一个任何类型和形状的张量 与其他张量不同 变量存在于单个 session run 调用的上下文之外 也就是说 变量存储的是持久张量 当训练模型时 用变