在训练自动编码器从数据中学习之前,这些数据需要经过妥善准备。这种准备工作被称为数据预处理,它包括将原始数据转换为神经网络所需的干净且合适的格式。对于旨在准确重建输入的自动编码器来说,输入的质量和格式尤为重要。就像厨师需要准备好的食材一样,自动编码器也需要结构良好的数据才能有效学习并生成忠实的重建。为何要对自动编码器的数据进行预处理?将未经处理的原始数据直接馈入神经网络会产生许多问题。它可能导致训练缓慢、陷入次优解或产生不可靠的结果。预处理有助于:统一数据标准: 确保所有输入特征(例如图像中的像素值)都处于一致的比例。提升模型性能: 经过良好预处理的数据通常能带来更快的训练收敛和更高的模型精度。满足网络要求: 神经网络层通常对输入数据的形状和类型有特定要求。对于自动编码器而言,由于其目标是再现输入,因此确保输入干净且格式良好,直接影响其学习此重建任务的能力。图像数据的常见预处理步骤在使用像 MNIST 这样的图像数据集来训练自动编码器时,通常会执行一些预处理步骤来为网络准备数据。1. 理解数据格式与范围首先,了解原始数据的特性很重要。例如,MNIST 数据集是图像入门任务的常见示例,它由手写数字的灰度图像组成。像素值: 每张图像由像素组成,每个像素都有一个表示其亮度的值。对于 MNIST,这些通常是 8 位整数,意味着像素值范围从 0(代表黑色)到 255(代表白色)。数据形状: 每张图像都有特定的高度和宽度,MNIST 图像为 28x28 像素。如果您有这些图像的集合,例如用于训练的 60,000 张,您的数据集可以被视为一个形状为 (60,000, 28, 28) 的大数组,其中 60,000 是样本数量,每个样本是一个 28x28 的像素值矩阵。理解这些方面是在决定如何转换数据之前的第一步。2. 归一化:缩放像素值神经网络,包括自动编码器,通常在输入数值数据处于一致的小范围内时表现更好、训练更快。这个过程称为归一化。为何归一化?更好的梯度流动: 这有助于避免网络中某些权重更新过快的问题,仅仅因为其对应的输入特征值较大。这会带来更平滑、更稳定的训练。更快的收敛: 优化算法会调整网络权重,当数据归一化后,它们可以更快地找到好的解决方案。激活函数兼容性: 解码器输出层的激活函数(通常是用于重建归一化图像数据的 sigmoid 函数)期望其目标值在 [0, 1] 范围内。将输入归一化到此范围意味着您的自动编码器正在尝试重建相同尺度的数据。当使用像均方误差 (MSE) 这样的损失函数时,这种对齐也很有益,正如章节介绍中提到的,$$L(x, \hat{x}) = \frac{1}{N} \sum_{i=1}^{N} (x_i - \hat{x}_i)^2$$ 其中 $x$(输入)和 $\hat{x}$(重建)都将在 [0,1] 范围内。如何对类 MNIST 图像进行归一化:对于像素值介于 0 到 255 的图像,一种非常常见的方法是将其缩放到 [0, 1] 范围。您可以通过简单地将每个像素值除以 255.0 来实现这一点。如果 $x$ 是原始像素值,则归一化像素 $x_{norm}$ 的计算方式如下: $$x_{norm} = \frac{x}{255.0}$$使用 255.0(浮点数)而非 255(整数)可以确保除法结果也是一个浮点数,这通常是神经网络输入所需的数据类型。3. 重塑:为全连接层展平图像本章中我们将构建的自动编码器架构使用标准的“全连接”层。这些层期望每个输入样本都是扁平的一维数字列表(或向量),而非像图像那样的二维网格。为何重塑?2D 图像(例如 28x28 像素)需要进行转换,以便可以将其馈入输入层,其中每个神经元通常对应于一维向量中的一个特征。如何重塑:这种转换称为“展平”。对于 28x28 像素的 MNIST 图像,展平将其转换为一个包含 $28 \times 28 = 784$ 个元素的一维向量。因此,如果您的数据集最初形状为(图像数量, 28, 28),展平后它将变为(图像数量, 784)。每张图像现在都表示为具有 784 列的单行。网络随后也将学习重建这个展平的 784 元素向量。digraph G { rankdir=LR; graph [nodesep=0.3, ranksep=0.5]; node [shape=record, style="rounded,filled", peripheries=1, fontname="Helvetica", fontsize=10, margin="0.2,0.1"]; edge [arrowsize=0.7, fontname="Helvetica", fontsize=9]; "original_data" [label="{2D 图像 | (例如,28x28 像素)}", fillcolor="#a5d8ff"]; "flattened_data" [label="{1D 向量 | (例如,784 像素)}", fillcolor="#96f2d7"]; "original_data" -> "flattened_data" [label=" 展平操作 "]; }将 2D 图像矩阵重塑为 1D 向量。这个展平的向量随后可以馈入自动编码器的全连接输入层。4. 数据类型转换在执行了像归一化这样的算术操作后,确保数据使用适当的数值数据类型进行存储是一个好习惯。大多数深度学习框架,例如 TensorFlow 和 Keras,在计算时更倾向于数据采用浮点格式。通常,float32 是一个不错的选择。它在神经网络训练中涉及的计算数值精度与存储数据所需的内存之间取得了平衡。如果您的原始图像数据以整数形式存储(例如,像素值 0-255 的 uint8),归一化步骤中除以 255.0 通常会处理转换为浮点数。然而,显式设置类型(您将在编码示例中看到)可以防止意外问题并确保一致性。准备用于训练和评估的数据集划分尽管自动编码器是一种无监督学习形式(意味着它们从数据本身学习,无需像“猫”或“狗”这样明确的标签),但划分数据集仍然非常重要。您通常会创建至少两个划分:训练集和测试集。训练集: 这是您数据的主要部分。自动编码器使用这些示例来学习如何压缩然后重建输入。模型的权重会根据其在此集合上的表现进行调整,具体通过尝试最小化重建误差。测试集: 这部分数据被单独保存,并且在训练阶段不向模型展示。模型训练完成后,您使用测试集来评估它在未见过数据上的表现。对于自动编码器来说,这意味着检查它以前未遇到过的图像的重建质量。这有助于您了解您的模型是否能将其学习泛化,或者它是否仅仅“记忆”了训练示例(一种称为过拟合的情况)。所有预处理步骤(归一化、重塑、类型转换)必须在训练集和测试集上一致应用。这确保模型在与训练数据格式相同的数据上进行评估。完成这些预处理步骤后,您的数据现在已处于良好状态。它已经过适当缩放,维度正确,并准备好馈入您的第一个自动编码器。在接下来的章节中,我们将了解如何使用 TensorFlow 和 Keras 构建模型本身,然后使用这些准备好的数据对其进行训练。