我是tensorflow的新手,我无法理解变量和常量的差异,我认为我们使用变量求方程和常量来表示直接值,但为什么代码#1只能工作,为什么不编码# 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))
答案 0 :(得分:23)
在TensorFlow中,常量和变量之间的区别在于,当您声明某些constant时,其值将来不能更改(初始化也应该是一个值,不是操作强>)。
然而,当您声明Variable时,您可以使用tf.assign()方法更改其值(并且可以使用值或操作来实现初始化)。
函数tf.global_variables_initializer()使用作为参数传递的值初始化代码中的所有变量,但它在异步模式下工作,因此在变量之间存在依赖关系时不能正常工作。
你的第一个代码(#1)正常工作,因为对变量初始化没有依赖性,而常量是用值构造的。
由于tf.global_variables_initializer()
的异步行为,第二个代码(#2)无法正常工作。您可以使用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)无法正常工作,因为您尝试使用操作初始化常量,这是不可能的。要解决这个问题,适当的策略是(#1)。
关于你的上一个问题。当计算图(a) session.run(model)
中有变量时,您需要运行(b) print(session.run(y))
。
答案 1 :(得分:0)
我会指出使用急切执行时的区别。
从Tensorflow 2.0.b1开始,Variables
和Constant
在使用tf.GradientTape
时会触发不同的行为。奇怪的是,官方文件还不够口头。
让我们看一下https://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
的渐变,则需要嵌套GradientTape
。例如,
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
另一方面,{strong> Variable
会自动被GradientTape
监视。
默认情况下,GradientTape将自动监视在上下文中访问的所有可训练变量。来源:https://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
来关闭自动观看功能。这些示例可能不太实际,但是我希望这可以消除别人的困惑。
答案 2 :(得分:0)
另一种查看差异的方法是: