摘要:尝试使用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处理大型数据集时内存不足。我知道批处理是解决方案的主要组成部分...只是不了解如何实现。问题:...
X
的内存占用量增加一倍的过程。 (我知道,这很明显)。这是一个BIG数组,使用X = X[:,1:-1,1:256]
(也许使用X = X[..., np.newaxis]
)可以将所需的内存增加一倍。他们的关键是将X
分配为最终所需的尺寸/形状(避免复制)。然后修改逻辑以将数据从dset
(f['/30sec/Spectrogram']
)加载到中间数组(以下为ds_arr
),根据需要进行修改,然后加载到X
。