【发布时间】: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