当前位置: 首页 > news >正文

[深度学习] 自编码器Autoencoder

自编码器(Autoencoder)是一种无监督学习算法,主要用于数据的降维、特征提取和数据重建。自编码器由两个主要部分组成:编码器(Encoder)和解码器(Decoder)。其基本思想是将输入数据映射到一个低维的潜在空间,然后再从该潜在空间重建出原始数据。

1. 自编码器的结构

一个典型的自编码器包括以下部分:

  • 编码器(Encoder):将输入数据压缩到一个低维的潜在空间表示。通常由若干层神经网络组成。
  • 潜在空间(Latent Space):编码器输出的低维表示,也称为编码(Code)或瓶颈(Bottleneck)。
  • 解码器(Decoder):将低维的潜在空间表示解码回原始数据的维度。通常也由若干层神经网络组成。

2. 自编码器的工作原理

自编码器通过两个阶段来训练和使用:

  1. 训练阶段

    • 输入数据 x 通过编码器映射到潜在空间 z,表示为 z=f(x)。
    • 潜在空间表示 z 通过解码器重建出原始数据 x^ ,表示为 x^=g(z)=g(f(x))。
    • 训练目标是最小化重建误差,即 x 和 x^ 之间的差异,常用的损失函数为均方误差(MSE)。
  2. 使用阶段

    • 训练完成后,编码器可以用于将新数据映射到低维潜在空间进行特征提取或降维。
    • 解码器可以用于从潜在空间表示生成数据,应用于生成模型等任务。

3. 自编码器的类型

根据不同的应用和需求,自编码器有多种变体:

  1. 稀疏自编码器(Sparse Autoencoder)

    • 通过添加稀疏性约束,使得潜在空间表示中只有少数几个单元被激活,常用于特征提取。
  2. 去噪自编码器(Denoising Autoencoder)

    • 输入数据加入噪声,目标是从噪声数据中重建出原始的无噪声数据,常用于去噪和鲁棒性增强。
  3. 变分自编码器(Variational Autoencoder, VAE)

    • 在潜在空间中引入概率分布,学习数据的生成分布,可以用于生成新数据和数据增强。
  4. 卷积自编码器(Convolutional Autoencoder, CAE)

    • 使用卷积层替代全连接层,常用于图像数据的降维和特征提取。

4. 自编码器的实现示例(使用TensorFlow和Keras)

下面是一个使用TensorFlow实现自编码器的简单示例。这个示例展示了如何构建一个基本的自编码器,用于图像数据的压缩和重构。我们将使用经典的MNIST手写数字数据集。

import tensorflow as tf
from tensorflow.keras import layers, models
import numpy as np
import matplotlib.pyplot as plt# 加载MNIST数据集
(x_train, _), (x_test, _) = tf.keras.datasets.mnist.load_data()
x_train = x_train.astype('float32') / 255.0
x_test = x_test.astype('float32') / 255.0# 将数据展开为一维向量
x_train = x_train.reshape((len(x_train), np.prod(x_train.shape[1:])))
x_test = x_test.reshape((len(x_test), np.prod(x_test.shape[1:])))# 定义编码器
input_dim = x_train.shape[1]
encoding_dim = 32  # 压缩后的维度input_img = layers.Input(shape=(input_dim,))
encoded = layers.Dense(encoding_dim, activation='relu')(input_img)# 定义解码器
decoded = layers.Dense(input_dim, activation='sigmoid')(encoded)# 构建自编码器模型
autoencoder = models.Model(input_img, decoded)# 构建单独的编码器模型
encoder = models.Model(input_img, encoded)# 构建单独的解码器模型
encoded_input = layers.Input(shape=(encoding_dim,))
decoder_layer = autoencoder.layers[-1]
decoder = models.Model(encoded_input, decoder_layer(encoded_input))# 编译自编码器模型
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')# 训练自编码器
autoencoder.fit(x_train, x_train,epochs=50,batch_size=256,shuffle=True,validation_data=(x_test, x_test))# 使用编码器和解码器进行编码和解码
encoded_imgs = encoder.predict(x_test)
decoded_imgs = decoder.predict(encoded_imgs)# 可视化结果
n = 10  # 显示10个数字
plt.figure(figsize=(20, 4))
for i in range(n):# 原始图像ax = plt.subplot(2, n, i + 1)plt.imshow(x_test[i].reshape(28, 28))plt.gray()ax.get_xaxis().set_visible(False)ax.get_yaxis().set_visible(False)# 重构图像ax = plt.subplot(2, n, i + 1 + n)plt.imshow(decoded_imgs[i].reshape(28, 28))plt.gray()ax.get_xaxis().set_visible(False)ax.get_yaxis().set_visible(False)
plt.show()
说明:
  1. 数据预处理: 加载MNIST数据集,并将其像素值归一化到[0,1]区间。
  2. 模型构建:
    • 编码器: 输入层连接到一个隐藏层(编码层),将数据压缩到32维。
    • 解码器: 将编码后的数据重构回原始维度。
    • 自编码器: 编码器和解码器组合在一起形成完整的自编码器模型。
  3. 训练模型: 使用binary_crossentropy损失函数和adam优化器进行训练。
  4. 结果可视化: 显示原始图像和重构图像,以比较它们的相似性。
