基于图神经网络的半监督节点分类模型训练代码解析
基于图神经网络的半监督节点分类模型训练代码解析
该代码展示了使用图神经网络进行半监督节点分类模型训练的完整过程。代码中使用了torch.nn.functional库中的F.nll_loss和F.mse_loss函数来计算交叉熵损失和均方误差损失,并使用torch.optim库中的optimizer来更新模型参数。
代码解析
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
loss_ncl的作用
代码中loss_ncl += F.mse_loss(output[0][k][idx_unlabel], areout[idx_unlabel])的作用是计算无标签节点的输出与所有无标签节点的平均输出之间的均方误差(MSE)。这个损失项的作用是鼓励模型将无标签节点的输出调整为与其他无标签节点的输出相似,从而使模型更好地利用无标签节点的信息来提高节点分类性能。同时,该损失项还有助于防止过拟合,因为它迫使模型不仅考虑有标签节点的信息,还要考虑无标签节点的信息。最终,loss_train是由loss_xy和loss_ncl加权得到的,其中权重由参数lamd控制。
总结
这段代码展示了使用图神经网络进行半监督节点分类模型训练的完整过程,包括模型构建、损失函数定义、训练过程和验证过程,并详细解释了其中关键的损失项loss_ncl的作用。
相关概念
- 图神经网络 (GNN)
- 半监督学习 (Semi-Supervised Learning)
- 节点分类 (Node Classification)
- 均方误差 (Mean Squared Error)
- 交叉熵损失 (Cross-Entropy Loss)
- 过拟合 (Overfitting)
- 早停 (Early Stopping)
原文地址: https://www.cveoy.top/t/topic/lexq 著作权归作者所有。请勿转载和采集!