是否有一种方法可以使张量可迭代而不运行eval()
以获得其numpy数组?
在使用split()
之后,我试图迭代张量的两个部分,但它发生在我的神经网络的隐藏层的构造中,所以它需要在我能够开始一个会话之前发生。
import tensorflow as tf
x = tf.placeholder('float', [None, nbits])
layer = [x]
for i in range(1,numbits):
layer.append(tf.add(tf.matmul(weights[i-1], layer[i-1]), biases[i-1]))
aes, bes = tf.split(1, 2, layer[-1])
if i%2 == 1:
for am, a, b in zip(add_layer, aes, bes):
layer.append(am.ex(a, b))
问题是layer[-1]
在此时是tf.placeholder
,因此aes
和bes
都是张量,我不能用zip()
迭代它们。
不,没有;没有直接。
将Tensorflow程序划分为两个阶段是最简单的:构建Python阶段,构建计算图,以及运行计算图的执行阶段。在构建阶段没有实际运行的东西;所有的计算都在执行阶段进行。构建阶段不能依赖于执行阶段的结果,除非运行图(session.run()
, .eval()
等)
你不能在构建图的时候迭代一个张量,因为在你调用session.run()
之前,它实际上并没有被评估为一组特定的值。相反,它只是对计算图中一个节点的引用。
一般来说,你必须使用Tensorflow函数来操作张量,而不是Python原语(如zip)。我喜欢的一种方式是,它几乎就像一个张量是一个密封盒子里的放射性物体,你只能间接地使用一个机器人来处理它,这个机器人可以执行一组特定的动作(Tensorflow库函数):-)所以你可能需要找到一种方法来表达你的任务使用Tensorflow原语。
如果你给出了一个完整的例子来说明你想要做什么,可能会说得更多(从你的代码片段中我看不清楚)。一种可能是使用tf.split
将张量拆分为子张量的Python列表,然后在列表上使用类似zip的东西。
我希望这对你有帮助!