【问题标题】:Use tf.shape(tensor) as a bound for a loop使用 tf.shape(tensor) 作为循环的边界
【发布时间】:2018-08-31 23:07:17
【问题描述】:

在 Python 中使用 Tensorflow,我想使用占位符的形状作为 for 循环的边界。但是,当我尝试执行此操作时,出现错误:“张量”对象不能被解释为整数。这个形状在数据中不是一个常数值,所以我们不能使用 tf.constant。我们如何解决这个问题?

这是我们代码的一部分:

def Model(M, v_a, weights, biases, d, N):

c = multilayer_perceptron((tf.slice(M, [0, 0], ([d, 1]))), v_a, weights, 
    biases)

for i in range(1, N):

    c = tf.concat([c, multilayer_perceptron((tf.slice(M, [0, i], [d, 1])), 
    v_a, weights, biases)], axis=0)

alpha = tf.nn.softmax(tf.reshape(c, [-1]))

v_ns = tf.matmul(M, tf.reshape(alpha, [N, 1]))

layer_3 = tf.add(tf.matmul(weights['W4'], v_ns), biases['b2'])
v_ms = tf.nn.tanh(layer_3)

layer_4 = tf.add(tf.matmul(weights['W5'], v_ms), biases['b3'])
pred = tf.nn.softmax(tf.reshape(layer_4, [-1]))

return pred

M = tf.placeholder(tf.float32)

我需要 N 是一个整数,但它需要等于占位符 M 的列数,这在训练示例中不是恒定的。

【问题讨论】:

    标签: python tensorflow deep-learning tensor


    【解决方案1】:

    编辑:

    似乎我一开始没有正确理解这个问题。我会留下原来的答案,因为它是相关的,以防万一有人觉得它有用。

    无论如何,如果你想使用一个张量的维度作为循环中的迭代次数,那么维度的值必须是静态已知的(不能是None)。您只需执行以下操作:

    for i in range(my_tensor.shape[i_dim].value):
        # loop body...
    

    i_dim 是您要迭代的维度。同样,如果您不知道张量维度的大小,则需要求助于tf.while_loop

    def body(dim, i):
        # loop body...
        return dim, i + 1
    
    cond = lambda dim, i: dim > i
    
    tf.while_loop(cond, body, [tf.shape(my_tensor)[i_dim], 0])
    

    您如何或是否可以做到这一点取决于您在循环时对张量的了解程度。如果形状是完全已知的,你可以简单地这样做:

    for dim in my_tensor.shape.as_list():
        # loop body...
    

    这里,dim 将是已知维度的常规 Python 整数。但是,如果存在未知维度,它们将被读取为None。如果你不知道确切的维度,但你知道张量的等级(即维度的数量),你可以这样做:

    shape = tf.shape(my_tensor)
    for i in range(my_tensor.shape.ndims):
        dim = shape[i]
        # loop body...
    

    在这种情况下,dim 将是保存张量维度的 TensorFlow 值,因此您只能使用它来计算其他张量,但保证定义了所有维度。

    最后,如果你甚至不知道张量中的维数,你将无法用形状制作一个规则的循环。如果有的话,你可以使用tf.while_loop 来做你需要的事情:

    def body(shape, i):
        dim = shape[i]
        # loop body...
        return shape, i + 1
    
    cond = lambda shape, i: tf.shape(shape)[0] > i
    
    tf.while_loop(cond, body, [tf.shape(my_tensor), 0])
    

    【讨论】:

    • 感谢您的回答。我编辑了问题以使其更清楚。回家后我会试试你的代码。
    • 我希望使用它来获取 Keras 中使用的自定义损失函数中的批量大小。然而,这最终变得相当复杂,因为我的下游函数依赖于建立的列表等于批量大小。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 2020-06-27
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多