使用 Keras 时如何规范化数据 fit_generator

How to normalize data when using Keras fit_generator

我有一个非常大的数据集,我正在使用 Keras 的 fit_generator 来训练 Keras 模型(tensorflow 后端)。我的数据需要在整个数据集中进行规范化,但是在使用 fit_generator 时,我可以访问相对较小的数据批次,并且在这个小批次中对数据进行规范化并不代表对整个数据集中的数据进行规范化.影响挺大的(我测试了一下,模型精度明显下降)

我的问题是:使用 Keras 的 fit_generator 时,对整个数据集的数据进行规范化的正确做法是什么?最后一点:我的数据是文本和数字数据的混合,而不是图像,因此我无法使用 Keras 提供的图像生成器中的某些功能,这些功能可能会解决图像数据的一些问题。

我研究过在训练之前对整个数据集进行标准化(我想是 "brute-force" 方法),但我想知道是否有更优雅的方法来做到这一点。

生成器确实允许您对数据进行即时处理,但在训练之前对数据进行预处理是首选方法:

  1. 预处理和保存避免处理每个时期的数据,你真的应该只做可以应用于批处理的小操作。例如,one-hot 编码是一种常见的编码,而标记化句子等可以离线完成。
  2. 您可能会调整、微调您的模型。您不希望有标准化数据的开销并确保每个模型都使用相同的标准化数据进行训练。

因此,在训练之前离线预处理一次并将其保存为您的训练数据。预测时,您可以即时处理。

您可以通过将数据预处理为矩阵来执行此操作。对您的文本数据进行一次热编码:

from keras.preprocessing.text import Tokenizer
# X is a list of text elements
t = Tokenizer()
t.fit_on_texts(X)
X_one_hot = t.texts_to_matrix(X)

并通过以下方式规范化您的数字数据:

for i in range(len(matrix)):
  refactored_array = (matrix[i]- np.min(matrix[i], 0)) / (np.max(matrix[i], 0) + 0.0001)  

如果您连接两个矩阵,您应该已经正确地预处理了您的数据。我只是可以想象文本总是会对您的模型的结果产生太大的影响。因此,为文本和数字数据训练单独的模型是有意义的。