如何屏蔽 PyTorch 权重参数中的权重?

DVK*_*DVK 7 python lstm pytorch

我试图在 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)
Run Code Online (Sandbox Code Playgroud)

掩码也定义def __init__

self.mask_use = torch.Tensor(curernt_output, input_dim)
Run Code Online (Sandbox Code Playgroud)

掩码是一个常数,.requires_grad_()False掩码参数。现在在def forward课程的一部分中,我尝试在线性运算完成之前对权重参数和掩码进行元素乘法

def forward(self, x):
    ....
    self.wfx.weight = self.wfx.weight * self.mask_use
    wfx_out = self.wfx(x)
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息:

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)
Run Code Online (Sandbox Code Playgroud)

但是当我检查这两个参数时.type(),它们都显示为torch.cuda.FloatTensor. 我不确定为什么这里有错误。

blu*_*nox 7

按元素操作总是返回 a 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)
Run Code Online (Sandbox Code Playgroud)

免责声明:在=权重上使用(赋值)时,您将替换参数的权重张量。这可能会对图形产生不良影响。优化步骤。

  • 谢谢@blue-phoenox,也将把它切换到`self.wfx.weight.data.mul_(self.mask_use)` 来规避使用`=` 可能出现的问题 (2认同)