【问题标题】:Graph Neural Network, my loss doesn't decrease图神经网络,我的损失没有减少
【发布时间】:2022-10-21 09:34:18
【问题描述】:

我正在尝试使用带有 PyTorch Geometric 的图形卷积网络将某些药物分类为 HIV 活跃与否。我使用了一个包含 2299 个完美平衡样本的数据集,其中 1167 个分子标记为 1,1132 个分子标记为 0,并将其转换为具有 9 个节点特征的 PyG 图。

我的神经网络是这样的:

num_classes = 2

class Net(torch.nn.Module):
   def __init__(self, hidden_channels, hidden_channels1):
      super(Net, self).__init__()
      self.conv1 = GCNConv(9, hidden_channels, cached=False)
      self.bn1 = BatchNorm1d(hidden_channels1)
    
      self.conv2 = GCNConv(hidden_channels, hidden_channels1, cached=False)

      self.fc1 = Linear(hidden_channels1, hidden_channels1)
      self.bn2 = BatchNorm1d(hidden_channels1)

      self.fc2 = Linear(hidden_channels1, num_classes)

   def forward(self, x, edge_index, batch):
     x = F.relu(self.conv1(x, edge_index))

     x = F.relu(self.conv2(x, edge_index))
     x = self.bn1(x)

     x = global_add_pool(x, batch)

     x = F.relu(self.fc1(x))
     x = self.bn2(x)

     x = self.fc2(x)
     x = F.log_softmax(x, dim=1)
  
    return x

训练循环是这样的:

model = Net(200, 100)
optimizer = torch.optim.Adam(model.parameters(), lr=0.1)

def train():
    model.train()
    loss_all = 0
    for data in train_loader:
       optimizer.zero_grad()
       output = model(data.x, data.edge_index, data.batch)
       loss = F.nll_loss(output, data.y)
       loss.backward()
       loss_all += loss.item() * data.num_graphs
       optimizer.step()
   return loss_all / len(train_loader.dataset)

def test_loss(loader):
   total_loss_val = 0

   with torch.no_grad():
        for data in loader:
          output = model(data.x, data.edge_index, data.batch)
          batch_loss = F.nll_loss(output, data.y)
          total_loss_val += batch_loss.item() * data.num_graphs
   return total_loss_val / len(loader.dataset)

def test(loader):
   model.eval()
   correct = 0
   for data in loader:
       output = model(data.x, data.edge_index, data.batch)
       pred = output.max(dim=1)[1]
       correct += pred.eq(data.y).sum().item()
   return correct / len(loader.dataset)

hist = {"train_loss":[], "val_loss":[], "acc":[], "test_acc":[]}
for epoch in range(1, 51):
    train_loss = train()
    val_loss = test_loss(val_loader)
    train_acc = test(train_loader)
    test_acc = test(val_loader)
    hist["train_loss"].append(train_loss)
    hist["val_loss"].append(val_loss)
    hist["acc"].append(train_acc)
    hist["test_acc"].append(test_acc)
    print(f'Epoch: {epoch}, Train loss: {train_loss:.3}, Val loss: {val_loss:.3}, 
    Train_acc: {train_acc:.3}, Test_acc: {test_acc:.3}')

但是当我训练我的网络出现问题时,我得到了这个损失并且准确性没有增加:

我还尝试通过消除批量归一化、设置高 lr 和大量隐藏通道来过度拟合网络,但变化不大。会是什么呢?

【问题讨论】:

    标签: neural-network pytorch graph-theory loss-function pytorch-geometric


    【解决方案1】:

    目前面临同样的挑战,如果您找到了解决方法,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-20
      • 2017-10-19
      • 1970-01-01
      相关资源
      最近更新 更多