在不运行 eval 的情况下获取可迭代的 Tensor

Ven*_*dea 5 python numpy tensorflow

有没有办法使张量可迭代而无需运行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))
Run Code Online (Sandbox Code Playgroud)

问题是在这一点上layer[-1]是 a tf.placeholder,所以aesbes都是张量,我不能用zip().

任何想法,将不胜感激。

小智 2

不,没有;不直接。

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

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

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

如果您给出了您想要做的事情的完整示例,则可能可以说更多(从您的代码片段中我不清楚)。一种可能是使用tf.split将张量拆分为 Python 子张量列表,然后在列表上使用 zip 之类的东西。

我希望这有帮助!