将张量中的某些元素随机设置为零(计算时间短)
Randomly set some elements in a tensor to zero (with low computational time)
我有一个形状为 (3072,1000)
的张量,它代表我的神经网络中的权重。我想:
- 随机将其 60% 的元素设置为零。
- 更新权重后,保持 60% 的元素等于零,但再次随机,即与之前的元素不同。
注意:我的网络不是通常使用反向传播算法的人工神经网络,而是大脑神经元的生物物理模型,所以我使用特殊的权重更新规则.因此,我认为pytorch中的现成函数,如果有的话,可能没有帮助。
我尝试了以下代码,它可以工作,但需要很长时间,因为每次更新我的权重张量后,我都必须 运行 该代码再次将权重张量设置为 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
您可以为此使用 dropout
函数:
import torch.nn.functional as F
my_tensor.weight = F.dropout(my_tensor.weight, p=0.6)
如果你想将大约 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
我有一个形状为 (3072,1000)
的张量,它代表我的神经网络中的权重。我想:
- 随机将其 60% 的元素设置为零。
- 更新权重后,保持 60% 的元素等于零,但再次随机,即与之前的元素不同。
注意:我的网络不是通常使用反向传播算法的人工神经网络,而是大脑神经元的生物物理模型,所以我使用特殊的权重更新规则.因此,我认为pytorch中的现成函数,如果有的话,可能没有帮助。
我尝试了以下代码,它可以工作,但需要很长时间,因为每次更新我的权重张量后,我都必须 运行 该代码再次将权重张量设置为 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
您可以为此使用 dropout
函数:
import torch.nn.functional as F
my_tensor.weight = F.dropout(my_tensor.weight, p=0.6)
如果你想将大约 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