【发布时间】: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