自编码器
- 1、引言
- 2、自编码器
- 2.1 定义
- 2.2 原理
- 2.3 实现方式
- 2.4 算法公式
- 2.5 代码示例
- 3、总结
1、引言
小屌丝:鱼哥, 今天可以讲一讲 自编码器嘛
小鱼:请说清楚,是什么编码器?
小屌丝:自编码器
小鱼:自己的写的编码器吗?
小屌丝:你要是这么说,也没毛病, 自己写自编码器博文
小鱼:… 那我不写了。
小屌丝:…别啊。
小鱼:那你说清楚,是什么自编码器呢?
小屌丝:就是 无监督学习的 自编码器
小鱼:… 感觉自己给你挖坑。
小屌丝: 没关系, 我带铁锹的哦 。你看
小鱼:此时小鱼的想法。
小屌丝:我不是那个意思了。
小鱼:那你是啥意思。
小屌丝:(⊙o⊙)…,嗯… 听说xxx(此处省略几个字)要上zhong了哦
小鱼: 那还等什么。
2、自编码器
2.1 定义
自编码器是一种无监督的神经网络模型,它试图通过训练网络来学习一个恒等函数,即输出尽可能接近输入的表示。
自编码器由两部分组成:编码器(Encoder)和解码器(Decoder)。
编码器负责将输入数据压缩成一个低维的隐藏层表示(编码),而解码器则负责从编码中重构出原始输入。
2.2 原理
自编码器的原理基于神经网络的学习能力。
在训练过程中,自编码器通过最小化重构误差来优化网络参数,使得解码器能够准确地从编码中恢复出原始输入。
通过限制隐藏层的大小,自编码器可以学习到一个紧凑的、有意义的输入表示,这个表示能够捕捉到输入数据的关键特征。
2.3 实现方式
实现自编码器通常包括以下步骤:
- 构建网络结构:
- 定义编码器和解码器的网络层,以及它们的连接方式。
- 编码器通常是一个多层感知机(MLP),通过一系列线性变换和非线性激活函数将输入数据压缩成低维编码。
- 解码器则是一个与编码器结构对称的网络,用于从编码中重构出原始输入。
- 定义损失函数:
- 损失函数用于衡量解码器输出的重构数据与原始输入之间的差异。
- 常用的损失函数包括均方误差(MSE)和交叉熵损失等。
- 训练网络:
- 使用无监督学习方法(如随机梯度下降)来训练自编码器。
- 在训练过程中,网络参数通过反向传播算法进行更新,以最小化损失函数。
- 应用:
- 一旦自编码器训练完成,它可以用于多种任务,如数据降维、特征提取、去噪等。
- 通过提取编码层的输出,我们可以获得输入数据的低维表示,用于后续的分析和建模。
2.4 算法公式
自编码器的算法公式主要涉及编码和解码过程。假设输入数据为(x),编码器的输出(即编码)为(h),解码器的输出为(\hat{x})。
- 则编码过程:
[ h = f encoder ( x ) ] [ h = f_{\text{encoder}}(x) ] [h=fencoder(x)]
其中,$(f_{\text{encoder}})$表示编码器的映射函数,通常是一个参数化的神经网络。
- 解码过程:
[ x ^ = f decoder ( h ) ] [ \hat{x} = f_{\text{decoder}}(h) ] [x^=fdecoder(h)]
其中,$(f_{\text{decoder}})$表示解码器的映射函数,也是一个参数化的神经网络。
- 损失函数通常定义为重构误差,如均方误差:
[ L ( x , x ^ ) = 1 n ∑ i = 1 n ( x i − x ^ i ) 2 ] [ L(x, \hat{x}) = \frac{1}{n} \sum_{i=1}^{n} (x_i - \hat{x}_i)^2 ] [L(x,x^)=n1i=1∑n(xi−x^i)2]
其中,(n)是输入数据的维度。
训练过程中,通过最小化损失函数来更新编码器和解码器的参数。
2.5 代码示例
# -*- coding:utf-8 -*-
# @Time : 2024-03-11
# @Author : Carl_DJ'''
实现功能:使用 Keras库实现自编码器'''
import numpy as np
from keras.layers import Input, Dense
from keras.models import Model # 假设输入数据维度为784(例如,展平后的28x28图像)
input_dim = 784
encoding_dim = 32 # 编码维度 # 定义编码器模型
input_img = Input(shape=(input_dim,))
encoded = Dense(encoding_dim, activation='relu')(input_img) # 定义解码器模型
decoded = Dense(input_dim, activation='sigmoid')(encoded) # 构建自编码器模型
autoencoder = Model(input_img, decoded) # 编译模型
autoencoder.compile(optimizer='adam', loss='binary_crossentropy') # 生成一些随机数据作为示例
x_train = np.random.random((1000, input_dim))
x_train = x_train.astype('float32') / 255. # 训练自编码器
autoencoder.fit(x_train, x_train, epochs=50, batch_size=256, shuffle=True, validation_data=(x_train, x_train)) # 使用编码器提取特征
encoder = Model(input_img, encoded)
encoded_imgs = encoder.predict(x_train)
代码实现功能解析
-
定义自编码器模型:使用Keras库定义了一个简单的自编码器模型。自编码器是一种无监督学习模型,它试图学习一个恒等函数,即输出尽可能地复制输入。它由两部分组成:编码器和解码器。
- 编码器:将输入数据压缩成一个低维表示,这里使用了单个全连接层(Dense layer),输出维度为encoding_dim(在这个例子中是32)。
- 解码器:从编码器的输出中重构出原始输入数据,这里也使用了单个全连接层,输出维度与输入维度相同(input_dim,这里是784)。
-
编译模型:使用Adam优化器和二元交叉熵损失函数来编译自编码器模型。优化器用于更新模型的权重以最小化损失函数,而损失函数衡量了模型输出与原始输入之间的差异。
-
生成训练数据:生成了一个随机的数据集x_train,其形状为(1000, 784)。这里假设这些数据代表784维的特征(例如,展平的28x28像素的图像)。然后,这些数据被归一化到0到1的范围内。
-
训练自编码器:使用生成的训练数据x_train来训练自编码器模型。训练过程中,模型会尝试学习一个函数,使得输入数据通过编码器和解码器后能够尽可能地接近原始输入。
-
提取特征:训练完成后,代码构建了一个新的模型encoder,该模型仅包含自编码器中的编码器部分。然后,使用这个编码器模型对训练数据x_train进行预测,得到其低维表示encoded_imgs。这些低维表示可以被视为输入数据的特征,可以用于后续的任务,如分类、聚类等。
3、总结
看到这里,今天的分享就该结束了。
自编码器通过学习输入数据的压缩表示来实现无监督特征学习。
它延伸应用于数据去噪、异常检测等任务中。但编码空间容易趋向平均值,需要设计特殊结构进行正则化。
自编码器为后来的变分自编码器等深度学习模型奠定基础。
当然, 随着深度学习技术的不断发展,自编码器也在不断演进和创新。例如,变分自编码器(VAE)、卷积自编码器(CAE) 等变体在特定任务上取得了更好的效果。
我是小鱼:
- CSDN 博客专家;
- 阿里云 专家博主;
- 51CTO博客专家;
- 企业认证金牌面试官;
- 多个名企认证&特邀讲师等;
- 名企签约职场面试培训、职场规划师;
- 多个国内主流技术社区的认证专家博主;
- 多款主流产品(阿里云等)测评一、二等奖获得者;
关注小鱼,学习机器学习领域的知识。