不运行eval获取可迭代张量



是否有一种方法可以使张量可迭代而不运行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都是张量,我不能用zip()迭代它们。

不,没有;没有直接。

将Tensorflow程序划分为两个阶段是最简单的:构建Python阶段,构建计算图,以及运行计算图的执行阶段。在构建阶段没有实际运行的东西;所有的计算都在执行阶段进行。构建阶段不能依赖于执行阶段的结果,除非运行图(session.run(), .eval()等)

你不能在构建图的时候迭代一个张量,因为在你调用session.run()之前,它实际上并没有被评估为一组特定的值。相反,它只是对计算图中一个节点的引用。

一般来说,你必须使用Tensorflow函数来操作张量,而不是Python原语(如zip)。我喜欢的一种方式是,它几乎就像一个张量是一个密封盒子里的放射性物体,你只能间接地使用一个机器人来处理它,这个机器人可以执行一组特定的动作(Tensorflow库函数):-)所以你可能需要找到一种方法来表达你的任务使用Tensorflow原语。

如果你给出了一个完整的例子来说明你想要做什么,可能会说得更多(从你的代码片段中我看不清楚)。一种可能是使用tf.split将张量拆分为子张量的Python列表,然后在列表上使用类似zip的东西。

我希望这对你有帮助!

最新更新