趋近智
你已了解自编码器是什么以及它们如何学习。现在,让我们开始动手实践:构建一个自编码器。在构建自编码器之前,我们需要数据。数据是任何机器学习模型的燃料,自编码器也不例外。在本节中,我们将着重于加载一个合适的数据集,并对其中包含的内容有一个清晰的认识。
构建自编码器时,选择一个易于处理的数据集能够更好地专注于自编码器的核心机制,避免复杂数据处理的干扰。手写数字的 MNIST 数据集是此目的的典型选择,常被认为是机器学习中图像处理的“Hello World”。
MNIST 数据集包含数万张小型、灰度的手写数字图像(0 到 9)。每张图像宽 28 像素,高 28 像素。它被广泛使用,因为它足够简单,适合快速实验,同时又足够充实,可以展示许多机器学习原理。
以下是您针对我们的目的需要了解的 MNIST 信息:
Keras 提供了一种非常便捷的方式,可以直接将 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 的维度表示每张图像由 28times28=784 个像素组成。我们的自编码器最终将以这 784 个像素值作为输入。
我们处理的是什么类型的数字?让我们检查像素值的数据类型:
print(f"Data type of x_train: {x_train.dtype}")
输出通常会是:
Data type of x_train: uint8
uint8 表示“无符号 8 位整数”。这是一种常见的图像数据类型,其中像素值的范围是 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 具有多项优点:
我们的自编码器将学习如何接收一张 28x28 像素的图像,将其压缩到瓶颈层中一个更小的表示,然后尝试从这种压缩形式重建原始的 28x28 图像。通过查看数据,您现在对自编码器的输入内容有了更清晰的认识。
随着 MNIST 数据集的加载和理解,我们已准备好将其用于自编码器。下一步,“自编码器数据预处理”将介绍进行必要的数据转换,使这些原始数据达到适合我们神经网络的理想形状和格式。
这部分内容有帮助吗?
Sep 5, 2025
更新以使用 Pytorch 和 Keras 3 代替 Tensorflow
© 2026 ApX Machine Learning用心打造