PyTorch Optimizer.step()函数不会更新权重

时间:2018-12-04 22:00:20

标签: python deep-learning pytorch perceptron

代码可以在下面看到。
问题是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()))

1 个答案:

答案 0 :(得分:2)

欢迎来到stackoverflow!

这里的问题是您试图通过不可微函数执行反向传播。不可微表示没有梯度可以流经它们,这意味着优化器不会更新它们之前应用的所有可训练权重。这些功能很容易发现;它们是离散的,尖锐的操作,类似于'if'语句。您的情况是sign()函数。

不幸的是,PyTorch在这方面没有任何帮助,也不会指出您的问题。您可以采取的缓解措施是将输出范围转换为[-1,1]并应用Tanh()非线性而不是sign()clamp()运算符。