我使用Google Colab作为PyTorch中的分类器,我的训练数据集有大约30,000张jpg图像,我已经存储在我的Google Drive中。在Colab和Drive中高效地使用如此大量的数据是一场噩梦,主要是因为当我试图从文件夹中读取图像时,我的Google Drive往往会崩溃或“超时”。
到目前为止,我尝试了两种方法,但都失败了。
1.当实现__getitem__
时,直接从Google云端硬盘读取图像,例如,我的torch 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云端硬盘中的文件夹images
读取图像(其中存储了所有30000个图像)。然而,这会产生这样的问题:当我创建一个DataLoader并在迷你批处理上循环时,它会给我一个“Google Drive超时发生”的错误,从研究来看,这似乎是Google Drive中的大文件夹有时会发生的事情。
1.创建一个TensorDataset
:为了避免上述问题,我想我将创建一个TensorDataset
。为此,我必须首先创建所有30000个训练图像的大规模Tensor,即形状为(30000, 3, 128, 128)
(每张图像是3x 128 x128),这需要一点时间,所以我不能每次运行代码时都这样做--所以我试着保存这个大Tensor,但这会导致Colab的内存问题,导致运行时崩溃。另外,它只有12 GB,所以我肯定这不是一个有效的方法。
有人能给我一些建议吗?安装非常简单,但事实证明这有点烦人,因为Google Drive似乎还没有准备好做这些事情。我只有一个包含30,000张图片的文件夹,我想把它们作为TorchTensor来读取(以小批量的方式进行培训)导入Colab。最好的方法是什么,以及/或者我如何解决上述方法中的问题?
我的感觉是第一种方法是最明智的,因为它一次只读入内存中需要读取的内容,但由于某种原因,从Google云端硬盘文件夹读取内容有很多元素(这个有30,000)导致了所谓的“谷歌驱动器超时”。同样的过程在我电脑的CPU上是微不足道的,但我需要GPU来进行培训,因此我需要能够在Colab上执行此操作。我不知道如何解决此问题。
为了记录在案,我使用Colab Pro,所以我可以访问高RAM运行时。
1条答案
按热度按时间qltillow1#
我有两个建议:
1.子文件夹策略:只需将数据文件夹按照一定的命名规则划分为子文件夹,并根据此规则调整您的
DataSet
即可。您可以看到以下相关链接:谷歌建议1.你可以使用google cloud storage bucket而不改变数据格式。上传你的数据到google cloud bucket,给予你的colab环境授权,并使用GCP sdk来访问你在GCP中的数据。我建议你使用bucket,因为对象存储是大量文件的理想选择。这个策略可能会导致一些开销,但它可能不会那么慢,因为你会使用GCP(两者都由Google操作)
注意:还有一个选项,你可以挂载GCP到你的colab。我以前没有用过这个
**更新:**小提示:(也可在下面的链接中找到)您可能需要为Colab Relevant link for GCP and colab的VM安装一些系统包