【问题标题】:How to normalize data when using Keras fit_generator使用 Keras fit_generator 时如何规范化数据
【发布时间】:2018-06-04 13:46:39
【问题描述】:
我有一个非常大的数据集,并且正在使用 Keras 的 fit_generator 来训练 Keras 模型(tensorflow 后端)。我的数据需要在整个数据集中进行标准化,但是在使用 fit_generator 时,我可以访问相对较小的数据批次,并且这个小批次中的数据标准化并不代表整个数据集中的数据标准化。影响还是挺大的(我测试了一下,模型精度明显下降)。
我的问题是:使用 Keras 的 fit_generator 时,跨整个数据集规范化数据的正确做法是什么?最后一点:我的数据是文本和数字数据的混合体,而不是图像,因此我无法使用 Keras 提供的图像生成器中的某些功能,这些功能可能会解决图像数据的一些问题。
我已经研究过在训练之前对整个数据集进行标准化(我想是“蛮力”方法),但我想知道是否有更优雅的方法来做到这一点。
【问题讨论】:
标签:
python
tensorflow
machine-learning
keras
keras-2
【解决方案1】:
生成器确实允许您对数据进行即时处理,但在训练之前对数据进行预处理是首选方法:
- 预处理和保存避免了处理每个 epoch 的数据,你应该只做可以应用于批次的小操作。例如,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)
如果您连接两个矩阵,您应该已经正确地预处理了您的数据。我只是可以想象,文本总是会过多地影响模型的结果。因此,为文本和数字数据训练单独的模型是有意义的。