Keras 中的自动编码器分类

2025年2月3日 | 阅读 6 分钟

理解自编码器

自编码可以被描述为一种数据压缩形式,其中编码和解码的功能(a)都依赖于待压缩的数据,(b)是有损的,并且(c)是从示例中学习到的,而不是设计的。在大多数情况下,这些功能都是使用神经网络实现的。

与大多数神经网络类似,自编码器是数据特定的,因此它们只能压缩与神经网络被训练识别的类型相似的数据。这与所谓的通用压缩算法(如 MP3)不同,MP3 算法对“声音”提供一定的假设,但不对“声音”的类型做假设。例如,一个在人脸数据上训练的自编码器在压缩树木时效果会很差,因为所有学到的特征都特定于人脸。

这意味着自编码器是有损的,就像 MP3 或 JPEG 一样,解压缩后的输出质量会比输入自编码器的质量低。这与无损压缩技术不同。自编码器是从数据示例中自动学习的。这很有益,因为它使得训练算法的专用实例以处理特定类型输入的数据更加容易。这个过程只涉及使用训练数据,而无需任何新的工程设计。

为了构建一个自编码器,你需要一个编码函数、一个解码函数,以及一个量化编码表示和解码表示之间丢失信息量的度量;即一个“损失”函数。编码器和解码器通常是参数化函数,通常是深度神经网络;此外,它们相对于距离函数应该是可微的。

这些使得编码/解码函数的参数可以通过随机梯度下降来训练,以减少重构损失。这很简单!而且,就像机器学习中的大多数概念一样,你不需要了解所有细节就可以开始在实践中使用自编码器。

自编码器在数据压缩方面表现如何?

总的来说,不太好。例如,在图像压缩的背景下,训练自编码器很难超越像 JPEG 这样的基本算法。自编码器不可能在 JPEG 效果不好的其他图像上表现得比 JPEG 更好。由于这种结构,自编码器不适合实际的数据压缩;它们只能用于数据与训练数据相似的场景。性能上的积极影响是以使学习到的变换更加通用为代价的,而这反过来又需要大量的训练数据。然而,未来的进展可能会改变这一点。

自编码器适用于什么?

实际上,自编码器在实践中很少被应用。在 2012 年,它们曾被用于深度卷积神经网络的贪婪层预训练,但后来被广泛放弃,因为很快就发现了更好的随机权重初始化技术,用于从原始数据训练深度网络。到 2014 年,批量归一化理论使得作者能够创建更深的网络,到 2015 年底,残差学习理论使得训练完全即时的、尽管非常深的网络成为可能。

目前,自编码器有两个令人兴奋的用例:数据清理(例如,去噪)以及数据可视化和降维。当维度和稀疏性得到适当限制时,自编码器能够学习到比 PCA 等方法更有价值的数据投影。

在 2D 可视化方面,据我所知,没有比 t-SNE 或“tee-snee”更好的算法了,尽管该算法通常需要较低维的数据。有几种算法可以可视化相似性关系,并且为了降低大型数据集的维度,一个好主意是将数据通过自编码器进行处理,将数据维度降到 32,然后对编码器的输出运行 t-SNE;从而,将大型数据集显示在 2D 平面上。Kyle McDonald 在 Keras 中创建了一个相当不错的 t-SNE 参数化实现,可以在 GitHub 上找到。Scikit-learn 也提供了一个简单而实用的实现。

在 Keras 中实现自编码器分类的步骤

准备数据集

  • 准备或导入一个具有期望输入特征和输出标签的数据集。
  • 将数据集随机划分为训练集和测试集。
    然后,将特征归一化到合适的尺度,例如,缩放到 [0, 1] 范围。

定义自编码器模型

  • 编码器:开发一个编码器网络,将输入数据映射到一个更小的特征空间,通常称为瓶颈。
  • 解码器:构建一个解码器网络,能够从最后的隐藏表示中恢复出原始输入。
    自编码器模型:将编码器和解码器堆叠在一起,创建一个全功能的自编码器模型。

训练自编码器

  • 使用重构任务,即将自编码器模型的输入与输出设置为相同:训练自编码器模型。

保存编码器

  • 从自编码器模型中剥离编码器部分。
  • 将编码器模型写入文件以备后用。

定义分类器模型

  • 特征提取:将输入数据的值通过编码器,以获得特征表示。
  • 分类器:在编码器之上添加分类层(例如,密集层),以进行分类。

训练分类器

  • 基于编码器的特征和属于十个类别的标签来训练分类器模型。

评估和保存模型

  • 评估和保存模型
  • 接下来,将分类器模型和编码器模型写入文件,以便以后需要时使用。

这样,您就可以构建和训练自编码器进行特征提取,并随后利用获得的特征进行分类。

代码

输出

Autoencoder Classification in Keras
Autoencoder Classification in Keras

说明

该代码训练一个自编码器来学习输入数据的压缩特征。它提供了自编码器的定义,即一个压缩数据的编码器和一个重构数据的解码器。一旦自编码器在重构任务上训练完成,编码器部分就被用于提取特征。这些特征被用来构建一个带有密集层和 dropout 的分类模型进行分类。最后一个称为分类器的层,然后根据带标签的数据进行训练,并且编码器和分类器都被保存。为了可视化训练过程的结果,会绘制包括损失和准确率在内的训练历史。