【问题标题】:torch assign not in place by tensor slicing in pytorch通过 pytorch 中的张量切片,火炬分配不到位
【发布时间】:2020-03-31 02:24:19
【问题描述】:

我正在尝试将分配张量的当前代码转换为外部操作。
意思是目前的代码是

self.X[:, nc:] = D

其中 D 的形状与 self.X[:, nc:] 相同
但我想将其转换为

sliced_index = ~ somehow create an indexed tensor from self.X[:, nc:]
self.X = self.X.scatter(1,sliced_index,mm(S_, Z[:, :n - nc]))

并且不知道如何创建仅表示切片张量中的条目的索引掩码张量

小例子:

a = [[0,1,2],[3,4,5]]
D = [[6],[7]]
Not_in_place = [[0,1,6],[3,4,7]]

【问题讨论】:

    标签: python pytorch


    【解决方案1】:

    蒙版散点图更容易一些。掩码本身可以计算为就地操作,之后您可以使用masked_scatter

    mask = torch.zeros(self.X.shape, device=self.X.device, dtype=torch.bool)
    mask[:, nc:] = True
    self.X = self.X.masked_scatter(mask, D)
    

    依赖于广播但应该更高效的更专业的版本是

    mask = torch.zeros([1, self.X.size(1)], device=self.X.device, dtype=torch.bool)
    mask[0, nc:] = True
    self.X = self.X.masked_scatter(mask, D)
    

    【讨论】:

    • 是的,哈哈这也回复了我发的另一篇帖子,没想到谢谢!
    【解决方案2】:

    使用Tensor.clone 复制张量。

    a = torch.tensor([[0,1,2],[3,4,5]])
    D = torch.tensor([[6],[7]])
    
    n, n[:,-1:] = a.clone(), D
    n
    tensor([[0, 1, 6],
            [3, 4, 7]])
    a
    tensor([[0, 1, 2],
            [3, 4, 5]])
    

    【讨论】:

    • 这个方法仍然使用赋值,我想避免因为涉及到后退步骤(不允许自我赋值)
    • 然后试试这个a.clone().detach()
    • 分离后你会完全失去渐变
    猜你喜欢
    • 2020-11-08
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 2022-07-20
    • 2018-04-29
    • 2020-01-28
    • 2020-08-27
    • 2021-01-14
    相关资源
    最近更新 更多