首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataLoader内存未释放

DataLoader内存未释放
EN

Stack Overflow用户
提问于 2018-08-25 07:25:26
回答 1查看 3.4K关注 0票数 2

我想在谷歌合作平台上的pythorch上实现SRGAN,但是DataLoader的内存似乎被释放了,所以如果你改变时代,内存错误就会发生。如果你告诉我如何做到这一点,以便每批释放内存,我们将不胜感激。这是代码https://github.com/pacifinapacific/Hello-World/blob/master/Untitled0.ipynb的github链接

它在48岁时发生内存错误,如果将批处理大小设置为8的1/6,则会在大约6个时间内出现错误。

我用下面的代码读取高分辨率和低分辨率的图像。扩展ImageFolder

但是,例如,即使在执行学习时出现错误,GPU的内存也不会释放。

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-25 16:42:49

每次您在模型中传播时,Pytorch都会生成一个计算图。此图通常保留到输出变量G_loss超出作用域为止,例如,当循环中的新迭代开始时。

但是,您将此损失附加到列表中。因此,这个变量仍然为python所知,而图则未被释放。您可以使用.detach()将变量从当前图中分离出来(这比我之前提出的.clone()更好,因为它还将复制张量的数据)。

作为一个小的边节点:在您的train()函数中,您在for循环中返回D_loss,G_loss,而不是在它之后;所以您总是只使用第一批。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52015010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档