如果我们可以在没有初始化的情况下直接使用变量,为什么我们在张量流中使用tf.Variable?

时间:2018-04-08 16:28:04

标签: python tensorflow machine-learning neural-network deep-learning

在张量流中,我们以两种方式使用变量:

a = tf.constant(12)

b = tf.constant(10)

#NOW SAY I WANT TO ADD THESE TWO

#1st method

ans = tf.Variable(tf.add(a, b))

# Initialize the variable
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
print(sess.run(ans))

#2nd method

ans1 = tf.add(a, b)
sess = tf.Session()
sess.run(ans1)

因此我们都知道,对于使用第一种方法,我们必须初始化变量,否则它会抛出"未初始化变量"的错误。但是他们不需要为第二种方法进行初始化。 所以我的问题是为什么我们在张量流中使用第一种方法或tf.Variable?他们是否具体使用了这个?

2 个答案:

答案 0 :(得分:1)

您应该考虑张量流中的4种张量:

  • 占位符 - 这些是张量,期望在feed_dict来电时通过sess.run找到传入的值。
  • 变量 - 这些是可变的张量,它们的值从sess.run的一次执行到下一次。这是在会议期间维持其状态的唯一类型的张量。
  • 计算张量(OP /操作) - 这些是计算值,例如tf.add(a,b),在sess.run调用结束时丢弃(或返回)该值。它们只是计算的。
  • 常数 - 例如tf.constant(12)

变量需要精确初始化,因为它们保持状态,因此需要初始状态。这就是你必须在方法#1中运行初始化程序的原因。

另一方面,OP计算并在每次调用sess.run时被丢弃。这就是你在方法#2中所做的。您执行了计算,并提供了执行该计算所需的所有内容(两个常量)。因此,tensorflow执行所请求的计算,将结果返回给您,然后丢弃结果。

注意方法#1的独特区别。如果您要在ans的某个时间点请求sess.run(ans)的值,它将只检索变量的值并返回它(不执行任何计算)。在方法#2中,如果您将来使用ans1请求sess.run(ans1)的值,则必须再次为您执行计算。

答案 1 :(得分:0)

TensorFlow.add会返回TensorFlow.Tensor类型。如果您将第一种方法转换为TensorFlow.Variable,则必须对其进行初始化,但是您获得了多项功能,因为Variable是具有高级功能的Tensor包装器。

例如,Variable可以存在于单个session.run调用的上下文之外,与Tensorsee the doc)不同。

因此,这完全取决于您的需求。