Pytorch:正确的方法来求和批量损失与时段损失

ovfsdjhp  于 2022-12-04  发布在  其他
关注(0)|答案(1)|浏览(153)

我正在计算两个损失。在批处理循环结束时,每个批处理一个,每个时段一个。当我试图将这两个损失相加时,我得到以下错误:

RuntimeError: one of the variables needed for gradient computation has been modified by   an inplace operation: [torch.FloatTensor [64, 49]], which is output 0 of AsStridedBackward0, is at version 2; expected version 1 instead. Hint: the backtrace further above shows the operation that failed to compute its gradient. The variable in question was changed in there or anywhere later. Good luck!

我把这两个损失加起来是有道理的。
代码的总体思路如下:

loss_epoch = 0 # it's zero in the first epoch

for epoch in epochs:
    for batch in batches:
        optimizer.zero_grad()
    
        loss_batch = criterion_batch(output_batch, target_batch)
        loss = loss_batch + loss_epoch # adds zero in the first epoch
    
        loss.backward()
        optimizer.step()
    
    loss_epoch = criterion_epoch(output_epoch, target_epoch)

我发现问题在于,当我在第一个循环(通过批处理的循环)结束时计算另一个损耗时,我正在修改梯度,但我无法解决这个问题。
它还可能与操作的顺序有关(损失计算、向后、zero_grad、step)。
我需要在批处理循环结束时计算loss_epoch,因为我使用整个数据集来计算此损失。

hrysbysz

hrysbysz1#

假设您不想在整个数据集的每个正向传递中反向传播epoch_loss(当然,对于任何非平凡大小的数据集,这在计算上都是不可行的),您可以分离epoch_loss,并将其作为标量添加,每个epoch更新一次。

相关问题