发布
社区首页 >问答首页 >Pytorch:批次损失与时间损失之和的正确方法

Pytorch:批次损失与时间损失之和的正确方法
EN

Stack Overflow用户
提问于 2022-11-30 15:07:33
回答 1查看 25关注 0票数 0

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

代码语言:javascript
代码运行次数:0
复制
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!

我有理由把这两项损失相加。

代码的一般思想如下:

代码语言:javascript
代码运行次数:0
复制
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,因为我使用整个数据集来计算这个损失。

EN

回答 1

Stack Overflow用户

发布于 2022-11-30 16:31:34

假设您不想将epoch_loss反向传播到整个数据集的每一次前向传递(当然,对于任何非平凡大小的数据集来说,这在计算上是不可行的),您可以分离epoch_loss并将其实质上添加为标量,该标量每一时代更新一次。但不完全确定这是否是您想要的行为。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74629971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档