[英]How to mask weights in PyTorch weight parameters?
我试图在 PyTorch 中屏蔽(强制为零)特定的权重值。 我试图屏蔽的权def __init__
是这样定义的
class LSTM_MASK(nn.Module):
def __init__(self, options, inp_dim):
super(LSTM_MASK, self).__init__()
....
self.wfx = nn.Linear(input_dim, curernt_output, bias=add_bias)
掩码也在def __init__
定义为
self.mask_use = torch.Tensor(curernt_output, input_dim)
掩码是一个常量,掩码参数的.requires_grad_()
为False
。 现在在类的def forward
部分中,我尝试在线性运算完成之前对权重参数和掩码进行元素乘法
def forward(self, x):
....
self.wfx.weight = self.wfx.weight * self.mask_use
wfx_out = self.wfx(x)
我收到一条错误消息:
self.wfx.weight = self.wfx.weight * self.mask_use
File "/home/xyz/anaconda2/lib/python2.7/site-packages/torch/nn/modules/module.py", line 537, in __setattr__
.format(torch.typename(value), name))
TypeError: cannot assign 'torch.cuda.FloatTensor' as parameter 'weight' (torch.nn.Parameter or None expected)
但是当我用.type()
检查这两个参数时,它们都作为torch.cuda.FloatTensor
。 我不确定为什么这里有错误。
按元素操作总是返回一个FloatTensor
。 不可能将正常张量指定为层的weight
。
有两种可能的选择来处理它。 您可以将其分配给您的权重的data
属性,在那里可以分配正常的张量。
或者,您将结果转换为nn.Parameter
本身,然后您可以将其分配给wfx.weight
。
这是一个显示两种方式的示例:
import torch
import torch.nn as nn
wfx = nn.Linear(10, 10)
mask_use = torch.rand(10, 10)
#wfx.weight = wfx.weight * mask_use #your example - this raises an error
# Option 1: write directly to data
wfx.weight.data = wfx.weight * mask_use
# Option 2: convert result to nn.Parameter and write to weight
wfx.weight = nn.Parameter(wfx.weight * mask_use)
免责声明:在权重上使用=
(赋值)时,您将替换参数的权重张量。 这可能会对图形产生不良影响。 优化步骤。
将 Tensorfloat 变量更改为参数变量的一种有效方法:
self.wfx.weight = torch.nn.parameter.Parameter((self.wfx.weight.data * self.mask_use))
我希望这会很有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.