将字节文件数据优化并批处理到 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_A
和 dataset_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.fit
的 shuffle
参数将被忽略。要随机播放数据,您需要使用 datasets
的 shuffle
方法。
就我个人而言,我发现从 h5
文件生成数据很有用。在这种情况下,您只需要像在 numpy 数组中那样遍历样本,而不是逐行读取文件。这样更灵活(例如,您可以直接在生成器中对数据进行混洗)并且在读取数据方面更方便。
我正在尝试向我的 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_A
和 dataset_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.fit
的 shuffle
参数将被忽略。要随机播放数据,您需要使用 datasets
的 shuffle
方法。
就我个人而言,我发现从 h5
文件生成数据很有用。在这种情况下,您只需要像在 numpy 数组中那样遍历样本,而不是逐行读取文件。这样更灵活(例如,您可以直接在生成器中对数据进行混洗)并且在读取数据方面更方便。