optimizer.step()模型参数不更新,输出梯度为0

深度学习实验中遇到了这样一个问题,使用torch.optim.Adam()优化器训练网络更新参数,但是奇怪的是参数一直不更新,loss也一直不变,使用

[x.grad for x in solver.param_groups[0]['params']]

把梯度打印出来发现全部是none。

经过了重新配置环境,修修补补网络模型等一系列除了浪费几天时间而对解决问题丝毫没有帮助的操作(当然也不是完全的无用功,利用找问题的这几天我也更好的理解了优化器的原理和优化过程)

就在今天上午,事情终于出现了转机,之前在网上看到说可能是非叶子节点梯度没有保留的问题,即对于非叶子结点,即使使用了requires_grad=True也没办法得到梯度。但是前几天我也有针对这个问题修改过Loss,可能修改的还是有问题,也没有成功。今天上午又试了试修改损失函数,网络参数奇迹般地能够更新了,梯度也不为None了。

修改之前

pixel_loss = pixelLoss(img_out, img_hr, cfg.TRAIN.PIXEL_LOSS)

if cfg.TRAIN.USE_PERCET_LOSS:
    percept_loss  = 0.01 * perceptualLoss(img_out, img_hr, vggnet)
    total_loss = pixel_loss + percept_loss
else:
    total_loss = pixel_loss

# Gradient decent
solver.zero_grad()
total_loss.backward()
solver.step()

修改之后

pixel_loss = pixelLoss(img_out, img_hr, cfg.TRAIN.PIXEL_LOSS)
if cfg.TRAIN.USE_PERCET_LOSS:
    percept_loss  = 0.01 * perceptualLoss(img_out, img_hr, vggnet)
    total_loss = (pixelLoss(img_out, img_hr, cfg.TRAIN.PIXEL_LOSS) + 0.01 *  perceptualLoss(img_out, img_hr, vggnet)).requires_grad_()
else:
    total_loss = (pixelLoss(img_out, img_hr, cfg.TRAIN.PIXEL_LOSS)).requires_grad_()
# Gradient decent
solver.zero_grad()
#total_loss.backward()
total_loss.backward()
#print([x.grad for x in solver.param_groups[0]['params']])
solver.step()
# Adjust learning rate
lr_scheduler.step()

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值