【问题标题】:pytorch : retain_graph=True error even though i add thispytorch:retain_graph=True 错误,即使我添加了这个
【发布时间】:2021-05-27 03:21:53
【问题描述】:

我不断收到此错误 “第二次尝试向后遍历图形,但保存的中间结果已经被释放。第一次调用.backward()或autograd.grad()时指定retain_graph=True。”

一开始,它没有 retain_graph=True,然后我得到了错误,所以我将它添加到后面,但我仍然得到同样的错误。

我读过类似的问题,但没有任何帮助。 希望得到帮助!

trained_cnnfmnist_model=net

class CNNFMnist2(nn.Module):
    def __init__(self, trained_cnnfmnist_model):
        super(CNNFMnist2, self).__init__()
        self.trained_cnnfmnist_model = trained_cnnfmnist_model
        # now a few fully connected layers
        self.fc1 = nn.Linear(64, 32)
        self.fc2=  nn.Linear(32,16)
        self.fc3=  nn.Linear(16,10)

    def forward(self, x):
      x = self.trained_cnnfmnist_model(x)
      x = F.relu(self.fc1(x[0]))
      print(x.shape)
      # x = x.view(-1, self.num_flat_features(x))
      x = F.relu(self.fc2(x))
      x = self.fc3(x)
      return x 

trainset = torchvision.datasets.FashionMNIST(root='./data', train=True,
                                        download=True, transform=transforms.ToTensor())

testset = torchvision.datasets.FashionMNIST(root='./data', train=False,
                                       download=True, transform=transforms.ToTensor())

trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
                                          shuffle=True)

testloader = torch.utils.data.DataLoader(testset, batch_size=4,
                                         shuffle=False)

net2 = CNNFMnist2(trained_cnnfmnist_model).cuda()
optimizer = torch.optim.SGD(net2.parameters(), lr=0.001, momentum=0.9)

for epoch in range(2):  

    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        # get the inputs
        inputs, labels = data
        
        inputs = inputs.cuda() # -- For GPU
        labels = labels.cuda() # -- For GPU

        # zero the parameter gradients
        optimizer.zero_grad()

        # forward + backward + optimize
        output = net2(inputs)
        loss = criterion(outputs, labels)
        loss.backward(retain_graph=True)
        optimizer.step()

        # print statistics
        running_loss += loss.item()
        if (i+1) % 2000 == 0:    
            print('[%d, %5d] loss: %.3f' %
                  (epoch + 1, i + 1, running_loss / 2000))
            running_loss = 0.0

print('Finished Training')

【问题讨论】:

  • 你必须把所有的堆栈跟踪都放在这里。因为知道哪一行导致该错误很重要。
  • 但据我所知。这个错误是因为某处还有另一个optimizer.step()。删除那个。
  • @NatthaphonHongcharoen 嘿,首先谢谢你!我确实有另一个 optimizer.step() 但我用它来训练trained_cnnfmnist_model。那我为什么要删除它呢?首先我训练这个模型,然后我训练得到这个模型并有其他层的模型。
  • @NatthaphonHongcharoen 所以我尝试了你所说的,我只是在没有经过培训的情况下放置了这个模型,然后它就可以工作了,然后我更改了优化器的名称,并且它们都可以工作。所以首先谢谢你!真的!其次,我不明白为什么会这样,因为我每次在火车前都初始化它。第一次:优化器 = torch.optim.SGD(net.parameters(),lr=0.001,动量=0.9) .second:优化器 = torch.optim.SGD(net2.parameters(),lr=0.001,动量=0.9)

标签: python machine-learning pytorch


【解决方案1】:

基本上你只能在这三行之后调用optimizer.step()

        output = net2(inputs)
        loss = criterion(outputs, labels)
        loss.backward()

我不知道你的其余代码,所以我只能猜测。

但我认为您在致电optimizer.step() 之前没有net(inputs)

【讨论】:

    猜你喜欢
    • 2022-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 2020-04-02
    相关资源
    最近更新 更多