首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >梯度流在组合模型上停止

梯度流在组合模型上停止
EN

Stack Overflow用户
提问于 2019-10-23 06:14:34
回答 1查看 23关注 0票数 0

我遇到了一个问题,梯度不能在组合网络上反向传播。我检查了很多答案,但找不到解决这个问题的相关方案。如果我们能解决这个问题,我将不胜感激。

我想在下面的代码中计算输入数据的梯度:

代码语言:javascript
复制
for i, (input, target, impath) in tqdm(enumerate(data_loader)):
# print(‘input.shape:’, input.shape)
input = Variable(input.cuda(), requires_grad=True)
output = model(input)
loss = criterion(output, target.cuda())
loss = Variable(loss, requires_grad=True)
loss.backward()
print(‘input:’, input.grad.data)

但我有个错误:

代码语言:javascript
复制
print(‘input:’, input.grad.data)
AttributeError: ‘NoneType’ object has no attribute ‘data’

我的模型是一个组合模型,我从两个预先训练的模型中加载了参数。我检查了模型权重的requires_grad状态字典,这是真的,但是模型权重的梯度是无的。是不是因为我加载了导致渐变块的state-dict?

我该如何处理这个问题?

模型结构附在下面:

代码语言:javascript
复制
class resnet_model(nn.Module):
    def __init__(self, opt):
        super(resnet_model, self).__init__()

        resnet = models.resnet101()
        num_ftrs = resnet.fc.in_features
        resnet.fc = nn.Linear(num_ftrs, 1000)

        if opt.resnet_path != None:
            state_dict = torch.load(opt.resnet_path)
            resnet.load_state_dict(state_dict)
            print("resnet load state dict from {}".format(opt.resnet_path))

        self.model1 = torch.nn.Sequential()

        for chd in resnet.named_children():
            if chd[0] != 'fc':
                self.model1.add_module(chd[0], chd[1])

        self.model2 = torch.nn.Sequential()

        self.classifier = LINEAR_LOGSOFTMAX(input_dim=2048, nclass=200)
        if opt.pretrained != None:
            self.classifier_state_dict = torch.load('../checkpoint/{}_cls.pth'.format(opt.pretrained))
            print("classifier load state dict from ../checkpoint/{}_cls.pth".format(opt.pretrained))
        self.classifier.load_state_dict(self.classifier_state_dict)

        for chd in self.classifier.named_children():
            self.model2.add_module(chd[0], chd[1])

    def forward(self, x):
        x = self.model1(x)

        x = x.view(-1, 2048)

        x = self.model2(x)
        return x
EN

回答 1

Stack Overflow用户

发布于 2019-10-23 19:13:35

这个问题可以通过下面的评论来解决:

为什么会有这一行: loss = Variable(loss,requires_grad=True)?变量不应再使用。因此,应该删除上面的行,并标记需要渐变的张量,可以使用: input = input.cuda().requires_grad_()。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58512953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档