我如何批量读取大型.h5数据集的数据,并使用ImageDataGenerator和model.fit进行预处理,而又不会耗尽内存?

问题描述 投票:0回答:1

摘要:尝试使用TF / Keras处理大型数据集时内存不足。我知道批处理是解决方案的主要组成部分...只是不了解如何实现。

[[问题:如何从一个非常大的.h5数据集中读取数据,标准化/去除均值,然后分割数据,而又不会耗尽内存?

Context:

建立工作流程以调查自然发生的地震信号的无监督深度嵌入聚类(DEC)。这个问题特别在数据的预处理内,即,准备数据以训练/验证自动编码器/解码器。

[数据:

〜来自阵列的地震检测的6e6频谱图。尺寸:(m,n,o)=(6e6,66,301)=(样本,freq_bins,time_bins)。数据存储在一个数据集下的.h5文件中。.h5文件在磁盘上占用约1 TB。

[硬件:

双Intel Xeon E5-2683 v4 2.1 GHz,40MB缓存,16核,2个Titan GPU,528GB RAM

目前的预处理程序:

1.通过选择M个随机索引组装一个由M个频谱图组成的numpy数组X,以递增顺序进行排序,然后迭代切片.h5数据集。 (此外:这里最快的方法是将.h5数据集保存有经过优化以供以后读取的数据块,然后使用简单的“ for”循环访问数据。花式索引和“ read_direct”花了更长的时间遍历数据集。 )2.从X修剪不必要的数据(频率和时间仓值,以及数据的最后46个时间仓),并添加第4轴“ p”作为“振幅仓”。最终形状:(m,n,o,p)=(M,64,256,1)。3.去除均值并标准化数据。4.将X分成训练/验证集。# Define sample size: M = int(1e6) # Load spectrograms into X: with h5py.File(train_dataname, 'r') as f: DataSpec = '/30sec/Spectrogram' dset = f[DataSpec] m, n, o = dset.shape index = sorted(np.random.choice(m, size=M, replace=False)) X = np.empty([M, n, o]) for i in range(M): X[i,:,:] = dset[index[i],:,:] # Remove the frequency and time vectors from the data, trim time bins to len=256: X = X[:,1:-1,1:256] # Add amplitude dimension: X = X[..., np.newaxis] m, n, o, p = X.shape # Remove mean & standardize data: datagen = tf.keras.preprocessing.image.ImageDataGenerator( samplewise_center=True, samplewise_std_normalization=True) datagen.fit(X) X = datagen.standardize(X) # Split data into training/validation: X_train, X_val = train_test_split(X, test_size=0.2, shuffle=True, random_state=812) # Free up memory: del X

详细问题:

当M〜1e6时,X占用大约30%的RAM(总RAM为528GB)。运行上面的代码将产生下面的内存错误。考虑到该操作正在复制整个阵列,因此内存不足也就不足为奇了。--------------------------------------------------------------------------- MemoryError Traceback (most recent call last) <ipython-input-10-fb00ad200706> in <module> ----> 1 datagen.fit(X) ~/Anaconda/anaconda3/envs/AEC-DEC/lib/python3.6/site-packages/keras_preprocessing/image/image_data_generator.py in fit(self, x, augment, rounds, seed) 943 np.random.seed(seed) 944 --> 945 x = np.copy(x) 946 if augment: 947 ax = np.zeros( ~/Anaconda/anaconda3/envs/AEC-DEC/lib/python3.6/site-packages/numpy/lib/function_base.py in copy(a, order) 790 791 """ --> 792 return array(a, order=order, copy=True) 793 794 # Basic operations MemoryError:

我正在尝试做的事情(需要您的帮助!):

我知道我的解决方案在于批处理,但是我不确定如何实现它,以及如何将其与有效的方式配对以读取.h5,而不必将M个频谱图读入数组,然后进行批处理。我已经确定了model.fit_generator方法,现在似乎不赞成使用model.fit;而且我已经阅读了有关hdf5matrix实用程序的信息。 一个问题的陈述:如何从一个巨大的.h5数据集中批量读取数据,标准化/删除均值,然后分割数据,而又不会耗尽内存?
[我花了很多时间试图弄清楚这一点,但是我不清楚如何将所有部分放在一起,这就是为什么我一直在寻找一些可以指导我朝正确方向发展的指导。预先感谢您的帮助!

摘要:尝试使用TF / Keras处理大型数据集时内存不足。我知道批处理是解决方案的主要组成部分...只是不了解如何实现。问题:...

python tensorflow keras hdf5 h5py
1个回答
0
投票
您必须避免使X的内存占用量增加一倍的过程。 (我知道,这很明显)。这是一个BIG数组,使用X = X[:,1:-1,1:256](也许使用X = X[..., np.newaxis])可以将所需的内存增加一倍。他们的关键是将X分配为最终所需的尺寸/形状(避免复制)。然后修改逻辑以将数据从dsetf['/30sec/Spectrogram'])加载到中间数组(以下为ds_arr),根据需要进行修改,然后加载到X
© www.soinside.com 2019 - 2024. All rights reserved.