本章前面提过,过拟合是个常见问题,即模型过于适配训练数据,包括数据中的噪声和特定特点,导致在未见过的数据上表现不佳。应对此问题的一个有效方法,尤其是在数据集有限时,是数据增强。数据增强通过生成现有数据点的修改版本,人为地扩充了训练数据集的大小和多样性。你不需要收集全新的数据(这可能耗费高昂且耗时),而是通过对当前数据应用各种逼真的变换来生成新的训练样本。核心思想是,这些变换生成了模型可能在实际情况中遇到的变体,从而让模型更有效,并增强其泛化能力。数据增强有效的原因设想你正在训练一个模型来识别图像中的猫。你的训练集可能主要包含居中、面向前方且在特定光照条件下的猫图片。如果模型只见过这些例子,它可能难以识别部分被截断、旋转过或在不同光照下的猫。数据增强在训练期间引入这些变体。通过随机旋转、平移、缩放或翻转猫的图片,你教会模型,无论外观或视角发生这些微小变化,猫依然是猫。这促使模型去学习构成“猫”的内在特点,而不是仅仅记住原始训练集中特定的姿态或条件。常见的图像增强技术对于图像数据(数据增强最常应用于此处),常见技术有:旋转: 图像随机旋转一定角度范围(例如,顺时针或逆时针$10^\circ$)。宽度/高度平移: 将图像水平或垂直平移其总宽度或高度的一部分。缩放: 随机放大或缩小图像。剪切: 应用剪切变换,使图像形状倾斜。水平/垂直翻转: 沿水平或垂直轴翻转图像。水平翻转通常很有用,但垂直翻转可能不适用于所有类型的图像(例如,识别直立物体)。亮度调整: 随机改变图像的亮度。这些变换通常在训练过程中随机且动态地应用。每个训练周期,模型都会看到输入图像略微不同的版本,从而有效增加了可用数据量。在 Keras 中实现数据增强Keras 提供了便捷的层,可以直接在模型定义中进行数据增强。这种方法将预处理和增强集成到模型本身中,简化了部署并确保了一致性。这些层通常放置在主要处理层(如Conv2D或Dense)之前,但输入层之后。它们仅在训练期间活跃;在推理(预测)期间,它们会被跳过。以下是一些用于图像增强的常见 Keras 预处理层:keras.layers.RandomFlip:随机水平或垂直翻转输入。keras.layers.RandomRotation:随机旋转输入。keras.layers.RandomZoom:随机缩放输入。keras.layers.RandomContrast:随机调整对比度。keras.layers.RandomTranslation:随机水平或垂直平移输入。keras.layers.RandomBrightness:随机调整亮度。你可以按顺序组合这些层来创建增强流程。import keras from keras import layers # 定义输入形状(例如,用于 64x64 RGB 图像) input_shape = (64, 64, 3) # 包含增强层的示例模型 model = keras.Sequential( [ keras.Input(shape=input_shape), # 数据增强层 layers.RandomFlip("horizontal"), layers.RandomRotation(0.1), # 旋转高达 10%(约 36 度) layers.RandomZoom(0.1), # 缩放高达 10% layers.RandomTranslation(height_factor=0.1, width_factor=0.1), # 模型的其余部分(示例 CNN 层) layers.Conv2D(32, kernel_size=(3, 3), activation="relu"), layers.MaxPooling2D(pool_size=(2, 2)), layers.Conv2D(64, kernel_size=(3, 3), activation="relu"), layers.MaxPooling2D(pool_size=(2, 2)), layers.Flatten(), layers.Dropout(0.5), # Dropout 是另一种正则化技术 layers.Dense(1, activation="sigmoid"), # 二元分类示例 ] ) # 像往常一样编译模型 model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"]) model.summary() # 现在,当你使用 model.fit() 训练此模型时, # 增强层将自动应用 # 随机变换到每个训练图像批次。 # E.g., model.fit(train_images, train_labels, epochs=50, validation_data=(val_images, val_labels))digraph G { rankdir=LR; node [shape=box, style=filled, fillcolor="#a5d8ff", fontname="helvetica"]; edge [fontname="helvetica"]; Input [label="输入图像\n(64x64x3)", fillcolor="#ced4da"]; Flip [label="随机翻转\n('horizontal')"]; Rotate [label="随机旋转\n(0.1)"]; Zoom [label="随机缩放\n(0.1)"]; Translate [label="随机平移\n(0.1)"]; CNN [label="卷积/池化层...", fillcolor="#96f2d7"]; Output [label="输出层", fillcolor="#ffc9c9"]; Input -> Flip; Flip -> Rotate; Rotate -> Zoom; Zoom -> Translate; Translate -> CNN [label="增强图像\n(仅训练)"]; CNN -> Output; }图像数据通过集成到 Keras 模型中的增强层的数据流。这些层仅在训练期间应用变换。数据增强的考量尽管功能强大,数据增强需要仔细运用:相关性: 应用对数据有意义的变换。如果物体方向很重要(例如,区分字母“b”和“p”),垂直翻转图像可能有害。强度: 不要应用过于极端的变换,以至于改变数据的固有含义或可识别性。过度旋转或缩放可能会导致物体无法识别。计算成本: 增强会增加训练过程的计算开销,因为变换是即时应用的,默认通常在 CPU 上进行,尽管 Keras 预处理层旨在高效运行,并且通常可以在 GPU 上运行。并非万能: 数据增强对有限数据和过拟合有很大帮助,但如果可能的话,它不能替代拥有足够大且多样化的初始数据集。它在与其他正则化技术(如 Dropout)结合使用时效果最佳。通过智能地应用数据增强,你可以显著提高模型在新数据上的鲁棒性和表现,使其成为你深度学习工具箱中的一个有价值的工具。