我遇到一个问题,即渐变无法在组合网络上反向传播。我检查了很多答案,但是找不到与此问题相关的解决方案。如果我们能解决这个问题,我将非常感激。
我想用这段代码计算输入数据的梯度:
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状态字典,这是事实,但是模型权重的梯度为“无”。 是因为我加载了导致渐变块的状态字典吗?
我该如何解决这个问题?
模型结构如下:
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
答案 0 :(得分:0)
此问题已解决:
为什么会有这行:loss = Variable(loss,require_grad = True)? 变量不应再使用。 因此,应该删除上面的行,并标记您要为其进行渐变的张量,可以使用: 输入= input.cuda()。requires_grad _()。