大 HDF5 数据集,如何在每个 epoch 后有效地洗牌

Posted

技术标签:

【中文标题】大 HDF5 数据集,如何在每个 epoch 后有效地洗牌【英文标题】:Big HDF5 dataset, how to efficienly shuffle after each epoch 【发布时间】:2018-03-16 19:48:41 【问题描述】:

我目前正在使用一个大型图像数据集 (~60GB) 来训练 CNN (Keras/Tensorflow) 以完成简单的分类任务。 这些图像是视频帧,因此在时间上高度相关,所以我在生成巨大的 .hdf5 文件时已经对数据进行了一次混洗...... 为了将数据输入 CNN 而不必一次将整个数据集加载到内存中,我编写了一个简单的批处理生成器(参见下面的代码)。 现在我的问题: 通常建议在每个训练时期之后对数据进行洗牌,对吗? (出于 SGD 收敛的原因?)但要这样做,我必须在每个 epoch 之后加载整个数据集并对其进行洗牌,这正是我想避免使用批处理生成器的原因...... 所以:在每个时期之后洗牌数据集真的那么重要吗?如果是的话,我怎么能尽可能有效地做到这一点? 这是我的批处理生成器的当前代码:

def generate_batches_from_hdf5_file(hdf5_file, batch_size, dimensions, num_classes):
"""
Generator that returns batches of images ('xs') and labels ('ys') from a h5 file.
"""
filesize = len(hdf5_file['labels'])

while 1:
    # count how many entries we have read
    n_entries = 0
    # as long as we haven't read all entries from the file: keep reading
    while n_entries < (filesize - batch_size):
        # start the next batch at index 0
        # create numpy arrays of input data (features)
        xs = hdf5_file['images'][n_entries: n_entries + batch_size]
        xs = np.reshape(xs, dimensions).astype('float32')

        # and label info. Contains more than one label in my case, e.g. is_dog, is_cat, fur_color,...
        y_values = hdf5_file['labels'][n_entries:n_entries + batch_size]
        #ys = keras.utils.to_categorical(y_values, num_classes)
        ys = to_categorical(y_values, num_classes)

        # we have read one more batch from this file
        n_entries += batch_size
        yield (xs, ys)

【问题讨论】:

速度的重要方面是将 hdf5 文件中的chuck_size 设置为图像的大小。这提高了效率,同时从 hdf5 获取单个图像 【参考方案1】:

是的,改组可以提高性能,因为每次以相同的顺序运行数据可能会让您陷入次优领域。

不要打乱整个数据。在数据中创建一个索引列表,然后改组它。然后在索引列表上按顺序移动,并使用其值从数据集中挑选数据。

【讨论】:

以上是关于大 HDF5 数据集,如何在每个 epoch 后有效地洗牌的主要内容,如果未能解决你的问题,请参考以下文章

将 hdf5 文件合并为单个数据集

如何从 hdf5 保存/提取数据集并转换为 TiFF?

如何将 Pandas 数据框写入 HDF5 数据集

搜索 HDF5 数据集

多个 HDF5 文件的 HDF5 数据层定义

为啥我的 hdf5 文件看起来如此不必要地大?