Python PyTorch optimizer.step()函数不使用';t更新权重

Python PyTorch optimizer.step()函数不使用';t更新权重,python,deep-learning,pytorch,perceptron,Python,Deep Learning,Pytorch,Perceptron,代码如下所示。 问题是,optimizer.step()部分不工作。我在训练前后打印model.parameters(),重量不变 我想做一个能解决和问题的感知机。我用自己的微型库成功地做到了这一点,在那里我实现了一个具有两个函数的感知器predict()和train() 我只是想澄清一下,我刚刚开始使用PyTorch学习深度学习,所以这可能是一个非常新的问题。我试过寻找解决办法,但运气不好。我还将我的代码与其他有效的代码进行了比较,但我不知道我做错了什么 import torch from t

代码如下所示。
问题是,
optimizer.step()
部分不工作。我在训练前后打印
model.parameters()
,重量不变

我想做一个能解决和问题的感知机。我用自己的微型库成功地做到了这一点,在那里我实现了一个具有两个函数的感知器
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()))

欢迎来到stackoverflow

这里的问题是您试图通过不可微函数执行反向传播。不可微意味着没有梯度可以通过它们回流,这意味着在它们之前应用的所有可训练权重不会被优化器更新。这些功能易于识别;它们是离散的、尖锐的操作,类似于
'if'
语句。在您的例子中,它是
sign()
函数


不幸的是,PyTorch在这方面不做任何牵手,也不会向您指出这个问题。要缓解这个问题,您可以将输出的范围转换为
[-1,1]
,并应用
Tanh()
非线性,而不是
sign()
clamp()
运算符。

这两者之间的clamp不是可区分的吗?