gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:49:32 26 4
gpt4 key购买 nike

我正在尝试屏蔽(强制为零)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。不可能将正态张量分配为层的权重

有两种可能的选择来处理它。您可以将其分配给体重的 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)

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

关于python - 如何屏蔽 PyTorch 权重参数中的权重?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53544901/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com