如何使用PyTorch(或Keras Tensorflow)加载预批数据?

2024-10-01 13:34:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在开发一个卷积神经网络,它接收图像并对其进行回归分析。一个示例训练数据集可能包含40000个图像,而一个验证数据集可能包含20000个图像。你知道吗

为了避免将它们全部加载到内存中并遇到OOM问题,我已将数据预批处理为500个图像文件,每个文件采用.h5文件格式-这将导致80个.h5文件用于培训,40个用于验证。培训和验证文件分别保存在各自的目录中,例如data\Training和data\validation。你知道吗

对于自定义数据加载器(如https://stanford.edu/~shervine/blog/pytorch-how-to-generate-data-parallel)的建议方法如下:

class Dataset(data.Dataset):
    'Characterises a dataset for PyTorch'
     def __init__(self, list_IDs, labels):
        'Initialisation'
         self.labels = labels # targets
         self.list_IDs = list_IDs # h5 files

    def __len__(self):
        'Denotes number of samples'
        return len(self.list_IDs)*500

    def __getitem__(self, index):
        'Generates one sample of data'
        # Select sample
        ID = self.list_IDs[index]

        X = torch.load('data/' + ID + '.h5')
        y = self.labels[ID]

        # Load data and get label
        return X, y

我的问题是,我如何修改上面的内容,以便遍历每个.h5文件,加载500个图像块,然后从该块向神经网络提供batch_size数量的图像进行训练。i、 e.将500图像块加载到内存中,从该块中选择两个图像(如果batch_size = 2),然后通过生成器的形式将它们传递到PyTorch工作流,甚至keras fit\u生成器函数中(因为我在两个框架中都尝试了这一点)?。你知道吗

我只是想不起来:我需要在两个独立的序列上建立__getitem__方法索引吗?一个是包含图像的.h5文件,第二个是样本总数(即40000)。我曾考虑过在方法中加入一个循环来迭代.h5文件,但我认为这会中断生成器对方法的调用。你知道吗

到目前为止,我尝试了以下方法并取得了成功:

def generate_batches_from_h5_file(files, batchsize, targets):
    while True:
        with h5py.File(file, 'r') as f:
            filesize = len(f['images']) # load the 500 images
            n_entries = 0

            while n_entries < (filesize - batchsize):
                xs = np.array(f['images'][n_entries : n_entries + batchsize])
                IDs = np.array(f['IDs'][n_entries : n_entries + batchsize])
                values = [targets[ID] for ID in IDs]
                ys = np.vstack(values)
                n_entries += batchsize

                yield (xs, ys)

但是,这不是线程安全的,如果我想启用多处理,它将不起作用。你知道吗

如果能帮上忙,我将不胜感激,谢谢。你知道吗


Tags: 文件数据方法图像selfididsdata