在 pytorch 中分配自定义权重
Assign custom weight in pytorch
我正在尝试为我的 PyTorch 模型分配一些自定义权重,但它无法正常工作。
class Mod(nn.Module):
def __init__(self):
super(Mod, self).__init__()
self.linear = nn.Sequential(
nn.Linear(1, 5)
)
def forward(self, x):
x = self.linear(x)
return x
mod = Mod()
mod.linear.weight = torch.tensor([1. ,2. ,3. ,4. ,5.], requires_grad=True)
mod.linear.bias = torch.nn.Parameter(torch.tensor(0., requires_grad=True))
print(mod.linear.weight)
>>> tensor([1., 2., 3., 4., 5.], requires_grad=True)
output = mod(torch.ones(1))
print(output)
>>> tensor([ 0.2657, 0.3220, -0.0726, -1.6987, 0.3945], grad_fn=<AddBackward0>)
预期输出为 [1., 2., 3., 4., 5.] 但它没有按预期工作。我在这里错过了什么?
您没有在正确的地方更新权重。您的 self.linear
不是 一个 nn.Linear
层,而是一个 nn.Sequential
容器。您的 nn.Linear
是顺序中的第一层。要访问它,您需要索引 self.linear
:
with torch.no_grad():
mod.linear[0].weight.data = torch.tensor([1. ,2. ,3. ,4. ,5.], requires_grad=True)[:, None]
mod.linear[0].bias.data = torch.zeros((5, ), requires_grad=True) # bias is not a scalar here
我正在尝试为我的 PyTorch 模型分配一些自定义权重,但它无法正常工作。
class Mod(nn.Module):
def __init__(self):
super(Mod, self).__init__()
self.linear = nn.Sequential(
nn.Linear(1, 5)
)
def forward(self, x):
x = self.linear(x)
return x
mod = Mod()
mod.linear.weight = torch.tensor([1. ,2. ,3. ,4. ,5.], requires_grad=True)
mod.linear.bias = torch.nn.Parameter(torch.tensor(0., requires_grad=True))
print(mod.linear.weight)
>>> tensor([1., 2., 3., 4., 5.], requires_grad=True)
output = mod(torch.ones(1))
print(output)
>>> tensor([ 0.2657, 0.3220, -0.0726, -1.6987, 0.3945], grad_fn=<AddBackward0>)
预期输出为 [1., 2., 3., 4., 5.] 但它没有按预期工作。我在这里错过了什么?
您没有在正确的地方更新权重。您的 self.linear
不是 一个 nn.Linear
层,而是一个 nn.Sequential
容器。您的 nn.Linear
是顺序中的第一层。要访问它,您需要索引 self.linear
:
with torch.no_grad():
mod.linear[0].weight.data = torch.tensor([1. ,2. ,3. ,4. ,5.], requires_grad=True)[:, None]
mod.linear[0].bias.data = torch.zeros((5, ), requires_grad=True) # bias is not a scalar here