PyTorch 图神经网络训练代码:使用无监督损失进行模型优化
这段代码展示了使用 PyTorch 训练一个图神经网络 (GNN) 模型,并利用无监督损失来改进模型性能。
for epoch in range(args.epochs):
t = time.time()
# for train
model.train()
optimizer.zero_grad()
output = model(features, adjtensor)
# 平均输出
areout = output[1]
loss_xy = 0
loss_ncl = 0
for k in range(len(output[0])):
# print('k = ' + str(k))
# print(F.nll_loss(output[0][k][idx_train], labels[idx_train]))
# print(F.mse_loss(output[0][k][idx_unlabel], areout[idx_unlabel]))
loss_xy += F.nll_loss(output[0][k][idx_train], labels[idx_train])
loss_ncl += F.mse_loss(output[0][k][idx_unlabel], areout[idx_unlabel])
loss_train = (1-args.lamd) * loss_xy - args.lamd * loss_ncl
# loss_train = (1 - args.lamd) * loss_xy + args.lamd * 1 / loss_ncl
# loss_train = (1 - args.lamd) * loss_xy + args.lamd * (torch.exp(-loss_ncl))
print(loss_xy)
print(loss_ncl)
print(torch.exp(-loss_ncl))
print((1 - args.lamd) * loss_xy)
print(args.lamd * (torch.exp(-loss_ncl)))
print(epoch)
print(loss_train)
print('.............')
acc_train = accuracy(areout[idx_train], labels[idx_train])
loss_train.backward()
optimizer.step()
# for val
if validate:
# print('no')
model.eval()
output = model(features, adjtensor)
areout = output[1]
vl_step = len(idx_val)
loss_val = F.nll_loss(areout[idx_val], labels[idx_val])
acc_val = accuracy(areout[idx_val], labels[idx_val])
# vl_step = len(idx_train)
# loss_val = F.nll_loss(areout[idx_train], labels[idx_train])
# acc_val = accuracy(areout[idx_train], labels[idx_train])
cost_val.append(loss_val)
# 原始GCN的验证
# if epoch > args.early_stopping and cost_val[-1] > torch.mean(torch.stack(cost_val[-(args.early_stopping + 1):-1])):
# # print('Early stopping...')
# print(epoch)
# break
# print(epoch)
# GAT的验证
if acc_val/vl_step >= vacc_mx or loss_val/vl_step <= vlss_mn:
if acc_val/vl_step >= vacc_mx and loss_val/vl_step <= vlss_mn:
vacc_early_model = acc_val/vl_step
vlss_early_model = loss_val/vl_step
torch.save(model, checkpt_file)
vacc_mx = np.max((vacc_early_model, vacc_mx))
vlss_mn = np.min((vlss_early_model, vlss_mn))
curr_step = 0
else:
curr_step += 1
# print(curr_step)
if curr_step == args.early_stopping:
# print('Early stop! Min loss: ', vlss_mn, ', Max accuracy: ', vacc_mx)
# print('Early stop model validation loss: ', vlss_early_model, ', accuracy: ', vacc_early_model)
break
代码解析
- 训练循环: 代码使用
for epoch in range(args.epochs)循环来进行训练,每个 epoch 包含以下步骤:- 前向传播:
output = model(features, adjtensor)将输入的特征和邻接矩阵输入到模型中进行前向传播,得到模型的输出。 - 损失计算: 代码使用监督损失
loss_xy和无监督损失loss_ncl来计算总损失loss_train,并使用loss_train.backward()进行反向传播。 - 优化: 代码使用
optimizer.step()更新模型参数。
- 前向传播:
- 验证: 代码在每个 epoch 后进行验证,使用
model.eval()将模型切换到评估模式,并计算验证集上的损失和准确率。- 早期停止: 代码使用早期停止机制来防止过拟合,当验证集上的损失或准确率不再提高时,停止训练。
主要部分解释
output = model(features, adjtensor)的作用: 这行代码的作用是将输入的特征和邻接矩阵输入到模型中进行前向传播,得到模型的输出。具体来说,模型会根据输入的特征和邻接矩阵,通过多层的图卷积操作,得到每个节点的特征表示。这些特征表示会被用于分类任务,通过一个全连接层进行分类,得到每个节点的类别预测结果。同时,模型还会输出每个节点的平均特征表示,这个平均特征表示会被用于计算无监督损失。最终,这个函数会返回模型的输出结果。loss_xy和loss_ncl:loss_xy是监督损失,使用交叉熵损失来衡量模型预测的类别和真实标签之间的差异。loss_ncl是无监督损失,使用均方误差来衡量节点特征和其平均特征表示之间的差异。
代码优势
- 使用无监督损失来改进模型性能。
- 使用早期停止机制来防止过拟合。
- 代码简洁易懂,方便理解和修改。
代码使用说明
- 需使用 PyTorch 库。
- 需要根据实际情况修改代码中的参数,例如
args.epochs、args.lamd等。
总结
这段代码展示了如何使用 PyTorch 训练一个图神经网络模型,并利用无监督损失来改进模型性能。代码包含了训练循环、验证过程、早期停止机制,能够帮助理解图神经网络模型的训练过程。希望本代码能够对您有所帮助。
原文地址: https://www.cveoy.top/t/topic/ihGH 著作权归作者所有。请勿转载和采集!