获得可迭代的Tensor而不运行eval

时间:2016-06-30 15:29:26

标签: python numpy tensorflow

有没有办法让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,因此aesbes都是张量,我无法用{{{{}}进行迭代1}}。

任何想法都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

不,没有;不是直接的。

最简单的想法是将Tensorflow程序分为两个阶段:构建计算图的构建Python阶段和运行计算图的执行阶段。在建设阶段没有任何实际运行;所有计算都在执行阶段发生。除了运行图表(session.run().eval()等)之外,构建阶段不能依赖于执行阶段的结果。

在构建图形时,您无法迭代Tensor,因为在您调用session.run()之前,它实际上不会被评估为特定的值集。相反,它只是对计算图中节点的引用。

通常,您必须使用Tensorflow函数来操作Tensors,而不是Python原语(如zip)。我喜欢它的一种方式是,它几乎就像Tensor是一个密封盒子中的放射性物体,你只能使用可以执行某组动作的机器人间接处理它(Tensorflow库函数):-)因此,您可能需要找到一种使用Tensorflow原语表达任务的方法。

如果你提供了一个完整的例子,你可能会说更多(我的代码片段并不清楚)。一种可能性是使用tf.split将张量分割为子列表的Python列表,然后在列表上使用zip之类的东西。

我希望有所帮助!