python – 获取可迭代的Tensor而不运行eval

有没有办法让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))

问题是此时[1]层是一个tf.placeholder,所以aes和bes都是张量,我不能用zip()迭代它们.

任何想法,将不胜感激.

最佳答案 不,没有;不直接.

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

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

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

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

我希望有所帮助!

点赞