PyTorch神经网络无法学习

时间:2020-06-27 12:15:37

标签: machine-learning neural-network pytorch

我是PyTorch的新手,我正在尝试构建一个用于分类的简单神经网络。问题在于网络根本无法学习。我尝试了从0.3到1e-8的各种学习率,并且还尝试了对其进行较长时间的训练。我的数据很小,只有120个训练示例,批处理大小为16。这是代码

定义网络

model = nn.Sequential(nn.Linear(4999, 1000),
                  nn.ReLU(),
                  nn.Linear(1000,200),
                  nn.ReLU(),
                  nn.Linear(200,1),
                  nn.Sigmoid())

损失和优化器

import torch.optim as optim

optimizer = optim.SGD(model.parameters(), lr=0.01)
criterion = nn.BCELoss(reduction="mean")

培训

num_epochs = 100
for epoch in range(num_epochs):
  cumulative_loss = 0
  for i, data in enumerate(batch_gen(X_train, y_train, batch_size=16)):
    inputs, labels = data
    inputs = torch.from_numpy(inputs).float()
    labels = torch.from_numpy(labels).float()

    optimizer.zero_grad()

    outputs = model(inputs)
    loss = criterion(outputs, labels)
    loss.backward()
    optimizer.step()
    cumulative_loss += loss.item()

    if i%5 == 0 and i != 0:
      print(f"epoch {epoch} batch {i} => Loss: {cumulative_loss/5}")
  


print("Finished Training!!")

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您的损失似乎并没有减少每个时期的原因是因为您没有在每个时期都进行打印。您实际上每第5批打印一次。而且每批次的损失不会减少很多。

尝试以下方法。在这里,将丢失每个时期。

num_epochs = 100
for epoch in range(num_epochs):
  cumulative_loss = 0
  for i, data in enumerate(batch_gen(X_train, y_train, batch_size=16)):
    inputs, labels = data
    inputs = torch.from_numpy(inputs).float()
    labels = torch.from_numpy(labels).float()

    optimizer.zero_grad()

    outputs = model(inputs)
    loss = criterion(outputs, labels)
    loss.backward()
    optimizer.step()
    cumulative_loss += loss.item()

  print(f"epoch {epoch} => Loss: {cumulative_loss}")

print("Finished Training!!")

您的损失没有减少的一个原因可能是因为您的神经网络不够深,无法学习任何东西。因此,尝试添加更多层。

model = nn.Sequential(nn.Linear(4999, 3000),
                  nn.ReLU(),
                  nn.Linear(3000,200),
                  nn.ReLU(),
                  nn.Linear(2000,1000),
                  nn.ReLU(),
                  nn.Linear(500,250),
                  nn.ReLU(),
                  nn.Linear(250,1),
                  nn.Sigmoid())

此外,我刚刚注意到您正在传递具有非常高维数的数据。您有4999个功能/列,只有120个训练示例/行。用很少的数据来融合模型几乎是不可能的(考虑到您拥有非常高的维度数据)。

我建议您尝试查找更多行或对输入数据执行降维(例如PCA)以减少特征空间(减少到50/100或更小特征),然后重试。可能您的模型仍然无法收敛,但是值得一试。