我在计算两个损失。批次循环结束时,每批一次,每一次周期一次。当我试图将这两个损失相加时,我会得到以下错误:
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
,因为我使用整个数据集来计算这个损失。
发布于 2022-11-30 16:31:34
假设您不想将epoch_loss
反向传播到整个数据集的每一次前向传递(当然,对于任何非平凡大小的数据集来说,这在计算上是不可行的),您可以分离epoch_loss并将其实质上添加为标量,该标量每一时代更新一次。但不完全确定这是否是您想要的行为。
https://stackoverflow.com/questions/74629971
复制相似问题