参考资料
问题描述
将别人模型替换成自己的模型,训练过程中出现错误param.grad.data.clamp_(-grad_clip, grad_clip) AttributeError: 'NoneType' object has no attribute 'data'
解决方法
上网查询这个问题,大部分回答都是模型中定义的某个层没有参与到前向传播,所以反向传播,计算loss时,grad is None
。主要是要找到未参与计算的层,并注释掉。
这个问题困扰我很久,因为始终觉得没有多余的层。
下面的代码定义一个AttentionResNet模型。后来才发现罪魁祸首是self.encoder
,这所以前面一直没有注意到它,是因为后面的层的定义用到self.encoder
中的某个层或某几个层组合。
class AttentionResNet(nn.Module):
def __init__(self, in_channels=3, out_channels=1, num_filters=32, encoder_depth=34, pretrained=True):
super(AttentionResNet, self).__init__()
self.in_channels = in_channels
self.out_channels = out_channels
self.num_filters = num_filters
if encoder_depth == 34:
self.encoder = torchvision.models.resnet34(pretrained=pretrained)
bottom_channel_nr = 512
elif encoder_depth == 101:
self.e