输出:

在这里插入图片描述

5. 自编码器的应用

自编码器(Autoencoders)具有广泛的应用场景,以下是一些主要的应用领域:

1. 数据降维

自编码器可以用于高维数据的降维,将数据压缩到低维空间,从而减少存储和计算的复杂性。这种方法在很多方面可以替代主成分分析(PCA),特别是在处理非线性数据时(Springer)(MDPI)。

2. 特征提取

在无监督学习中,自编码器能够自动学习数据的潜在特征表示。通过训练自编码器模型,可以提取输入数据的有用特征,这些特征可以用于其他机器学习任务,例如分类和聚类(ar5iv)。

3. 图像去噪

去噪自编码器(Denoising Autoencoders, DAE)被用来去除图像中的噪声。通过向输入图像添加噪声,并训练自编码器去重构原始的无噪声图像,可以有效地消除噪声(Springer)。

4. 数据生成

变分自编码器(Variational Autoencoders, VAE)是一种生成模型,可以用来生成与训练数据分布相似的新数据。VAE在潜在空间中引入了随机性,使得生成的样本具有多样性(ar5iv) (ar5iv)。

5. 异常检测

自编码器可以用来检测数据中的异常点。通过训练自编码器重构正常数据,任何重构误差较大的数据点可能就是异常点。这个方法广泛应用于工业设备故障检测、网络入侵检测等领域(Springer)。

6. 图像和视频压缩

自编码器可以用于图像和视频压缩,通过将图像和视频数据压缩到潜在空间,再从潜在空间重构,从而实现高效压缩(MDPI)。

7. 自监督学习

自编码器作为自监督学习的一个重要工具,可以在没有标签的数据上进行预训练,帮助提升有监督学习任务的效果。它在自然语言处理、图像识别等领域有重要应用(ar5iv)。

8. 数据填补

自编码器可以用于数据缺失值的填补。通过训练自编码器重构完整数据,可以用潜在空间的表示来推断并填补缺失的数据(MDPI)。

相关文章:

[深度学习] 自编码器Autoencoder

自编码器(Autoencoder)是一种无监督学习算法,主要用于数据的降维、特征提取和数据重建。自编码器由两个主要部分组成:编码器(Encoder)和解码器(Decoder)。其基本思想是将输入数据映射…...

模型微调、智能体、知识库之间的区别

使用开源模型微调和使用知识库与智能体(agent)的区别主要体现在工作原理、应用场景和实现目标上。以下是对这三者的详细对比: 开源模型微调 定义: 微调是对预训练模型(例如BERT、GPT等)进行额外训练&…...

七日世界Once Human跳ping、延迟高、丢包怎么办?

七日世界是一款开放世界为轴点的生存射击游戏,玩家将进入一个荒诞、荒芜的末日世界,在这里与好友一起对抗可怖的怪物和神秘物质星尘的入侵,给这个星球留下最后的希望,共筑一片安全的领地。不过有部分玩家在游玩七日世界的时候&…...

机器人控制系列教程之关节空间运动控制器搭建(1)

