我目前正在开发一个卷积神经网络,它接收图像并对其进行回归分析。一个示例训练数据集可能包含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)
但是,这不是线程安全的,如果我想启用多处理,它将不起作用。你知道吗
如果能帮上忙,我将不胜感激,谢谢。你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