PyTorch optimizer.step() 函数不更新权重
PyTorch optimizer.step() function doesn't update weights
代码见下
问题是 optimizer.step()
部分不起作用。我在训练前后打印 model.parameters()
,权重没有改变。
我正在尝试制作一个可以解决 AND 问题的感知器。我用我自己的小库成功地做到了这一点,我在其中实现了一个具有两个函数 predict()
和 train()
的感知器。
澄清一下,我刚刚开始使用 PyTorch 学习深度学习,所以这可能是一个非常新手的问题。我试过寻找解决方案,但没有运气。我还将我的代码与其他有效的代码进行了比较,但我不知道我做错了什么。
import torch
from torch import nn, optim
from random import randint
class NeuralNet(nn.Module):
def __init__(self):
super(NeuralNet, self).__init__()
self.layer1 = nn.Linear(2, 1)
def forward(self, input):
out = input
out = self.layer1(out)
out = torch.sign(out)
out = torch.clamp(out, 0, 1) # 0=false, 1=true
return out
data = torch.Tensor([[0, 0], [0, 1], [1, 0], [1, 1]])
target = torch.Tensor([0, 0, 0, 1])
model = NeuralNet()
epochs = 1000
lr = 0.01
print(list(model.parameters()))
print() # Print parameters before training
loss_func = nn.L1Loss()
optimizer = optim.Rprop(model.parameters(), lr)
for epoch in range(epochs + 1):
optimizer.zero_grad()
rand_int = randint(0, len(data) - 1)
x = data[rand_int]
y = target[rand_int]
pred = model(x)
loss = loss_func(pred, y)
loss.backward()
optimizer.step()
# Print parameters again
# But they haven't changed
print(list(model.parameters()))
欢迎使用 Whosebug!
这里的问题是您正试图通过不可微函数执行反向传播。不可微意味着没有梯度可以通过它们回流,这意味着优化器不会更新在它们之前应用的所有可训练权重。这些功能很容易被发现;它们是离散的、尖锐的操作,类似于 'if'
语句。在您的情况下,它是 sign()
函数。
不幸的是,PyTorch 没有在这方面提供任何帮助,也不会向您指出这个问题。您可以做些什么来缓解这个问题,将输出范围转换为 [-1,1]
并应用 Tanh()
非线性而不是 sign()
和 clamp()
运算符。
代码见下
问题是 optimizer.step()
部分不起作用。我在训练前后打印 model.parameters()
,权重没有改变。
我正在尝试制作一个可以解决 AND 问题的感知器。我用我自己的小库成功地做到了这一点,我在其中实现了一个具有两个函数 predict()
和 train()
的感知器。
澄清一下,我刚刚开始使用 PyTorch 学习深度学习,所以这可能是一个非常新手的问题。我试过寻找解决方案,但没有运气。我还将我的代码与其他有效的代码进行了比较,但我不知道我做错了什么。
import torch
from torch import nn, optim
from random import randint
class NeuralNet(nn.Module):
def __init__(self):
super(NeuralNet, self).__init__()
self.layer1 = nn.Linear(2, 1)
def forward(self, input):
out = input
out = self.layer1(out)
out = torch.sign(out)
out = torch.clamp(out, 0, 1) # 0=false, 1=true
return out
data = torch.Tensor([[0, 0], [0, 1], [1, 0], [1, 1]])
target = torch.Tensor([0, 0, 0, 1])
model = NeuralNet()
epochs = 1000
lr = 0.01
print(list(model.parameters()))
print() # Print parameters before training
loss_func = nn.L1Loss()
optimizer = optim.Rprop(model.parameters(), lr)
for epoch in range(epochs + 1):
optimizer.zero_grad()
rand_int = randint(0, len(data) - 1)
x = data[rand_int]
y = target[rand_int]
pred = model(x)
loss = loss_func(pred, y)
loss.backward()
optimizer.step()
# Print parameters again
# But they haven't changed
print(list(model.parameters()))
欢迎使用 Whosebug!
这里的问题是您正试图通过不可微函数执行反向传播。不可微意味着没有梯度可以通过它们回流,这意味着优化器不会更新在它们之前应用的所有可训练权重。这些功能很容易被发现;它们是离散的、尖锐的操作,类似于 'if'
语句。在您的情况下,它是 sign()
函数。
不幸的是,PyTorch 没有在这方面提供任何帮助,也不会向您指出这个问题。您可以做些什么来缓解这个问题,将输出范围转换为 [-1,1]
并应用 Tanh()
非线性而不是 sign()
和 clamp()
运算符。