这段代码展示了使用 PyTorch 训练模型的典型流程,主要包括以下几个关键部分:

  1. Epoch 循环: for epoch in range(args.epochs): 代码使用循环遍历每个 epoch,在每个 epoch 中执行模型训练和验证操作。

  2. 训练阶段: model.train() 将模型设置为训练模式,optimizer.zero_grad() 将模型参数的梯度归零,以避免梯度累积。

  3. 损失函数计算: loss_xy = F.nll_loss(output[0][k][idx_train], labels[idx_train]) 使用负对数似然损失函数 (Negative Log Likelihood) 计算训练集上的损失。

  4. 优化器更新: loss_train.backward() 反向传播计算梯度,optimizer.step() 使用优化器更新模型参数。

  5. 验证阶段: if validate: 代码使用条件语句判断是否进行验证。model.eval() 将模型设置为验证模式,loss_val = F.nll_loss(areout[idx_val], labels[idx_val]) 计算验证集上的损失。

  6. Early Stopping: 代码使用 curr_stepearly_stopping 参数控制早停机制,如果验证集损失连续若干个 epoch 没有下降,则停止训练,避免过度拟合。

  7. optimizer.zero_grad() 的作用: optimizer.zero_grad() 的作用是将模型参数的梯度归零,以避免梯度累积。在每次进行反向传播计算梯度前,都需要调用 optimizer.zero_grad()。这样可以保证每次反向传播计算的梯度只与当前 batch 的数据有关,而不会受到之前 batch 的数据影响。

代码注释:

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

总结: 这段代码展示了使用 PyTorch 进行模型训练的基本流程,通过了解这些关键部分,读者可以更好地理解模型训练过程,并根据实际需求进行调整和优化。

PyTorch 模型训练代码详解:Epoch 循环、损失函数、优化器和验证

原文地址: https://www.cveoy.top/t/topic/levy 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录