Pytorch DataLoader 内存未释放

问题描述 投票:0回答:1

我想在google collaboratory上的pythorch上实现SRGAN,但是DataLoader的内存似乎被释放了,所以如果你转动epoch,就会出现内存错误。 如果您告诉我如何执行此操作以释放每批内存,我将不胜感激。 这是代码的github链接 https://github.com/pacifinapacific/Hello-World/blob/master/Untitled0.ipynb

已经48了,1个echoch发生内存错误, 如果将批量大小设置为 8 的 1/6,则在大约 6 epoch 时会出现错误。

我正在使用以下代码读取高分辨率和低分辨率图像。扩展图像文件夹

但是例如,即使执行学习时出现错误,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_img


train_data = DownSizePairImageFolder('./lfw-deepfunneled/train',   transform=transforms.ToTensor())
test_data = DownSizePairImageFolder('./lfw-deepfunneled/test',    transform=transforms.ToTensor())
batch_size = 8
train_loader = DataLoader(train_data, batch_size, shuffle=True)
test_loader = DataLoader(test_data, batch_size, shuffle=False)
python machine-learning deep-learning pytorch
1个回答
2
投票

每次通过模型传播时,Pytorch 都会构建一个计算图。该图通常会保留,直到输出变量

G_loss
超出范围,例如当循环的新迭代开始时。

但是,您将此损失附加到列表中。因此,该变量对于 python 来说仍然是已知的,并且图没有被释放。您可以使用

.detach()
将变量从当前图中分离(这比我之前提出的
.clone()
更好,因为它也会复制张量的数据)。

作为一个小侧节点:在

train()
函数中,您在
D_loss,G_loss
循环中返回
for
,而不是在其之后;所以你总是只使用第一批。

© www.soinside.com 2019 - 2024. All rights reserved.