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()

你可能感兴趣的:(pytorch,深度学习,神经网络)