PyTorch GCN/GAT 模型训练代码解析:优化器参数更新 (optimizer.step())
PyTorch GCN/GAT 模型训练代码解析:优化器参数更新 (optimizer.step())
本文将深入分析 PyTorch GCN/GAT 模型训练代码中 optimizer.step() 的作用,解释其在模型参数更新过程中的关键角色。代码示例展示了如何利用 optimizer.step() 更新模型参数,以优化模型性能。
代码片段:
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() # <--- 这里就是 `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
optimizer.step() 的作用:
optimizer.step() 的作用是执行优化器的一次参数更新操作,即根据计算得到的梯度更新模型参数。在训练过程中,通过反向传播算法计算损失函数对模型参数的梯度,然后调用 optimizer.step() 方法更新参数,使得模型能够逐步优化并逼近最优解。
工作原理:
- 计算梯度:
loss_train.backward()会计算损失函数loss_train对模型参数的梯度。 - 参数更新:
optimizer.step()会根据预设的优化算法(如 SGD、Adam 等)和计算得到的梯度,更新模型的参数。
总结:
optimizer.step() 是 PyTorch 模型训练中不可或缺的一部分,它根据计算的梯度更新模型参数,使模型能够逐渐学习到最佳的权重,从而提高模型的预测精度。
相关知识:
- 优化器 (Optimizer):优化器用于调整模型参数,以最小化损失函数。常见的优化器包括 SGD、Adam、RMSprop 等。
- 反向传播 (Backpropagation):反向传播算法用于计算损失函数对模型参数的梯度。
- 梯度下降 (Gradient Descent):梯度下降算法通过不断调整模型参数,沿着梯度下降的方向,逐步逼近损失函数的最小值。
希望本文能够帮助您更好地理解 optimizer.step() 的作用,并在 PyTorch 模型训练中更好地应用它。
原文地址: https://www.cveoy.top/t/topic/leyA 著作权归作者所有。请勿转载和采集!