有没有办法让Tensor可迭代而不运行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
都是张量,我无法用{{{{}}进行迭代1}}。
任何想法都会受到赞赏。
答案 0 :(得分:1)
不,没有;不是直接的。
最简单的想法是将Tensorflow程序分为两个阶段:构建计算图的构建Python阶段和运行计算图的执行阶段。在建设阶段没有任何实际运行;所有计算都在执行阶段发生。除了运行图表(session.run()
,.eval()
等)之外,构建阶段不能依赖于执行阶段的结果。
在构建图形时,您无法迭代Tensor,因为在您调用session.run()
之前,它实际上不会被评估为特定的值集。相反,它只是对计算图中节点的引用。
通常,您必须使用Tensorflow函数来操作Tensors,而不是Python原语(如zip)。我喜欢它的一种方式是,它几乎就像Tensor是一个密封盒子中的放射性物体,你只能使用可以执行某组动作的机器人间接处理它(Tensorflow库函数):-)因此,您可能需要找到一种使用Tensorflow原语表达任务的方法。
如果你提供了一个完整的例子,你可能会说更多(我的代码片段并不清楚)。一种可能性是使用tf.split
将张量分割为子列表的Python列表,然后在列表上使用zip之类的东西。
我希望有所帮助!