使用多个 CSV 文件训练 Keras 模型

数据挖掘 喀拉斯 大数据 训练
2022-01-25 13:02:08

我目前正在尝试在几个大型 CSV 文件上训练 Keras 模型。我可以在内存中放入一个,但不能全部组合在一起。从我的角度来看,有几种方法可以解决这个问题。

我可以将所有数据合并到一个 CSV 文件中,然后通过数据块读取 CSV。这将简化该过程,但是,我将无法在每个时期对数据进行洗牌。

我能想到的其他方法是创建一个自定义 fit_generator。但是我不确定如何实际实现这一点。我应该为每个数据集创建一个特殊的生成器,然后循环它们吗?这将允许我在每个时期甚至它们的顺序中对每个数据集进行洗牌。

我相信只实现一个生成器并管理其中的所有文件会更优雅。但是,要完成这项工作,我需要在训练之前知道批次数。这需要我首先获取每个文件中的样本数量,这需要一段时间。另外,我需要在使用 pandas 读取文件后解决某些行不正确的问题。这限制了我使用一些快速的操作系统级函数来获取行数。

或者是否可以在不设置训练前的批次数的情况下实际创建 fit_generator ?你会推荐什么方法?

2个回答

我会将 tensorflow 2.0 与 tf.data 一起使用

import tensorflow as tf

filenames = ["filename1", "filename2", ...]

dataset = tf.data.Dataset.list_files(filenames, seed=42, shuffle=True)

# this reads 5 text files at a time, skips the first row of each file
dataset.interleave(lambda filename: tf.data.TextLineDataset(filename).skip(1), cycle_length=5, num_parallel_calls=tf.data.experimental.AUTOTUNE)

for line in dataset.take(5):
    print(line)

然后,您可以将数据集对象直接传入 tensorflow.keras 进行训练。

这里有一些很好的例子,但请注意这不适用于 tensorflow 2.0,并且可能已经发生了一些变化

这可能是您考虑的潜在选择。从每个 csv 文件中提取记录的子样本。如果您的数据(至少在某种程度上)正态分布,这应该很好。如果分布不正常,则对其进行归一化或标准化。

from sklearn import preprocessing
normalized_X = preprocessing.normalize(X)


from sklearn import preprocessing
standardized_X = preprocessing.scale(X)

然后,

# To get 3 random rows 
# each time it gives 3 different rows 
# df.sample(3) or 
df.sample(n = 3) 


# Fraction of rows 
# here you get .50 % of the rows 
df.sample(frac = 0.5) 

另外,考虑一下。

# Split the data between the Training Data and Test Data
xTrain , xTest , yTrain , yTest = train_test_split(X , y , 
                                                  test_size = 0.30 , 
                                                  random_state = 0, 
                                          ----->  stratify = y)