将Tensor中的某些元素随机设置为零(计算时间较短)

toiithl6  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(507)

我有一个形状Tensor (3072,1000) 它代表了我神经网络中的权重。我想:
将其60%的元素随机设置为零。
在更新权重后,保持60%的元素等于零,但再次是随机的,即不相同的先前元素。
注:我的网络不是通常的人工神经网络,它使用反向传播算法,但它是大脑中神经元的生物物理模型,所以我使用特殊的权值更新规则。因此,我认为pytorch中的ready函数(如果有的话)可能没有帮助。
我尝试了下面的代码,它是工作,但它需要很长时间,因为每次我更新我的重量Tensor,我必须运行该代码设置重量Tensor再次为60%零

row_indices = np.random.choice(np.size(mytensor.weight, 0),
                       replace=False,size=int(np.size(mytensor.weight, 0)* 0.6))
column_indices = np.random.choice(np. size(mytensor.weight, 1),
                       replace=False, size=int(np. size(mytensor.weight, 1) * 0.6))
for r in row_indices:
    for c in column_indices:
        (mytensor.weight)[r][c] = 0
vdgimpew

vdgimpew1#

你可以用 dropout 此函数:

import torch.nn.functional as F

my_tensor.weight = F.dropout(my_tensor.weight, p=0.6)
vwkv1x7d

vwkv1x7d2#

如果你想将大约60%的权重设置为0,那么iacob的答案是完美的。如果你想准确的设定 m 你的Tensor值为零,你就可以用这样的方法

n = mytensor.weight.numel()
m = int(round(n*0.6))
indices = np.random.choice(n, m, replace=False) # alternative: indices = torch.randperm(n)[:m]
mytensor.weight = mytensor.weight.contiguous()  
mytensor.weight.flatten()[indices] = 0

相关问题