解决方案见最后。。。。。。。。。。。。。。
最近复现模型的过程中,因为有段时间没有写工程了,非常生疏。写的过程漏洞百出,碰到这个问题,主要是利用 torch.nn.BCELoss( ) 计算损失的时候出现。
for iter, (feas, labels) in enumerate(train_dataloader, 1):
optimizer.zero_grad()
# 1. 正向
outputs = model(feas)
# 2. loss求解
loss = loss_fn(labels, outputs.squeeze())
loss_sum += loss.item()
# 3. 梯度回传
loss.backward()
optimizer.step()
印象中之前没有遇到这个问题,怀疑是版本迭代问题,网上找到方案大多是说明 BCELoss的第二个参数 的不具有梯度,所以要想这样用就是需要对 output 去梯度。
outputs.squeeze().detach()
但是仔细一想,看到源码的中说明的第二个参数是target,loss 问题的target应该就是 label才对,而且label是不带梯度的,而 output因为是模型输出,是带有梯度的。
所以,调换左右 loss 计算参数的顺序就好了,我人傻了....
最后的处理方式;
loss = loss_fn(outputs.squeeze(), labels)