请帮助我理解为什么我的输入数据标准化为 [-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 进行图像预处理
,问题就会完全消失。预处理输入。这种预处理方法不会对图像数据进行归一化,令我惊讶的是,它可以在没有任何过度拟合的情况下进行正确的模型训练。
我尝试使用具有不同概率的 Dropout,L2 正则化。还尝试通过减少顶层数量和每个顶层中的节点数量来降低模型的复杂性。我确实玩过学习率和批量大小。 如果我的输入数据被规范化,没有任何帮助,我不知道为什么会这样。
重要说明:当使用 VGG 而不是 ResNet 时,一切似乎都运行良好!
我真的很想弄清楚为什么会这样。
UPD:问题是由两个原因引起的: - ResNet 中的批量归一化层在卡住时无法正常工作 - ResNet 的图像预处理应该使用 Z-score 完成
经过上述两次修复后,一切似乎都运行良好!
最佳答案
为了社区的利益提及下面的解决方案。
通过进行以下更改解决了问题:
Batch Normalization layers
在卡住时无法正常工作。因此,在训练模型之前,ResNet
中的Batch Normalization Layers
应该解冻
。- ResNet 的图像预处理(归一化)应该使用
Z-score
完成,而不是 Keras 的ImageDataGenerator
中的preprocessing_function
ResNet
中的 关于python - 如果输入数据被归一化,ML 模型会过拟合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58543537/