将字节文件数据优化并批处理到 keras 模型中

Optimize and batch byte file data into keras models

我正在尝试向我的 model.fit 提供分块数据,因为我的整个数据集不适合我的记忆。 TF版本是2.4.

我已经优化了存储在文件中的数据集,以字节为单位保存它,每个列是 1 个字节 (0-255),但现在我需要以块的形式读取它并开始我的网络的学习过程。

在此之前,我使用的是 .csv,使用 numpy reshape 加载数据集,然后将整个数据集提供给 keras 模型。

我是否应该为每个块使用 .fit 从之前的迭代中加载 load_weight

file 成为您存储数据的文件。要创建数据集,首先需要创建一个 generator 来读取数据。示意性地,它应该具有以下结构:

    def generator(file):
        with open(file,'r') as f:
            for linne in f:
                ### code for generating single sample and, optionally, label ###
                yield (sample,label)

你无论如何都不要发出文件结束的信号。当调用 generator 时,它会以 (sample,label) 对的形式生成所有数据。要检查 generator 是否正确生成数据,可以做类似

的事情
    for (sample,label) in generator(file):
        ### examine your samples and labels

如果为了生成单个样本,您需要在 file 中处理不止一行,您应该相应地修改代码(或文件)。

一旦你有了一个可用的生成器,你就可以创建一个 dataset:

    dataset = tf.data.Dataset.from_generator( generator(file), 
                output_signature=( 
                    ( tf.TensorSpec(shape=(shape-of-your-data)),
                      tf.TensorSpec(shape=(shape-of-your-labels)) ) )

您可以从不同的文件中读取示例和标签。如果 dataset_Adataset_B 分别包含样本和标签,则需要使用数据集的 zip 方法以训练对的形式获得数据集。

此外,您需要对单个样本进行批处理:

    dataset = dataset.batch(32)

要改进准备数据的管道,prefetch 数据集是一个很好的做法:

    dataset = dataset.prefetch(number-of-batches-to-prefetch)

这会在当前数据通过网络传递时“预加载”数据,详情请参阅 this tutorial(我不建议使用 tf.data.AUTOTUNE 作为 prefetch 的参数;通常手动设置参数会产生更好的性能)。

生成的 dataset 可用于拟合 model.fit 中的模型。请注意,对于数据集,model.fitshuffle 参数将被忽略。要随机播放数据,您需要使用 datasetsshuffle 方法。

就我个人而言,我发现从 h5 文件生成数据很有用。在这种情况下,您只需要像在 numpy 数组中那样遍历样本,而不是逐行读取文件。这样更灵活(例如,您可以直接在生成器中对数据进行混洗)并且在读取数据方面更方便。