【问题标题】:How to randomly set a fixed number of elements in each row of a tensor in PyTorch如何在 PyTorch 中的张量的每一行中随机设置固定数量的元素
【发布时间】:2020-10-03 02:46:29
【问题描述】:

我想知道下面的代码是否有更有效的替代方法,而不使用第 4 行中的“for”循环?

import torch
n, d = 37700, 7842
k = 4
sample = torch.cat([torch.randperm(d)[:k] for _ in range(n)]).view(n, k)
mask = torch.zeros(n, d, dtype=torch.bool)
mask.scatter_(dim=1, index=sample, value=True)

基本上,我要做的是通过d 掩码张量创建一个n,这样每一行中的k 随机元素都是True。

【问题讨论】:

    标签: pytorch


    【解决方案1】:

    这是一种无需循环的方法。让我们从一个随机矩阵开始,其中所有元素都是独立同分布的,在这种情况下,均匀分布在 [0,1] 上。然后我们取每行的第 k 个分位数,并将每行所有较小或相等的元素设置为 True,其余元素设置为 False:

    rand_mat = torch.rand(n, d)
    k_th_quant = torch.topk(rand_mat, k, largest = False)[0][:,-1:]
    mask = rand_mat <= k_th_quant
    

    不需要循环 :) x2.1598 比你在我的 CPU 上附加的代码快。

    【讨论】:

    • 不错的答案,但是,我认为我应该为您提供 ndk 的实际值,我在代码中实际使用了这些值(我编辑了问题)。使用 n=37700d=7842k=4,我自己的代码在我的 CPU 上运行大约 5 秒,而你的大约需要 18 秒。
    • 谢谢,所以我已经更新了它,现在它对于你的新值 n、d 和 k 更好更快。我的需要 2.44 秒,而你的需要 5.27 秒。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2021-09-14
    相关资源
    最近更新 更多