如何在pytorch中应用2dTensor的每行丢弃

1u4esq0p  于 2023-02-04  发布在  其他
关注(0)|答案(2)|浏览(156)

我有一个(相对稀疏的)2dTensorU,形状为(B, I),其中每行表示一个用户,每列表示一个项目,如果用户与所述项目交互,则单元格为1,否则为0。
我想应用dropout(或类似的Tensor运算),这样每行**(即每个用户)中的1**的p%随机设置为0。
B维度上没有for循环(在这里,我只需要在第1d行Tensor上使用pytorch的dropout,在考虑了0之后),我怎么能有效地完成这个任务呢?

laximzn5

laximzn51#

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

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

编辑

你可以创建一个10%为1其余为0的数组。然后每次运行都将其 Shuffle 以乘以权重。

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

rdlzhqv92#

如果我说的不对,请纠正我,但是如果您说您希望每行有p%的1变为0,那么第0行可能有10个1,第1行可能有100个1。当您平均应用删除时,只有一个1受到删除掩码的影响,而第二行中大约有10个1受到影响。

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

我不知道如何才能保证正好10%的索引为空,而不使用某种基于行的非零索引采样,这反过来又需要一个for循环。

相关问题