我想更新 3 维张量的一部分。正在关注How to do slice assignment in Tensorflow我会做类似的事情
import tensorflow as tf
with tf.Session() as sess:
init_val = tf.Variable(tf.zeros((2, 3, 3)))
indices = tf.constant([[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1]])
update = tf.scatter_nd_add(init_val, indices, tf.ones(4))
init = tf.global_variables_initializer()
sess.run(init)
print(sess.run(update))
这行得通,但由于我的实际问题更复杂,我想通过定义切片的开始和大小以某种方式自动生成索引集,例如,如果您使用 tf.slice(. ..)。你有什么想法?提前致谢!
我使用的是 TensorFlow 1.12,这是目前最新的版本。
请您参考如下方法:
tf.strided_slice支持传递一个 var 参数来指示切片引用的变量,所以当你传递它时它会返回一个可分配的对象(我不确定为什么他们不只是根据类型这样做输入的,但无论如何)。你可以这样做:
import tensorflow as tf
import numpy as np
var = tf.Variable(np.ones((3, 4), dtype=np.float32))
s = tf.strided_slice(var, [0, 2], [2, 3], var=var, name='var_slice')
s2 = s.assign([[2], [3]])
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init_op)
print(sess.run(s2))
输出:
[[1. 1. 2. 1.]
[1. 1. 3. 1.]
[1. 1. 1. 1.]]
请注意,在 tf.strided_slice 中您给出开始和结束索引(不包括结束),这与 tf.slice 不同。 ,你在哪里给开始和大小。此外,就目前的代码而言,您必须为切片或分配操作提供一个名称值(我认为这应该是一个错误并且会发生,因为 API 的那部分几乎只在内部使用)。
