你已了解自编码器是什么以及它们如何学习。现在,让我们开始动手实践:构建一个自编码器。在构建自编码器之前,我们需要数据。数据是任何机器学习模型的燃料,自编码器也不例外。在本节中,我们将着重于加载一个合适的数据集,并对其中包含的内容有一个清晰的认识。构建自编码器时,选择一个易于处理的数据集能够更好地专注于自编码器的核心机制,避免复杂数据处理的干扰。手写数字的 MNIST 数据集是此目的的典型选择,常被认为是机器学习中图像处理的“Hello World”。MNIST 数据集介绍MNIST 数据集包含数万张小型、灰度的手写数字图像(0 到 9)。每张图像宽 28 像素,高 28 像素。它被广泛使用,因为它足够简单,适合快速实验,同时又足够充实,可以展示许多机器学习原理。以下是您针对我们的目的需要了解的 MNIST 信息:图像: 它包含 60,000 张用于训练的图像和 10,000 张用于测试的图像。内容: 每张图像显示一个手写数字。格式: 图像是灰度的,这意味着每个像素具有单一的强度值。标签: 每张图像都有一个相应的标签,表示它代表哪个数字(例如,“7”)。虽然自编码器是无监督的,不直接使用这些标签进行重建学习,但标签是数据集的一部分,对于其他任务或未来评估特征学习很有用。对于我们的基础自编码器,我们将主要关注图像本身。使用 Keras 加载 MNISTKeras 提供了一种非常便捷的方式,可以直接将 MNIST 数据集下载并加载到我们的 Python 环境中。您无需手动下载文件或处理复杂的解析。让我们看看如何加载它。如果您已按照“深度学习 Python 环境设置”部分中的设置说明操作,您应该已准备就绪。您只需几行 Python 代码即可加载数据集:from keras.datasets import mnist # 加载 MNIST 数据集 (x_train, y_train), (x_test, y_test) = mnist.load_data()让我们分析一下这里发生了什么:我们从 keras.datasets 导入 mnist 模块。调用 mnist.load_data() 会下载数据集(如果您的机器上尚未存在),并将其分为训练集和测试集。x_train:这些是我们将用于训练自编码器的图像。它是一个包含 60,000 张图像的数组。y_train:这些是 x_train 图像的相应标签(实际数字 0-9)。我们不会直接使用它们来训练我们基础自编码器的重建任务。x_test:这些是为评估自编码器在训练期间未见过的数据上的表现而预留的 10,000 张图像。y_test:这些是 x_test 图像的标签。我们的自编码器将通过尝试重建 x_train 中的图像来进行学习。理解数据集结构数据加载完成后,下一步是理解其结构。从数字和维度来看,这些数据实际是什么样的?检查数据形状让我们找出图像数据的维度。您可以通过检查 NumPy 数组的 shape 属性来做到这一点:import numpy as np print(f"x_train shape: {x_train.shape}") print(f"Number of training samples: {x_train.shape[0]}") print(f"Image dimensions: {x_train.shape[1]}x{x_train.shape[2]} pixels") print(f"x_test shape: {x_test.shape}") print(f"Number of testing samples: {x_test.shape[0]}")如果运行此代码,您可能会看到类似以下内容的输出:x_train shape: (60000, 28, 28) Number of training samples: 60000 Image dimensions: 28x28 pixels x_test shape: (10000, 28, 28) Number of testing samples: 10000这告诉我们:x_train 包含 60,000 个样本(图像)。x_train 中的每张图像高 28 像素,宽 28 像素。类似地,x_test 包含 10,000 张图像,每张也是 28x28 像素。这个 28x28 的维度表示每张图像由 $28 \times 28 = 784$ 个像素组成。我们的自编码器最终将以这 784 个像素值作为输入。检查数据类型和像素值我们处理的是什么类型的数字?让我们检查像素值的数据类型:print(f"Data type of x_train: {x_train.dtype}")输出通常会是:Data type of x_train: uint8uint8 表示“无符号 8 位整数”。这是一种常见的图像数据类型,其中像素值的范围是 0 到 255。0 通常代表黑色。255 通常代表白色。介于两者之间的值代表不同深度的灰色。您可以通过检查数据集中的最小值和最大值来确认像素值的范围:print(f"Minimum pixel value: {np.min(x_train)}") print(f"Maximum pixel value: {np.max(x_train)}")这应该输出:Minimum pixel value: 0 Maximum pixel value: 255这个范围(0-255)很重要。在将这些值输入神经网络之前,我们通常需要对其进行标准化(例如,将其缩放到 0-1 范围),这将在“自编码器数据预处理”部分中介绍。数据可视化数字和形状提供信息,但没有什么比实际查看数据更好的了,尤其是在处理图像数据时。让我们显示其中一些手写数字。为此,我们可以使用一个流行的 Python 库,名为 Matplotlib。import matplotlib.pyplot as plt # 显示 x_train 中的前 10 张图像 plt.figure(figsize=(10, 2)) # 调整图形大小以获得更好的布局 for i in range(10): plt.subplot(1, 10, i + 1) # 为每张图像创建一个子图 plt.imshow(x_train[i], cmap='gray') # 以灰度显示图像 plt.title(f"Label: {y_train[i]}") # 显示标签作为标题 plt.axis('off') # 隐藏坐标轴刻度和标签 plt.show()运行此代码时,您会看到一个弹出窗口(或 Jupyter Notebook 中嵌入的图像),显示内容如下:一行十张小图像,每张都显示一个手写数字(例如,5、0、4、1、9、2、1、3、1、4)。每张图像上方都显示其对应的标签(它所代表的数字)。图像为灰度。这种可视化方式证实了我们的数据符合预期:数字图像。您可以看到手写字体的多样性,这使得机器学习这项任务并非易事。请注意 plt.imshow() 中的 cmap='gray' 参数。这指示 Matplotlib 以灰度渲染图像,因为像素值代表强度而非颜色。如果没有它,Matplotlib 可能会使用默认的颜色映射,这可能会产生误导。MNIST 为何是一个好的起点在您的第一个自编码器项目中选用 MNIST 具有多项优点:大小适中: 它足够大以具备意义,但又足够小,使得模型在大多数现代计算机上训练速度相对较快。简单性: 图像小巧且为灰度,与更大、彩色的图像相比,降低了复杂性。表现良好: 数据干净且结构良好。关注核心要点: 它允许您专注于理解自编码器架构、训练和评估,而不是在数据收集或清理上花费过多时间。我们的自编码器将学习如何接收一张 28x28 像素的图像,将其压缩到瓶颈层中一个更小的表示,然后尝试从这种压缩形式重建原始的 28x28 图像。通过查看数据,您现在对自编码器的输入内容有了更清晰的认识。随着 MNIST 数据集的加载和理解,我们已准备好将其用于自编码器。下一步,“自编码器数据预处理”将介绍进行必要的数据转换,使这些原始数据达到适合我们神经网络的理想形状和格式。