Tensorflow 使用ImageDataGenerator时不了解规范化

Tensorflow 使用ImageDataGenerator时不了解规范化,tensorflow,keras,Tensorflow,Keras,我正在尝试使用Keras和Tensorflow作为后端构建一个简单的图像分类器。然而,我很难理解在喀拉斯是如何实现正常化的 我的理解是,在机器学习中,计算训练+验证集的平均值和标准差,然后在标准化测试集和对新数据进行预测时重用平均值和标准差。因此,考虑到这一点,我将解释我在Keras的每个部分中不理解的内容 train_datagen = ImageDataGenerator(rescale=1./255, samplewise_center=True, samplewise_std_norma

我正在尝试使用Keras和Tensorflow作为后端构建一个简单的图像分类器。然而,我很难理解在喀拉斯是如何实现正常化的

我的理解是,在机器学习中,计算训练+验证集的平均值和标准差,然后在标准化测试集和对新数据进行预测时重用平均值和标准差。因此,考虑到这一点,我将解释我在Keras的每个部分中不理解的内容

train_datagen = ImageDataGenerator(rescale=1./255, samplewise_center=True, samplewise_std_normalization=True, shear_range=0.2, zoom_range=0.2)
test_datagen = ImageDataGenerator(rescale=1./255, samplewise_center=True, samplewise_std_normalization=True)
batch_size = 1024
train_generator = train_datagen.flow(X_train, one_hot_train_labels, batch_size=batch_size, shuffle=True)
validation_generator = test_datagen.flow(X_valid, one_hot_valid_labels, batch_size=batch_size)
第一个问题是关于
ImageDataGenerator
。 在文档中,它说
flow
函数规范化了数据,然后我提出了与此相关的三个问题:

  • 如果是流函数进行归一化,则
    samplewise\u std\u归一化
    samplewise\u center
    的效果如何
  • 如果我也进行规范化,为什么要使用重缩放
  • Keras如何对运行时生成的augmentad数据进行规范化,以便在开始之前不知道平均值和std

    结果=模型。评估(X_测试,一个热测试标签)

  • 当我们运行
    evaluate
    时,我有一个问题:

  • 这里如何处理规范化?我无法访问平均值和标准值,因此我无法将其应用于测试集

    predict_softmaxs=model.predict(np.array(调整大小的_图像))

  • 当我运行
    predict
    时,我有一个问题:

  • 再一次,我无法访问平均值和标准差,因此我无法将其应用于预测图像
  • 如果是流函数执行此操作,则samplewise_标准化和samplewise_中心的效果如何 正常化
  • 通常的做法是在运行变压器之前定义它们。例如,
    scikit-learn
    的转换器也可以这样做(实际上,他们的
    标准缩放器以类似的方式工作)

  • Keras如何对运行时生成的augmentad数据进行规范化,以便在开始之前不知道平均值和std
  • 它可以进行batchtwise规范化

    可以说,这不是标准化数据的正确方法。正确的方法是根据列车组进行标准化。 这意味着您应该首先
    在列车数据上安装
    生成器,然后才使用
    flow
    方法

    这实际上是在
    ImageDataGenerator
    中烘焙的-如果您指定
    samplewise\u std\u normalization
    并且在尝试标准化批处理时不适合您的生成器Keras

    评估和预测:
    这些是模型的方法。他们只是在输入数据上运行模型,所以他们不做任何标准化-您应该向他们提供之前标准化过的数据。

    +1用于涵盖批量标准化(这可以减少辍学的需要,并导致更快的网络培训)。我要补充的是,在0-1范围内表示像素值(正常范围0-255)是正常的。因此,当您运行测试数据时,不需要对mean和std-dev(白化)执行任何操作,但需要确保像素值介于0和1之间。我认为使用像素范围0-1有助于减少网络中所需的权重,并有助于网络收敛。但问题仍然是,我不需要对训练集的平均值和标准进行归一化测试集吗?是的,你应该这样做。我据此编辑了答案