Python 如何在Tensorflow中更新2D张量的子集?

Python 如何在Tensorflow中更新2D张量的子集?,python,neural-network,tensorflow,deep-learning,Python,Neural Network,Tensorflow,Deep Learning,我想用值0更新2D张量中的索引。所以数据是一个二维张量,其第二行第二列索引值将被0替换。但是,我得到了一个类型错误。有人能帮我吗 TypeError:“ScatterUpdate”Op的输入“ref”需要l值输入 分散更新仅适用于变量。相反,尝试这种模式 Tensorflow版本=1.0: a=tf.concat(轴=0,值=[a[:i],[updated_value],a[i+1:] tf.scatter\u update只能应用于变量类型data是一个变量,而data2不是,因为tf.re

我想用值0更新2D张量中的索引。所以数据是一个二维张量,其第二行第二列索引值将被0替换。但是,我得到了一个类型错误。有人能帮我吗

TypeError:“ScatterUpdate”Op的输入“ref”需要l值输入


分散更新仅适用于变量。相反,尝试这种模式

Tensorflow版本<1.0:

a=tf.concat(0,[a[:i],[updated_value],a[i+1:]

Tensorflow版本>=1.0:

a=tf.concat(轴=0,值=[a[:i],[updated_value],a[i+1:]

tf.scatter\u update
只能应用于
变量
类型<代码中的code>data是一个
变量,而
data2
不是,因为
tf.reformate
的返回类型是
Tensor

解决方案:

对于v1.0之后的tensorflow

对于v1.0之前的tensorflow


无效:ValueError:两个形状中的尺寸0必须相等,但在将形状1与其他形状合并时为1和2。对于输入形状为[2]、[1]、[2]的“concat/concat_dim”(op:“Pack”)。@AntonioSesto TensorFlow v1.0更改了一些界面,以与numpy保持一致
concat
是变化之一。我编辑了我的答案以使用v1.0。一般来说,根据更新的复杂程度以及您是否计划将此过程作为大图的一部分,您可能需要查看
tf.py_func
,这是一个允许您在tf图中添加numpy操作的包装器。非常有用,回答应该被问到的问题为什么tensorflow 2没有这个功能?
data = tf.Variable([[1,2,3,4,5], [6,7,8,9,0], [1,2,3,4,5]])
data2 = tf.reshape(data, [-1])
sparse_update = tf.scatter_update(data2, tf.constant([7]), tf.constant([0]))
#data = tf.reshape(data, [N,S])
init_op = tf.initialize_all_variables()

sess = tf.Session()
sess.run([init_op])
print "Values before:", sess.run([data])
#sess.run([updated_data_subset])
print "Values after:", sess.run([sparse_update])
data = tf.Variable([[1,2,3,4,5], [6,7,8,9,0], [1,2,3,4,5]])
row = tf.gather(data, 2)
new_row = tf.concat([row[:2], tf.constant([0]), row[3:]], axis=0)
sparse_update = tf.scatter_update(data, tf.constant(2), new_row)
data = tf.Variable([[1,2,3,4,5], [6,7,8,9,0], [1,2,3,4,5]])
row = tf.gather(data, 2)
new_row = tf.concat(0, [row[:2], tf.constant([0]), row[3:]])
sparse_update = tf.scatter_update(data, tf.constant(2), new_row)