我的代码原本运行良好,直到我需要进行一些修改以使其对某些超参数更加灵活。
在下面的代码片段中,您可以看到我的前向函数,在之前使用了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的卷积(实际上是一个线性层),并进行一些全局平均/最大池化以将数据缩小到相同的大小。