【问题标题】:How to update the a specific set of indices of a multi-dimensional tensor in Tensorflow如何在 Tensorflow 中更新多维张量的一组特定索引
【发布时间】: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


    【解决方案1】:

    使用切片和concat:

    feat = tf.random.uniform([1, 32, 32, 155])
    updates = tf.zeros([1, 32, 32, 27])
    result = tf.concat((feat[:,:,:,27:], updates), -1)
    

    【讨论】:

      猜你喜欢
      • 2018-03-03
      • 1970-01-01
      • 2020-09-23
      • 2017-08-25
      • 2019-12-18
      • 1970-01-01
      • 1970-01-01
      • 2020-10-26
      • 1970-01-01
      相关资源
      最近更新 更多