Pytorch DataLoader内存未释放

我想在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;所以你总是只使用第一个批次。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注