机器人位置控制类型 机器人位置控制分为两种类型: 关节空间运动控制—在这种情况下,机器人的位置输入被指定为一组关节角度或位置的向量,这被称为机器人的关节配置,记作q。控制器跟踪一个参考配置,记作 q r e f q_{re…...

[linux]sed命令基础入门详解

sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这…...

Charles抓包工具系列文章(一)-- Compose 拼接http请求

一、背景 众所周知,Charles是一款抓包工具,当然是http协议,不支持tcp。(如果你想要抓tcp包,请转而使用wireshark,在讲述websocket的相关技术有梳理过wireshark抓包) 话说回来,char…...

OLMo:真正完全开源的大模型

最近,又有一家机构AI2(Allen Institute for AI)开源了一个LLM:OLMo,它的英文全称就叫Open Language Model。相比之前开源的大模型,OLMo的独特之处是完全开源,除了训练的模型,OLMo还开…...

51单片机STC89C52RC——12.1 数据存储芯片AT24C02

目的/效果 利用存储芯片AT24C02存储数据,LCD1602显示存储的数据。 一,STC单片机模块 二,AT24C02存储芯片 2.1 介绍 AT24C02是一个2K位串行CMOS E2PROM,内部含有256个8位字节,采用先进CMOS技术实质上减少了器件的功…...

融入云端的心跳:在Spring Cloud应用中集成Eureka Client

融入云端的心跳:在Spring Cloud应用中集成Eureka Client 引言 在微服务架构中,服务发现是一个关键组件,它允许服务实例之间相互发现并通信。Netflix Eureka是Spring Cloud体系中广泛使用的服务发现框架。Eureka提供了一个服务注册中心&…...

CocosCreator构建IOS的wwise教程

CocosCreator构建IOS教程 添加wwise教程: 1.添加include 2.添加SoundEngine 3.添加Profile-iphoneos下面lib下面的.a 4.导入js调用C++的文件 5.导入这些文件 6.初始化ios绝对路径和TTS语音合成对象 6.获得根目录绝对路径,加载pck需要找到绝对路径。怎么找绝对路径? #impor…...

掌握 SQL Server 中的 FLOOR 函数:数据舍入的艺术

掌握 SQL Server 中的 FLOOR 函数:数据舍入的艺术 引言 在数据分析和处理中,我们经常需要对数值进行精确控制,比如将数值舍入到特定的精度。SQL Server 提供了多种数学函数,其中 FLOOR 函数就是用来执行向上舍入操作的强大工具。…...

【折腾笔记】兰空图床使用Redis做缓存

前言 最近发现我部署在群晖NAS上的兰空图床程序在高并发的情况下会导致图片加载缓慢或出现图片加载失败的情况,于是我查阅了官方文档资料并进行了一系列的测试,发现兰空图床如果开启了原图保护功能,会非常的吃CPU的性能,尤其是在…...

【Ubuntu】如何用指令设置静态IP

这里介绍的是利用netplan 的配置文件一般在 /etc/netplan/ 目录下,文件名类似 01-network-manager-all.yaml。 用 nano/ vim 编辑器打开配置文件: sudo nano /etc/netplan/01-network-manager-all.yaml # 替换成你的文件名修改配置文件 network:versi…...

mechanize - 自动化与HTTP web服务器的交互操作

1、前言 随着自动化测试的普及与落地推广,出现了众多知名的自动化测试工具,如Selenium 、Robot Framework、Playwright等。本文将介绍一款在Python环境下的mechanize库,这个库能够模拟浏览器行为,支持发送HTTP请求、解析HTML页面和…...

【Android】保留elevation层级效果,舍弃阴影效果

关于elevation属性 elevation是高度,海拔的意思 该属性可以设置View在父容器中的层级,即z属性 当view的elevation高于其它view时,它将显示在最上方,并产生阴影效果 关闭阴影效果 view的高度阴影,通过outlineProvi…...

Java新手启航:Windows下JDK安装,开启编程之旅

你是不是对编程充满好奇,想要迈入Java的世界,却不知道从何开始?别担心,每一个Java大师都是从安装JDK开始的,而今天,我将手把手教你如何轻松完成JDK的安装,让你迈出编程之旅的第一步! 接下来&am…...

c++指针和引用之高难度(二)习题讲解

1.【单选题】 int a[4] { 1001,1002,1003,1004 }; int* p{ &a[1] }; p[1] ? A 1001 B 1002 C 1003 解析:这道题考察了指针和数组可以混用。p 指向了 数组 a[0] 的地址,也就是 1002 的地址,此时 *p p[0]…...

UNIAPP编译到微信小程序时,会多一层以组件命名的标签

UNIAPP编译到微信小程序时,会多一层以组件命名的标签 解决方案 可以配置virtualHost来配置 export default {options: {virtualHost: true} }...

工业自动化控制中心

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 using System; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms;namespace 工业自动化控制中心 {public partial class Form1 : Form{public Form1(){InitializeComponent();}pri…...

【Git】GitIgnore不生效

这里可能有两种原因,一个没有刷新Git缓存,二是Git忽略规则有问题 更新Git缓存 git rm -r --cached . git add . git commit -m "modify git ignore rule"Ignore规则 检查下忽略文件的目录表示是否正确 XXX忽略任意目录下名为XXX的文件 …...

OAuth 2.0 and OIDC 三大安全机制对比:State vs Nonce vs PKCE

一、问题背景 OAuth 2.0 和 OpenID Connect 的授权流程依赖浏览器重定向,这天然暴露了多种攻击面: 攻击类型描述CSRF攻击者诱导用户的浏览器携带恶意授权码完成绑定Token 重放窃取的 id_token 被重复提交给客户端授权码劫持恶意应用在同一设备上拦截授…...

ComfyUI Video Combine节点3个核心技巧:解决视频合并常见问题

ComfyUI Video Combine节点3个核心技巧:解决视频合并常见问题 【免费下载链接】ComfyUI-VideoHelperSuite Nodes related to video workflows 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-VideoHelperSuite 在AI动画创作中,ComfyUI的Vi…...

SAP KO88结算时,如何用BADI_FINS_ACDOC_POSTING_EVENTS把成本中心塞进自定义字段?

SAP KO88结算实战:通过BADI_FINS_ACDOC_POSTING_EVENTS实现成本中心到自定义字段的精准映射 在SAP工单结算(KO88)的复杂业务场景中,财务凭证的标准化字段往往无法满足企业多维度的分析需求。特别是当需要将特定成本中心信息映射到…...

从myplaces.shp到专题地图:手把手教你用QGIS C++ API实现点要素分级渲染

从myplaces.shp到专题地图:QGIS C API实现点要素分级渲染实战指南 当我们需要在桌面GIS应用中直观展示气象站降雨量、城市人口密度或商业网点销售额等连续型空间数据时,分级色彩渲染是最有效的可视化手段之一。本文将深入探讨如何利用QGIS强大的C API&am…...

如何3步免费解锁WeMod专业版:2026年终极增强工具使用指南

如何3步免费解锁WeMod专业版:2026年终极增强工具使用指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 还在为WeMod专业版的订阅费用而犹豫…...

Emacs AI编程助手:ai-code-interface.el深度集成指南

1. 项目概述:一个为Emacs注入AI灵魂的代码接口如果你是一位Emacs的深度用户,同时又对AI辅助编程抱有极大的热情,那么你很可能已经厌倦了在浏览器、终端和编辑器之间反复横跳的割裂体验。tninja/ai-code-interface.el这个项目,正是…...

VectorDBBench:向量数据库性能基准测试工具详解与实战

1. 项目概述:向量数据库性能测试的“瑞士军刀”如果你正在评估或使用向量数据库,那么你一定遇到过这个灵魂拷问:“这么多产品,到底哪个最适合我的场景?”是选名声在外的老牌劲旅,还是选后起之秀的专精选手&…...

DS3502 I2C数字电位器:从原理到Arduino/Python实战应用

1. 项目概述:告别手动旋钮,拥抱数字控制如果你和我一样,厌倦了在面包板上反复拧动电位器旋钮来调试电路,或者正在寻找一种能够通过程序精确控制电阻值的方法,那么DS3502这类I2C数字电位器绝对是你的“梦中情芯”。它本…...

Go语言构建开发者命令行工具箱:navis项目架构与实现解析

1. 项目概述:一个为开发者打造的“导航”工具箱最近在GitHub上看到一个挺有意思的项目,叫navis,作者是NaveenBuidl。光看名字,你可能会联想到“导航”或者“航行”,没错,这个项目的核心定位就是一个为开发者…...

Arduino nRF52 BLE开发:GATT服务与特征值配置实战详解

1. 项目概述如果你正在用Arduino和nRF52系列芯片(比如nRF52832或nRF52840)做蓝牙低功耗(BLE)开发,那你肯定绕不开GATT(通用属性配置文件)这一关。GATT是BLE通信的“语言规则”,它定义…...