【问题标题】:Opposite to expected behavior [PyTorch]与预期行为相反 [PyTorch]
【发布时间】:2020-05-05 14:01:28
【问题描述】:

我有一个类别严重不平衡的数据集(bank-additional-full)。除了将值分配给分类变量之外,我正在使用它而没有进行任何更改。它有大约 89% 的类别为否 (0) 和 11% 的类别为是 (1)。

我的模型总是预测是(减少一个),并且改变学习率也没有效果。它应该更频繁地预测具有更大计数的类,即没有

我正在学习 pytorch,所以请告诉我我的错误,因为我很难找到它。

class LogisticRegressionModel(nn.Module):
  def __init__(self, input_dim, output_dim):
      super(LogisticRegressionModel, self).__init__()
      self.linear = nn.Linear(input_dim, output_dim)
  def forward(self, x):

      out = F.softmax(self.linear(x),dim=1)
      return out

 input_dim = 1*20 
 output_dim = 2

 model = LogisticRegressionModel(input_dim, output_dim)
 criterion = nn.CrossEntropyLoss()
 learning_rate = 0.01
 optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)

 iter = 0
num_epochs= 10
train_losses, val_losses = [], []
for epoch in range(num_epochs):
  running_loss = 0
  for i, (x, labels) in enumerate(train_loader):

      x = Variable(x.view(-1, height*width))
      labels = Variable(labels)     
      optimizer.zero_grad()        
      outputs = model(x.float())       
      loss = criterion(outputs, labels)      
      loss.backward()

      optimizer.step()

      running_loss += loss.item()

      iter += 1

  else:
      val_loss = 0


      correct = 0
      total = 0
      with torch.no_grad():

          for x, labels in val_loader:

              x = Variable(x.view(-1,height*width))                             
              outputs = model(x.float())

              val_loss += criterion(outputs, labels)

              values, predicted = torch.max(outputs.data, 1)
              #print(values.data)    


              total += labels.size(0)

              correct += (predicted == labels).sum()                


      accuracy = 100 * correct / total

      train_losses.append(running_loss/len(train_loader))
      val_losses.append(val_loss/len(val_loader))

      print("Epoch: {}/{}.. ".format(epoch+1, num_epochs),
                "Training Loss: {:.3f}.. ".format(running_loss/len(train_loader)),
                "Validation Loss: {:.3f}.. ".format(val_loss/len(val_loader)),
                "Validation Accuracy: {:.3f}".format(accuracy))

      print("\n")



结果: Epoch:1/10.. 训练损失:1.201.. 验证损失:1.202.. 验证准确度:11.000

损失和准确性保持不变

【问题讨论】:

    标签: python pytorch logistic-regression


    【解决方案1】:

    在给定的代码中,权重没有更新。如果你跑

    list(model.parameters())[0].grad
    

    你会得到

    tensor([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
            [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])
    

    或无。由于梯度为零,权重不会更新。

    如果您将 F.softmax(out) 更改为 F.log_softmax(out),它可以解决问题。 目前我还没有深入了解它为什么会发生。但您可以访问: https://discuss.pytorch.org/t/weights-never-update-while-training/8418/9

    这个链接有一些解释

    编辑:

    @jodag 给出的评论解释了真正的问题。

    【讨论】:

    • 在申请CrossEntropyLoss之前不要服用softmax或log_softmax。 CrossEntropyLoss 在内部同时执行 log_softmax 和 nll_loss。
    • 没有正确阅读文档对我来说是一个非常愚蠢的错误。谢谢你告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 2017-03-25
    相关资源
    最近更新 更多