在pytorch中分配自定义权重

发布于 2025-01-11 03:56:08 字数 751 浏览 0 评论 0原文

我正在尝试为我的 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.] 但它没有按预期工作。我在这里缺少什么?

I'm trying to assign some custom weight to my PyTorch model but it doesn't work correctly.

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>)

The output is expected to be [1., 2., 3., 4., 5.] but it doesn't work as expected. What am I missing here?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

山色无中 2025-01-18 03:56:08

您没有在正确的位置更新权重。您的 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

You are not updating the weights in the right place. Your self.linear is not a nn.Linear layer, but rather a nn.Sequential container. Your nn.Linear is the first layer in the sequential. To access it you need to index 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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文