当 .grad 为 None 时,如何使用 pytorch 中的这个简单神经网络向后优化输入层的权重

how do I optmize the weights of the input layer using backward for this simple neural network in pytorch when .grad is None

我定义了以下简单的神经网络:

import torch
import torch.nn as nn

X = torch.tensor(([1, 2]), dtype=torch.float)
y = torch.tensor([1.])
learning_rate = 0.001

class Neural_Network(nn.Module):
    def __init__(self, ):
        super(Neural_Network, self).__init__()
        
        self.W1 = torch.nn.Parameter(torch.tensor(([1, 0], [2, 3]), dtype=torch.float, requires_grad=True))
        self.W2 = torch.nn.Parameter(torch.tensor(([2], [1]), dtype=torch.float, requires_grad=True))
        
    def forward(self, X):
        self.xW1 = torch.matmul(X, self.W1)
        self.h = torch.tensor([torch.tanh(self.xW1[0]), torch.tanh(self.xW1[1])])
        return torch.sigmoid(torch.matmul(self.h, self.W2))
        
net = Neural_Network() 

for z in range(60):
    loss = (y - net(X))**2
    optim = torch.optim.SGD(net.parameters(), lr=learning_rate, momentum=0.9)
    loss = criterion(net(X), y)
    loss.backward()
    optim.step()

我可以 运行 并且 print(net.W1) print(net.W2) 打印

Parameter containing:
tensor([[1., 0.],
        [2., 3.]], requires_grad=True)
Parameter containing:
tensor([[2.0078],
        [1.0078]], requires_grad=True)

所以我的问题是 W1 似乎没有更新。 当我调用 print(net.W1.grad) 时,每次迭代都会得到 None,这让我很困惑。

如何使用 backward() 优化 W1

我怀疑是下面一行:

self.h = torch.tensor([torch.tanh(self.xW1[0]), torch.tanh(self.xW1[1])])

是罪魁祸首。

新张量 self.h 不继承 self.xW1requires_grad 属性,默认设置为 False.

您可以调用 self.h = self.tanh(self.xW1),然后该操作将逐点应用于 self.xW1 的所有元素。

此外,我建议您使用 PyTorch hooks.

检查您的渐变