我在PyTorch中使用Google Colab作为分类器,我的训练数据集有~30,000张jpg图像,我存储在我的Google Drive中。通过Colab和Drive有效地使用这些大量数据一直是一场噩梦,主要是因为我的Google Drive经常崩溃或"超时"。当我试图从文件夹中读取图像时。
这是我目前为止尝试过的两种方法,但都失败了。
- 当
__getitem__
实现时直接从Google Drive读取图像,即我的火炬Dataset
对象看起来像:
class Dataset(torch.utils.data.Dataset):
def __init__(self, image_ids, labels):
self.image_ids = image_ids
self.labels = labels
def __len__(self):
return len(self.image_ids)
def __getitem__(self, i):
img_path = f'drive/MyDrive/images/{image_ids[i]}'
img = transforms.ToTensor()(PIL.Image.open(img_path)
label = self.labels[i]
return img, label
因此,当__getitem__
被调用时,它从我的Google Drive(存储所有30000张图像的地方)的文件夹images
中读取图像。然而,这会产生一个问题,当我创建一个DataLoader并在minibatch上循环时,它会给我一个"Google Drive Timeout发生"的错误,从研究来看,这似乎是Google Drive中大型文件夹有时会发生的情况。
- 创建
TensorDataset
:为了规避上述问题,我想我会创建TensorDataset
。为了做到这一点,我必须首先创建一个包含所有30000张训练图像的庞大张量,即形状为(30000, 3, 128, 128)
(每张图像为3x128x128),这需要一点时间。所以,我不能每次运行代码时都这样做——因此我尝试保存这个大张量,但这会导致Colab中的内存问题,从而导致运行时崩溃。另外,它像12GB,所以我确定这不是一个有效的方法。
谁有什么建议?设置非常简单,但事实证明它有点烦人,因为Google Drive似乎没有准备好做这些事情。我只是有一个文件夹的30,000图像,我想读作为火炬张量(在小批量训练)到Colab。做到这一点的最佳方法是什么,以及/或者我如何解决上面讨论的方法中的问题?
我的感觉是方法#1是最明智的,因为它一次只读取需要读取的内存。但由于某些原因,从包含许多元素的Google Drive文件夹中读取内容(这个文件夹有30,000个)会导致所谓的"Google Drive超时"。同样的过程在我电脑的CPU上是微不足道的,但我需要gpu进行训练,所以我需要能够在Colab上做到这一点。我不知道如何解决这个问题。
为了记录,我使用Colab Pro,所以我可以访问高内存运行时。
我有两个建议:
-
文件夹策略:只需将数据文件夹划分为子文件夹,并使用特定的命名约定,并根据此约定调整
DataSet
。你可以看到这个相关链接:google建议 -
GCP -对象存储策略:您可以使用使用谷歌云存储桶不改变数据格式。将您的数据上传到谷歌云桶,授权给您的协作环境,并使用GCP sdk访问GCP中的数据。我建议您使用bucket,因为对象存储对于具有大量文件的数据是理想的。这种策略可能会造成一些开销,但它可能不会那么慢,因为您将使用GCP(两者都由Google操作)
注意:还有一个选项,您可以在其中安装GCP到您的协作。在
之前我没有使用这个更新:小提示:(也可以在下面的链接中找到)您可能需要为Colab的VM安装一些系统包GCP和colab相关链接