Градиент потока остановился на комбинированной модели - PullRequest
0 голосов
/ 23 октября 2019

Я сталкиваюсь с проблемой, что градиент не может распространяться в объединенной сети. Я проверил много ответов, но не могу найти подходящее решение этой проблемы. Я был бы очень признателен, если бы мы могли решить эту проблему.

Я хотел вычислить градиент для входных данных в этом коде:

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)

, но получил ошибку:

print(‘input:’, input.grad.data)
AttributeError: ‘NoneType’ object has no attribute ‘data’

и моя модель представляет собой комбинированную модель, в которую я загрузил параметры из двух предварительно обученных моделей. Я проверил состояние require_grad-dict для весов модели, это правда, однако градиент весов модели равен None. Это из-за того, что я загружаю диктант состояния, который вызвал блок градиента?

Как я могу решить эту проблему?

Структура модели прилагается ниже:

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

1 Ответ

0 голосов
/ 23 октября 2019

Проблема решается с помощью этого комментария:

Почему у вас есть эта строка: потеря = переменная (потеря, требует_град = Истина)? Переменная больше не должна использоваться. Таким образом, строку выше следует удалить и пометить тензор, для которого вы хотите градиенты, вы можете использовать: input = input.cuda (). Require_grad _ ().

...