TensorFlow变量和常量

时间:2017-06-25 11:22:49

标签: python tensorflow

我是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))

3 个答案:

答案 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开始,VariablesConstant在使用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)

另一种查看差异的方法是:

  1. tf.constant :是固定值,因此不可训练。
  2. tf.Variable:这些是在会话中初始化并且可训练的张量(数组)(可训练我的意思是这可以优化并且可以随着时间的推移而改变)