Tensorflow变量简介
下面的文章提供了Tensorflow变量的概要。TensorFlow中的所有操作都使用张量,而张量中的所有值都具有相同的数据类型。因此,当你打印张量时,TensorFlow会预测其形状。另一方面,TensorFlow的形状属性可以用来获得张量的形状。
什么是TensorFlow变量?
在TensorFlow中构建深度学习模型时,我们需要Variables来表示模型的参数。TensorFlow变量是基于张量的内存缓冲区,在几个图的执行中持续存在。随着训练的进行,变量的值会发生变化,每一次变化都会使模型更接近于理想的系统。
TensorFlow中的所有计算都要经过一个或多个传感器。一个张量可以用标量格式或用多维格式来表达。一个tf.tensor是一个三属性的对象,包括。
- 一个独特的标签(名称)
- 一个测量(形状)
- 一种数据类型(dtype)
变量特征
- 在一个会话的执行过程中,一个变量会保留其值。
- 一个执行中的会话必须初始化一个变量。
- 变量是属于Variable类的对象。
- 变量可以用来在数组中保存数据,并使用TensorFlow操作来进行。
- 在第一次使用图之前,变量必须被明确地初始化。
- 我们可以将保存在变量中的值保存到磁盘中,然后再检索它们以便以后使用。
创建一个变量
变量类可以用来反映数据总是以不同的值到达的事实。它将描绘出一个数值不断变化的节点。我们可以使用tf.getvariable()方法来生成一个变量。变量初始化器必须在你的模型中的任何其他操作被执行之前运行。实现这一目标的最简单方法是创建一个操作,在使用模型之前执行所有的变量初始化器。
Var1 = tf. Variable (<starting Val>, name=<optional>)
第一个参数决定了变量的初始值,而第二个可选参数定义了变量的名称。
库(张量流)
my_var <- tf$Variable (tf$zeros (shape (1,2,3)))
上述格式创建了用零做的三维形状。它们有一个默认的dtype tf@float32。大多数TensorFlow优化器具有专门的操作,使用类似梯度下降的技术有效地更新变量值。
<- tf$Variable (0) var$assign_add(10)
TensorFlow中的变量必须在使用前被初始化。恒定张量是恒定张量的极致。
We = tf. Variable(tf. zeros((2,2)), name="weights")
Res = tf.Variable(tf.random_normal((2,2)), name="random weights")
with tf.Session() as ses1:
ses1.run(tf.initialize_all_variables())
print(ses1.run(We))
print(ses1.run(Res))
这里的权重是一个可以从常量中分配的变量对象。在复杂的TensorFlow模型中可以找到数百个变量。
为了避免碰撞,tf.variable scope()提供了简单的名称间距。
在一个变量范围内,tf.get variable()创建/访问变量。
TensorFlow变量生命周期
在基于Python的TensorFlow中,tf.Variable实例的生命周期与其他Object存储的生命周期相同。当一个变量没有引用时,它就会立即被取消分配。变量也可以被赋予名称,这使得它们更容易被跟踪和调试。允许两个具有相同名称的变量。
.m= tf.Variable(my_tensor, name="John")
n= tf.Variable(my_tensor + 1, name="John")
print (m == n)
因此,这就产生了
tf.Tensor(
[[False False] [False False]], shape= (2, 2), dtype=bool)
当我们声明一个变量时,我们可以使用tf.assign()函数在未来改变它的值,我们也可以使用一个值或一个动作来初始化它。
函数tf.global variables initializer()用作为参数提供的值初始化代码中的所有变量,但它是以异步模式进行的,这意味着当变量有依赖关系时,它不能正常运行。
接下来,我们将看到如何更新一个变量。
Updating Variable State
state = tf.Variable(0, name="increase")
nval = tf.add (state, tf. constant (1))
update = tf. assign (state, nval)
with tf.Session() as se1:
se1.run(tf.initialize_all_variables ())
print(se1.run(state))
for i _ in range(3):
se1.run(update)
print(se1.run(state))
TensorFlow变量实例
下面提到了不同的例子。
例子#1 - 使用训练的损失
x_hat = tf.constant(36, name='x_hat')
x = tf.constant(39, name='x')
loss = tf.Variable((x - x_hat)**2, name='loss')
init = tf.global_variables_initializer()
tf.Session() as session:
session.run(init)
print(session.run(loss))
解释
loss=(-y)。定义一个常数为36,并创建一个变量来操作损失。接下来,创建一个会话并显示输出。
输出
9
例子#2
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import tensorflow as tf
va1 = tf.Variable(11, name="va1")
se1 = tf.Session()
init = tf. global_variables_initializer ()
se1.run(init)
print(se1.run(va1))
se1.run(va1.assign(12))
print(se1.run(va1))
se1.run(va1.assign_add(12))
print(se1.run(va1))
se1.run(va1.assign_sub(4))
print(se1.run(va1))
解释说明
在上面的代码中,张量使用一个变量来初始化一个值。接下来,加法和子函数被用来增加和减少一个指定的张量值。
输出

