PyTorch 新模型函数导致GPU内存泄漏

我的代码原本运行良好,直到我需要进行一些修改以使其对某些超参数更加灵活。

在下面的代码片段中,您可以看到我的前向函数,在之前使用了2行注释的代码。现在,由于需要在self.classifier中的nn.Linear上提供更多的灵活性,我创建了classifierAdaptive()函数,该函数执行相同的任务,但允许nn.Linear中的一些参数发生变化。

之前的GPU RAM使用量大约是7GB/11GB,现在我快用完GPU RAM了,我无法找出原因。我想不出有什么变量会导致内存问题。

编辑:

数据集是2200×2200大小的图像,我从中截取小块来训练。这些小块当前是硬编码为6 * 6的尺寸。

期望的行为是只有一个nn.Linear,它可以适用于所有img.shapes。然而,正如@***所说,模式可能创建了太多层而不是只创建一层,并且覆盖了它们?

我无法包含整个代码进行调试。那将是太多了。但如果需要,可以在这里查看,不包括下面的代码修改。

    self.classifier = nn.Sequential(        nn.Linear(512 * 6 * 6, 1024),        nn.LeakyReLU(0.2, True),        nn.Linear(1024, 1),        nn.Sigmoid()    )def classifierAdaptive(self,img):    out = torch.flatten(img, 1)    outLinear = nn.Linear(512 * img.shape[2] * img.shape[3], 1024).cuda()    out = outLinear(out).cuda()    out = self.lrelu(out) # self.lrelu = nn.LeakyReLU(0.2, True)    out = self.dens2(out) # self.dens2 = nn.Linear(1024, 1)    out = self.sig(out) # self.sig = nn.Sigmoid()    return outdef forward(self, x):    out = self.features(x)    # out = torch.flatten(out, 1)    # out = self.classifier(out)    out = self.classifierAdaptive(out)    return out

回答:

您为每张不同大小的图像创建了一个新层,这不仅不会起作用,而且每个新层都会有其参数集,这些参数会保存在GPU内存中,因此您很快就会用完内存空间。这在图像处理中是一个常见问题,因为线性层的尺寸是固定的,而卷积层的H,W维度是动态的。解决此问题唯一真正的方法是在将图像放入网络之前将它们调整到相同的大小(查看torch.nn.functional.interpolate或cv2.resize),或者使用内核大小为1的卷积(实际上是一个线性层),并进行一些全局平均/最大池化以将数据缩小到相同的大小。

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中创建了一个多类分类项目。该项目可以对…

发表回复

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