我是新来的 tensorflow,我不能够理解变量和常量的区别,我得到的想法,我们使用变量的方程和常量的直接值,但为什么 code # 1 只工作,为什么不 code # 2 和 # 3,请解释在哪些情况下,我们必须先运行我们的图(A),然后我们的变量(B)即
(a) session.run(model)
(b) print(session.run(y))
在这种情况下,我可以直接执行这个命令,即
print(session.run(y))
代码 # 1:
x = tf.constant(35, name='x')
y = tf.Variable(x + 5, name='y')
model = tf.global_variables_initializer()
with tf.Session() as session:
session.run(model)
print(session.run(y))
代码 # 2:
x = tf.Variable(35, name='x')
y = tf.Variable(x + 5, name='y')
model = tf.global_variables_initializer()
with tf.Session() as session:
session.run(model)
print(session.run(y))
代码 # 3:
x = tf.constant(35, name='x')
y = tf.constant(x + 5, name='y')
model = tf.global_variables_initializer()
with tf.Session() as session:
session.run(model)
print(session.run(y))

在 TensorFlow 中,常量和变量之间的区别在于,当你声明一些constant时,它的值不能在将来更改(初始化也应该是一个值,不是操作)。
然而,当您声明一个Variable时,您可以在将来使用tf.assign()方法更改其值(并且可以使用值或操作实现初始化)。
函数tf.global_variables_initializer()使用作为参数传递的值初始化代码中的所有变量,但它在异步模式下工作,因此当变量之间存在依赖关系时无常工作。
您的第一个代码(# 1)正常工作,因为对变量初始化没有依赖关系,并且常量是用值构造的。
第二个代码(# 2)不起作用,因为tf.global_variables_initializer()
的异步行为。您可以使用tf.variables_initializer()修复它,如下所示:
x = tf.Variable(35, name='x')
model_x = tf.variables_initializer([x])
y = tf.Variable(x + 5, name='y')
model_y = tf.variables_initializer([y])
with tf.Session() as session:
session.run(model_x)
session.run(model_y)
print(session.run(y))
第三个代码(# 3)不能正常工作,因为你试图用一个操作初始化一个常量,这是不可能的。
关于您的最后一个问题。当您的计算图(b) print(session.run(y))
中有变量时,您需要运行(a) session.run(model)
。
我将指出使用渴望执行时的区别。
从 Tensorflow 2.0.b1 开始,Variables
和Constant
在使用tf.GradientTape
时会触发不同的行为。
让我们看看s://www.tensorflow.org/versions/r2.0/api_docs/python/tf/GradientTape中的示例代码
x = tf.constant(3.0)
with tf.GradientTape(persistent=True) as g:
g.watch(x)
y = x * x
z = y * y
dz_dx = g.gradient(z, x) # 108.0 (4*x^3 at x = 3)
dy_dx = g.gradient(y, x) # 6.0
del g # Drop the reference to the tape
您必须观察x
,这是一个Constant
。GradientTape
不会自动观察上下文中的常量。此外,每个GradientTape
只能观察一个张量。如果要获得多个Constant
s 的梯度,则需要嵌套2。
x = tf.constant(3.0)
x2 = tf.constant(3.0)
with tf.GradientTape(persistent=True) as g:
g.watch(x)
with tf.GradientTape(persistent=True) as g2:
g2.watch(x2)
y = x * x
y2 = y * x2
dy_dx = g.gradient(y, x) # 6
dy2_dx2 = g2.gradient(y2, x2) # 9
del g, g2 # Drop the reference to the tape
另一方面,Variable
由GradientTape
自动观看。
默认情况下,GradientTape 将自动监视在上下文中访问的任何可训练变量。Source:s://www.tensorflow.org/versions/r2.0/api_docs/python/tf/GradientTape
所以上面看起来像,
x = tf.Variable(3.0)
x2 = tf.Variable(3.0)
with tf.GradientTape(persistent=True) as g:
y = x * x
y2 = y * x2
dy_dx = g.gradient(y, x) # 6
dy2_dx2 = g.gradient(y2, x2) # 9
del g # Drop the reference to the tape
print(dy_dx)
print(dy2_dx2)
当然,您可以通过传递watch_accessed_variables=False
来关闭自动观看。这些示例可能不太实用,但我希望这可以消除某人的困惑。

另一种查看差异的方法是:
tf.constant:是固定值,因此不可训练。
tf.Variable:这些是在会话中初始化并且可训练的张量(数组)(使用可训练的我的意思是这可以优化并且可以随着时间的推移而改变)
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(13条)