例子 #3
import tensorflow as tf
vble = tf.get_variable("vble", [1, 2])
print(vble)
var_i = tf.get_variable("var_i", [1, 2], dtype=tf.int32, initializer=tf.zeros_initializer)
print(var_i)
t_ct = tf.constant([[11, 12],[13, 14]])
var_2 = tf.get_variable("var_2", dtype=tf.int32, initializer=t_ct)
print(var_2)
解释
因为使用了'initializer'的形状,如果提供了initializer,就没有必要包括'values'。上述代码的输出如下。
输出

例子 #4
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import tensorflow as tf
tens1 = tf.constant([2.1, 3.1, 4.1])
varX = tf.Variable(tens1 , name="varX")
varY = tf.Variable([12, 21.1, 34.5], name="varY")
varZ = tf.Variable(["AU", "IND"], name="varZ")
varZY = tf.Variable([varX, varY], name="varZY")
print(format(varX))
print(format(varY))
print(format(varZ))
print(format(varZY))
解释
这里一个张量创建了四个不同的变量的值。输出以变量的形状来显示一个输出。
输出

例子 #5 - 变量赋值
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import tensorflow as tf
varM = tf.Variable(5, name="varM")
se1 = tf.Session()
init = tf.global_variables_initializer ()
se1.run(init)
print(se1.run(varM))
se1.run(varM.assign(15))
print(se1.run(varM))
se1.run(varM.assign_add(10))
print(se1.run(varM))
se1.run(varM.assign_sub(4))
print(se1.run(varM))
解释
一般来说,我们利用Variable.assign()、Variable.assign add()和Variable.assign sub()方法来更新、增加和减少变量的值。在上面的代码中,我们使用了Tensor flow的变量赋值,我们首先创建了一个变量varM并通过初始化开始了一个会话。接下来,为了给会话分配一个新的值,使用assign()方法。在增量和减量操作之后,输出结果如下所示。
输出

例子 #6
import numpy as np
import tensorflow as tf
zz= tf.Variable(0, dtype=tf.float32)
cost = 15 + 3*zz + zz*zz
tr1 = tf.train.GradientDescentOptimizer(0.01). minimize(cost)
init = tf.global_variables_initializer()
se1 = tf.Session()
se1.run(init)
print(se1.run(zz))
se1.run(tr1)
print(se1.run(zz))
for j in range (10000):
se1.run(tr1)
print(se1.run(zz))
解释
变量最初被设置为0,然后在只进行了一步梯度下降后变为-0.0499997,最后在10.000步后变为-2.499994。当在同一个脚本中执行许多独立的会话时,交互式会话是必不可少的。
输出

总结
最后,本文深入讨论了张量流变量和它们的初始化。我们也看到了一些关于变量如何影响Python中张量流的例子。要把一个变量初始化为常量,我们必须调用一个函数Object()。初始值可以作为一个参数递进去。Object()变量可以通过使用一个函数简单地添加到计算图中。
推荐文章
这是一篇关于Tensorflow变量的指南。在这里,我们讨论了几个变量如何影响Python中的张量流的例子,以及张量流变量和它们的初始化的深入。