我想在Google Colab上使用PyTorch实现SRGAN,但DataLoader的内存似乎未被释放,因此当你切换epoch时,会发生内存错误。如果你能告诉我如何在每个批次后释放内存,将不胜感激。这是代码的GitHub链接
在第48次迭代时发生了内存错误。如果将批量大小设置为8的1/6,大约在第6个epoch时会出现错误。我使用以下代码读取高分辨率和低分辨率图像。扩展了ImageFolder。但例如,即使在执行学习时发生错误,GPU的内存也不会被释放
class DownSizePairImageFolder(ImageFolder): def __init__(self, root, transform=None, large_size=256, small_size=64, **kwds): super().__init__(root, transform=transform, **kwds) self.large_resizer = transforms.Scale(large_size) self.small_resizer = transforms.Scale(small_size) def __getitem__(self, index): path, _ = self.imgs[index] img = self.loader(path) large_img = self.large_resizer(img) small_img = self.small_resizer(img) if self.transform is not None: large_img = self.transform(large_img) small_img = self.transform(small_img) return small_img, large_imgtrain_data = DownSizePairImageFolder('./lfw-deepfunneled/train', transform=transforms.ToTensor())test_data = DownSizePairImageFolder('./lfw-deepfunneled/test', transform=transforms.ToTensor())batch_size = 8train_loader = DataLoader(train_data, batch_size, shuffle=True)test_loader = DataLoader(test_data, batch_size, shuffle=False)
回答:
每次通过模型传播时,Pytorch都会构建一个计算图。这个图通常会在输出变量G_loss
超出作用域时被保留,例如当循环开始新一轮迭代时。
然而,你将这个损失值添加到一个列表中。因此,这个变量仍然为Python所知,图不会被释放。你可以使用.detach()
来将变量从当前图中分离(这比我之前提出的.clone()
更好,因为它不会复制张量的数据)。
作为一个小提示:在你的train()
函数中,你在for
循环中而不是在循环之后返回D_loss,G_loss
;所以你总是只使用第一个批次。