我是否只需调用一次会话即可运行Tensorflow中的所有操作?

时间:2019-07-09 20:36:12

标签: python tensorflow

例如,我假设我有类似的东西:

run1 = tf.assign(y,x)
run2 = tf.assign(z,y)
sess.run(run2, feed_dict={x:a}

此调用是先运行run1,然后是run2,还是我需要先显式调用run1?

我在处理其他代码时遇到麻烦。这个错误有关系吗?

  

FailedPreconditionError:尝试使用未初始化的值   Variable_11 [[node Variable_11 / read(在   :20)]]

2 个答案:

答案 0 :(得分:1)

首先,您应该运行下面的代码以消除错误。

sess.run(tf.global_variables_initializer())

之后,您应该分别调用run1和run2来将a分配给z。但是,如果要使用run2为z分配a,则应按以下方式定义run2:

run2 = tf.assign(z, run1)

使用此代码,当您尝试调用run2时,run1将运行,并且run1的结果将分配给z。

答案 1 :(得分:1)

要回答标题(并非总是如此),例如一个真实的例子:

import tensorflow as tf

x = tf.placeholder(dtype=tf.float32, name="input_vector1")
y = tf.placeholder(dtype=tf.float32, name="input_vector2")
mul1 = tf.multiply(x, y)
mul2 = tf.multiply(mul1, x)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(sess.run(mul2, feed_dict={x: 2, y: 3}))

运算符都已连接,x和y是sess.run中提供的输入,我请求mul2,因此必须首先计算mul1,它将在同一sess.run中自动发生。

不是这种情况的示例:

import tensorflow as tf

x = tf.placeholder(dtype=tf.float32, name="input_vector1")
y = tf.placeholder(dtype=tf.float32, name="input_vector2")
mul1 = tf.multiply(x, y)
mul2 = tf.multiply(y, x)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(sess.run(mul2, feed_dict={x: 2, y: 3}))

要计算mul2,不需要mul1,因此不会干扰tensorflow。 要查看连接了哪些运营商,您可以执行以下操作:

import tensorflow as tf

x = tf.placeholder(dtype=tf.float32, name="input_vector1")
y = tf.placeholder(dtype=tf.float32, name="input_vector2")
mul1 = tf.multiply(x, y)
mul2 = tf.multiply(mul1, x)

with tf.Session() as sess:
    tf.summary.FileWriter("path/to/empty/folder", sess.graph)

此脚本会将日志文件记录到一个文件夹中,然后可以使用

读取该日志文件。
  

tensorboard --logdir=path/to/empty/folder

有关张量板的更多信息,请参阅the official guide

您遇到的错误是因为您没有运行sess.run(tf.global_variables_initializer()),这会初始化所有变量