【发布时间】:2021-03-24 13:26:56
【问题描述】:
我有这个形状为 [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 做同样的事情,然后将 feat_ch 列表的前 27 替换为 upFeat 的 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 张量?
谢谢
【问题讨论】:
标签: python tensorflow keras tensorflow2.0