【问题标题】:How can I apply dropout per row of a 2d tensor in pytorch我如何在pytorch中应用每行二维张量的dropout
【发布时间】:2023-01-31 04:29:03
【问题描述】:

我有一个(相对稀疏的)2d 张量 U,形状为 1 和 0 的 (B, I)。每行代表一个用户,每列代表一个项目,如果用户与所述项目交互,则单元格为 1,否则为 0。

我想应用 dropout(或类似的张量操作),以便随机地,p% of the 1s在每一行(即每个用户)设置为 0。

如果没有沿 B 维度的 for 循环,我如何才能有效地做到这一点(在考虑 0 之后,我将在第 1d 张量行上使用 pytorch 的 dropout)?

【问题讨论】:

    标签: pytorch torch dropout


    【解决方案1】:

    如果我理解正确的话,你想手动构建网络吗?一种方法是在每次运行时创建一个布尔数组(与您的权重大小相同)。然后在使用它之前将其乘以重量。

    dropout = torch.randint(2, (10,))
    weights = torch.randn(10)
    dr_wt = dropout * weights
    

    编辑

    您可以创建一个包含 10% 1 其余 0 的数组。然后每次运行都将其洗牌以乘以权重。

    a = np.zeros(10)
    a[0] = 1
    np.random.shuffle(a)
    a = torch.as_tensor(a)
    

    【讨论】:

    • 我感兴趣的是如何创建那个布尔数组,以便每行中 10% 的 1 得到一个 False 值,其余 90% 的 1 得到一个 True 值(0 有什么值并不重要,因为它们已经为零)。
    • 以上编辑是否适用于您的情况?
    • 不是真的,因为我仍然需要在一个循环中分别为每一行应用它,这太慢了。
    【解决方案2】:

    如果我错了请纠正我,但是如果你说你希望每行 p% 的 1 变成 0,那么第 0 行可能有 10 个 1,第 1 行可能有 100 个。当你平均应用 dropout 时,只有一个1s 受到 dropout mask 的影响,而第二行大约有 10 受到影响。

    def dropout(input: Tensor, p: float = 0.5):
        mask = torch.rand_like(input) > p # creates a bool tensor
        return input * mask
    

    我不知道在不使用某种基于行的非零索引采样的情况下,您如何能够保证恰好 10% 被清空,而这又需要一个 for 循环。

    【讨论】:

      猜你喜欢
      • 2019-09-15
      • 2020-09-26
      • 1970-01-01
      • 1970-01-01
      • 2022-11-14
      • 1970-01-01
      • 1970-01-01
      • 2018-06-08
      • 2020-12-18
      相关资源
      最近更新 更多