PyTorch 模型训练与评估:使用 model.eval() 进行模型评估
PyTorch 模型训练与评估:使用 model.eval() 进行模型评估
在 PyTorch 中,model.eval() 函数用于将模型设置为评估模式。在评估模式下,模型的行为会有所不同,例如,对于一些模型,它们会禁用一些随机性操作,如 dropout 和随机初始化。这是因为在评估模式下,我们希望模型的输出是确定性的,以便进行比较和分析。在训练模式下,模型会保留这些随机性操作,以便在每个批次中进行随机更新和正则化。
以下代码示例展示了如何使用 model.eval() 进行模型评估:
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
在评估模式下,dropout 和随机初始化会发生什么?
- Dropout: 在评估模式下,dropout 层会被禁用,所有神经元都会被激活,而不是随机地丢弃一些神经元。这使得模型的输出更加稳定和确定性。
- 随机初始化: 在评估模式下,模型的权重不会被重新初始化,而是使用训练过程中学习到的权重。这使得模型的输出更加一致和可预测。
通过使用 model.eval(),我们可以确保模型在评估过程中始终保持一致的行为,从而获得更可靠的性能评估结果。
model.eval() 的作用
- 禁用 dropout 和其他随机操作:在评估模式下,模型会禁用 dropout、随机初始化和其他随机性操作,以便获得更稳定的输出。
- 确保输出的确定性:模型在评估模式下会产生确定性的输出,以便进行比较和分析。
- 用于性能评估:
model.eval()通常用于评估模型在测试集上的性能,因为它会禁用随机性操作,从而提供更可靠的结果。
总结
model.eval() 是 PyTorch 中一个重要的函数,用于将模型设置为评估模式,这在评估模型性能时非常重要。它确保模型在评估过程中禁用随机性操作,从而产生稳定和确定性的输出。
希望这篇文章能够帮助你理解 model.eval() 的作用,并将其应用到你的模型评估过程中。
原文地址: https://www.cveoy.top/t/topic/ihBo 著作权归作者所有。请勿转载和采集!