大 HDF5 数据集,如何在每个纪元后高效地洗牌
Big HDF5 dataset, how to efficienly shuffle after each epoch
我目前正在使用大型图像数据集 (~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)
是的,改组可以提高性能,因为 运行 每次都采用相同顺序的数据可能会使您陷入次优区域。
不要打乱整个数据。在数据中创建一个索引列表,然后将其洗牌。然后按顺序移动索引列表并使用其值从数据集中选取数据。
我目前正在使用大型图像数据集 (~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)
是的,改组可以提高性能,因为 运行 每次都采用相同顺序的数据可能会使您陷入次优区域。
不要打乱整个数据。在数据中创建一个索引列表,然后将其洗牌。然后按顺序移动索引列表并使用其值从数据集中选取数据。