Python 使用tf.scatter_nd(idx,update,shape),shape具有动态分配的值

Python 使用tf.scatter_nd(idx,update,shape),shape具有动态分配的值,python,tensorflow,Python,Tensorflow,我想在某个索引处更新向量中的值。我发现我可以做我想做的事。但是我正在批处理这个操作,这样我就有了一个数组batch\u size*5,其中每一行都是我要更新的大小为5的向量。我的批处理大小是在运行时确定的 在使用时,shape参数采用一个张量,它是要生成的张量的形状。但是,如果第一个维度是在运行时确定的(例如,如果它是批大小),那么我会得到一个错误: TypeError: Input 'shape' of 'ScatterNd' Op has type int32 that does not m

我想在某个索引处更新向量中的值。我发现我可以做我想做的事。但是我正在批处理这个操作,这样我就有了一个数组
batch\u size*5
,其中每一行都是我要更新的大小为5的向量。我的批处理大小是在运行时确定的

在使用时,shape参数采用一个张量,它是要生成的张量的形状。但是,如果第一个维度是在运行时确定的(例如,如果它是批大小),那么我会得到一个错误:

TypeError: Input 'shape' of 'ScatterNd' Op has type int32 that does not match type int64 of argument 'indices'.
此错误实际上是由于形状变量的值为:[None,5]。ie生成一个大小为
batch\u size*5
的张量,用大小更新
batch\u size
并使用大小“batch\u size”的标记进行更新


如何在动态分配的空间上正确使用tf.scatter\u nd()

您可以使用动态形状,例如
tf.shape()

看看代码:

import tensorflow as tf 
import numpy as np

inputs = tf.placeholder(tf.int32, shape=[None, 5])

new_inputs = tf.scatter_nd(indices=[[0], [2]], 
                           updates=[[1,1,1,1,1], [1,1,1,1,1]],
                           shape=tf.shape(inputs))

with tf.Session() as sess:
    _new_np = sess.run(new_inputs, feed_dict={inputs: np.zeros([4, 5])})
print(_new_np)

这是你想要的吗

你试过投吗:tf.cast(var,tf.int32)不,我没有。但是你能将None类型转换为int32吗?int64中的不是维度,而是张量中的元素,所以你可以转换它并解决这个错误。如下所示:tf.scatter\u nd(tf.cast(index,tf.int32),…)我遇到的错误不是indicies参数,而是shape参数。张量中的一个元素是None,因为张量包含scatter\u nd()输出的形状。您的错误准确地描述了形状格式和标记格式之间的不匹配。你试过这个方法吗?这个方法有效(即让我通过错误),而且可能是正确的,但我仍在努力让图形编译,如果成功的话,我会标记它。