python - 如果输入数据被归一化,ML 模型会过拟合

标签 python tensorflow machine-learning keras resnet

请帮助我理解为什么我的输入数据标准化为 [-0.5. 0.5] 而它不会过度拟合。

我正在解决一个回归 ML 问题,试图检测图像上 4 个关键点的位置。为此,我导入预训练的 ResNet 50 并将其顶层替换为以下架构:

  • 紧跟在 ResNet 之后的扁平化层
  • 具有 256 个节点的全连接(密集)层,然后是 LeakyRelu 激活和批量归一化
  • 另一个具有 128 个节点的全连接层,其后还有 LeakyRelu 和 Batch Normalization
  • 最后一个全连接层(有 8 个节点)为我提供了 4 个关键点的 8 个坐标(4 个 X 和 4 个 Y)。

由于我坚持使用 Keras 框架,所以我使用 ImageDataGenerator 来生成数据流(图像)。由于我的模型输出(8 个数字:4 个关键点中的每个点有 2 个坐标)归一化到 [-0.5, 0.5] 范围,我决定我的模型(图像)的输入也应该在这个范围内,因此将它归一化为在 Keras 的 ImageDataGenerator 中使用 preprocessing_function 的相同范围。

刚开始训练模型,问题就出来了。我卡住了整个 ResNet (training = False),目的是首先将顶层的梯度移动到适当的程度,然后才解冻一半的 ResNet 并微调模型。当使用卡住的 ResNet 进行训练时,我注意到我的模型在几个 epoch 之后就出现了过度拟合。令人惊讶的是,即使我的数据集大小相当不错(25k 图像)并且采用了批量归一化,它也会发生。

更令人惊讶的是,如果我从输入归一化转向 [-0.5, 0.5] 并使用 tf.keras.applications.resnet50 进行图像预处理,问题就会完全消失。预处理输入。这种预处理方法不会对图像数据进行归一化,令我惊讶的是,它可以在没有任何过度拟合的情况下进行正确的模型训练。

我尝试使用具有不同概率的 DropoutL2 正则化。还尝试通过减少顶层数量和每个顶层中的节点数量来降低模型的复杂性。我确实玩过学习率批量大小如果我的输入数据被规范化,没有任何帮助,我不知道为什么会这样。

重要说明:当使用 VGG 而不是 ResNet 时,一切似乎都运行良好!

我真的很想弄清楚为什么会这样。


UPD:问题是由两个原因引起的: - ResNet 中的批量归一化层在卡住时无法正常工作 - ResNet 的图像预处理应该使用 Z-score 完成

经过上述两次修复后,一切似乎都运行良好!

最佳答案

为了社区的利益提及下面的解决方案。

通过进行以下更改解决了问题:

    ResNet 中的
  1. Batch Normalization layers 在卡住时无法正常工作。因此,在训练模型之前,ResNet 中的Batch Normalization Layers 应该解冻
  2. ResNet 的图像预处理(归一化)应该使用 Z-score 完成,而不是 Keras 的 ImageDataGenerator 中的 preprocessing_function

关于python - 如果输入数据被归一化,ML 模型会过拟合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58543537/

相关文章:

python - 如何更改每一行中特定单元格左侧的所有值

python - 如何从 Keras 中的 ImageDataGenerator 格式化 X 和 Y 数据?

python - Keras 值错误 : Unknown activation function:<lambda>

python - 如何在RaspberryPi上运行TFLite模型

Python - 为什么通配符位在这里不起作用?

python - 在 python 中创建 GraphQL 查询

python - TensorFlow 分配内存 : Allocation of 38535168 exceeds 10% of system memory

machine-learning - 异构特征空间上的SVM学习

python-2.7 - 如何在 Python Scikit-learn 中存储与预向量化 X 匹配的预测类?

python - 如何根据 python 和 NLPK 中 CSV 文件的训练数据预测位置