【问题标题】:Randomly set some elements in a tensor to zero (with low computational time)将张量中的一些元素随机设置为零(计算时间短)
【发布时间】:2021-07-20 18:37:19
【问题描述】:

我有一个形状为 (3072,1000) 的张量,它代表我的神经网络中的权重。我想:

  1. 随机将其 60% 的元素设置为零。
  2. 更新权重后,保持 60% 的元素等于 0,但又是随机的,即不与之前的元素相同。

注意:我的网络不是通常使用反向传播算法的人工神经网络,而是大脑中神经元的生物物理模型,因此我使用了特殊的权重更新规则。因此,我认为 pytorch 中的 ready 函数(如果有的话)可能没有帮助。

我尝试了以下代码,它可以工作,但需要很长时间,因为每次更新我的权重张量后,我都必须运行该代码以再次将权重张量设置为 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

【问题讨论】:

    标签: python python-3.x pytorch dropout


    【解决方案1】:

    您可以为此使用dropout 函数:

    import torch.nn.functional as F
    
    my_tensor.weight = F.dropout(my_tensor.weight, p=0.6)
    

    【讨论】:

    • 请注意,这也会将其他值缩放 1/p
    【解决方案2】:

    如果您希望将大约 60% 的权重设置为 0,iacob 的答案是完美的。如果您想将张量中的 m 值完全设置为零,那么您可以使用类似这样的方法

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-13
      • 1970-01-01
      • 2017-05-27
      • 2015-02-09
      相关资源
      最近更新 更多