Python 如果不需要初始化就可以直接使用变量,为什么要在tensorflow中使用tf.Variable?

Python 如果不需要初始化就可以直接使用变量,为什么要在tensorflow中使用tf.Variable?,python,tensorflow,machine-learning,neural-network,deep-learning,Python,Tensorflow,Machine Learning,Neural Network,Deep Learning,在tensorflow中,我们以两种方式使用变量: 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)

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

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)
所以我们都知道,对于使用第1种方法,我们必须初始化变量,否则它将抛出一个“未初始化变量”错误。但是他们不需要对第二种方法进行初始化。
所以我的问题是,为什么我们要在张量流中使用第一种方法或tf.变量?它们是否对此有任何特定用途?

TensorFlow.add
返回一个
TensorFlow.Tensor
类型。如果像在第一个方法中一样将其强制转换为
TensorFlow.Variable
,则必须对其进行初始化,但会获得一些功能,因为
变量
是一个具有高级功能的
Tensor
包装器

例如,
变量
可以存在于单个session.run调用的上下文之外,这与
张量
()不同


因此,它完全取决于您的情况。

TensorFlow.add
返回一个
TensorFlow.Tensor
类型。如果像在第一个方法中一样将其强制转换为
TensorFlow.Variable
,则必须对其进行初始化,但会获得一些功能,因为
变量
是一个具有高级功能的
Tensor
包装器

例如,
变量
可以存在于单个session.run调用的上下文之外,这与
张量
()不同


因此,这完全取决于您的情况。

您应该在tensorflow中考虑4种类型的张量:

  • 占位符-这些是张量,用于查找通过
    feed\u dict
    传入的值,作为
    sess.run
    调用的一部分
  • 变量-这些变量是可变张量,可将其值从一次执行
    sess.run
    保存到下一次执行。这些是在整个会话期间保持其状态的唯一张量类型
  • 计算张量(OPs/运算)-这些是计算值,例如
    tf.add(a,b)
    ,在调用
    sess.run
    结束时,该值被丢弃(或返回)。它们只是计算出来的
  • 常数-例如
    tf.常数(12)
变量需要精确初始化,因为它们保持状态,所以它们需要初始状态。这就是为什么必须在方法#1中运行初始值设定项

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


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

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

  • 占位符-这些是张量,用于查找通过
    feed\u dict
    传入的值,作为
    sess.run
    调用的一部分
  • 变量-这些变量是可变张量,可将其值从一次执行
    sess.run
    保存到下一次执行。这些是在整个会话期间保持其状态的唯一张量类型
  • 计算张量(OPs/运算)-这些是计算值,例如
    tf.add(a,b)
    ,在调用
    sess.run
    结束时,该值被丢弃(或返回)。它们只是计算出来的
  • 常数-例如
    tf.常数(12)
变量需要精确初始化,因为它们保持状态,所以它们需要初始状态。这就是为什么必须在方法#1中运行初始值设定项

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

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