Python 使用tf.shape(张量)作为循环的边界

Python 使用tf.shape(张量)作为循环的边界,python,tensorflow,deep-learning,tensor,Python,Tensorflow,Deep Learning,Tensor,使用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,

使用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的列数,这在培训示例中不是常数。

编辑:

一开始我似乎没有正确理解这个问题。我将保留原始答案,因为它是相关的,以防有人发现它有用

在任何情况下,如果要使用张量的维数作为循环中的迭代次数,则必须静态地知道该维数的值(不能是
None
)。您可以简单地执行以下操作:

for i in range(my_tensor.shape[i_dim].value):
    # loop body...
shape = tf.shape(my_tensor)
for i in range(my_tensor.shape.ndims):
    dim = shape[i]
    # loop body...
其中,
i_dim
是要迭代的维度。同样,如果你不知道张量维度的大小,你需要求助于:


如何或是否能做到这一点取决于你在循环时对张量的了解程度。如果形状完全已知,您只需执行以下操作:

for dim in my_tensor.shape.as_list():
    # loop body...
这里,
dim
将是已知维度的常规Python整数。但是,如果存在未知维度,它们将被读取为
None
。如果你不知道确切的维数,但你知道张量的秩(即维数),你可以这样做:

for i in range(my_tensor.shape[i_dim].value):
    # loop body...
shape = tf.shape(my_tensor)
for i in range(my_tensor.shape.ndims):
    dim = shape[i]
    # loop body...
在这种情况下,
dim
将是包含张量维度的TensorFlow值,因此您只能使用它来计算其他张量,但所有维度都保证已定义

最后,如果你甚至不知道张量中的维数,你将无法对形状进行规则的循环。如果有的话,你可以做一些你需要的事情:

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中使用的自定义损失函数中的批量大小。然而,这最终变得相当复杂,因为我有下游函数依赖于与批量大小相等的列表。