将Tensorflow v1与原始python代码相结合



我正在尝试构建一个复杂的tensorflow图,现在我遇到了在图中的某个点需要列表或循环的问题。因此,现在用这个代码简化了我的问题:

这是我的";图形":

x = tf.placeholder(tf.float32, shape=(4, 1))
list = []
for i in range(int(x.shape[0])):
print("hello")
list.append(x[i])
r = tf.convert_to_tensor(list)

然后我打电话给:

with tf.compat.v1.Session() as sess:
input = np.random.rand(4, 1)
print(input)
print(sess.run(r, feed_dict={x: input}))
print(sess.run(r, feed_dict={x: input}))

结果如预期:

Org: [[0.02942727]
[0.22208347]
[0.71572471]
[0.13329401]]
First eval: [[0.02942727]
[0.22208346]
[0.7157247 ]
[0.13329402]]
First eval: [[0.02942727]
[0.22208346]
[0.7157247 ]
[0.13329402]]

代码似乎工作正常,但我不明白它是如何工作的。通常,我会定义一些tf操作,它只会被调用一次。然后,我可以评估张量流图中的一个节点。

这怎么能应用到我的例子中呢?当我调用sess.run(r)时,这个节点是如何从图中推断出来的?它取决于for-loop,而list只是一个原始python对象,根本不是张量?

如果不能避免将tensorflow与for循环/动态列表相结合,通常的方法是什么?

  1. 当我调用sess.run(r(时,这个节点是如何从图中推断出来的

整个图基本上是一个操作。这是r运算,它是函数tf.covert_to_tensor

  1. 这取决于for循环和列表

不,没有。当你这样做的时候tf.convert_to_sensor(列表(你基本上是在添加到你的图表中tf.convert_to_sensor([x[0],x[1],x[2],x[3](你的整个图形仍然只是一个函数,它依赖于x占位符

最后,当您在会话中运行操作时,您将提供具有预期形状(4(的x占位符

最新更新