gpt4 book ai didi

python - 使用 tf.shape(tensor) 作为循环的界限

转载 作者:太空宇宙 更新时间:2023-11-03 13:58:31 24 4
gpt4 key购买 nike

在 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...

其中 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])

关于python - 使用 tf.shape(tensor) 作为循环的界限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49429888/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com