如何在 Tensorflow 中更新多维张量的一组特定索引
How to update the a specific set of indices of a multi-dimensional tensor in Tensorflow
我有这个形状为 [1,32,32,155] 的多维张量,我想更新它
[:,:,:,0:27] 指数。
在 pytorch 中,只需使用索引赋值即可做到这一点,即 [:,:,:,0:27] = [1,32,32,27]。
Tensorflow 当前不支持索引分配。因此,我的第一次尝试是执行以下操作:
feat_ch = tf.unstack(feat, axis=3)
feat_ch[0:self.ncIn] = tf.unstack(upFeat, axis=3 )
feat = tf.stack(feat_ch, axis=3)
feat_ch 是 [1,32,32,155],upFeat 是张量 [1,32,32,27]。
这里的想法是折叠通道维度上的 feat_ch 张量,这样我得到一个包含 155 个条目的列表,其中包含 1,32,32。然后用 upFeat 做同样的事情,然后用 upFeat 的第 27 个替换 feat_ch 列表的前 27 个。最后,将它们堆叠起来再次得到 [1,32,32,155] 形状的张量(这次更新了前 27 个通道)
但是,我不确定它是否符合我的要求。所以我开始研究还有什么其他的更新方法。
Tensorflow 有一个方法tensor_scatter_nd_update,这似乎正是我想要的。但是,我发现很难全神贯注。到目前为止我尝试过的是:
i1, i2, i3, i4 = tf.meshgrid(tf.range(1),
tf.range(32), tf.range(32), tf.range(27) , indexing="ij") #shape [1,32,32,27]
feat = tf.tensor_scatter_nd_update(feat, i1, upFeat)
这里的想法是创建一个相同形状的网格,并且每个元素都对应于我希望更新的专长的索引。但是,这不起作用并抛出以下内容:
The inner -23 dimensions of output.shape=[1,32,32,155] must match the inner 1 dimensions of updates.shape=[1,32,32,27]: Shapes must be equal rank, but are 0 and 1
我理解错了吗?为什么它不起作用?如何更新 ND 张量?
谢谢
使用切片和concat
:
feat = tf.random.uniform([1, 32, 32, 155])
updates = tf.zeros([1, 32, 32, 27])
result = tf.concat((feat[:,:,:,27:], updates), -1)
我有这个形状为 [1,32,32,155] 的多维张量,我想更新它 [:,:,:,0:27] 指数。
在 pytorch 中,只需使用索引赋值即可做到这一点,即 [:,:,:,0:27] = [1,32,32,27]。 Tensorflow 当前不支持索引分配。因此,我的第一次尝试是执行以下操作:
feat_ch = tf.unstack(feat, axis=3)
feat_ch[0:self.ncIn] = tf.unstack(upFeat, axis=3 )
feat = tf.stack(feat_ch, axis=3)
feat_ch 是 [1,32,32,155],upFeat 是张量 [1,32,32,27]。 这里的想法是折叠通道维度上的 feat_ch 张量,这样我得到一个包含 155 个条目的列表,其中包含 1,32,32。然后用 upFeat 做同样的事情,然后用 upFeat 的第 27 个替换 feat_ch 列表的前 27 个。最后,将它们堆叠起来再次得到 [1,32,32,155] 形状的张量(这次更新了前 27 个通道)
但是,我不确定它是否符合我的要求。所以我开始研究还有什么其他的更新方法。
Tensorflow 有一个方法tensor_scatter_nd_update,这似乎正是我想要的。但是,我发现很难全神贯注。到目前为止我尝试过的是:
i1, i2, i3, i4 = tf.meshgrid(tf.range(1),
tf.range(32), tf.range(32), tf.range(27) , indexing="ij") #shape [1,32,32,27]
feat = tf.tensor_scatter_nd_update(feat, i1, upFeat)
这里的想法是创建一个相同形状的网格,并且每个元素都对应于我希望更新的专长的索引。但是,这不起作用并抛出以下内容:
The inner -23 dimensions of output.shape=[1,32,32,155] must match the inner 1 dimensions of updates.shape=[1,32,32,27]: Shapes must be equal rank, but are 0 and 1
我理解错了吗?为什么它不起作用?如何更新 ND 张量?
谢谢
使用切片和concat
:
feat = tf.random.uniform([1, 32, 32, 155])
updates = tf.zeros([1, 32, 32, 27])
result = tf.concat((feat[:,:,:,27:], updates), -1)