自编码器——数据降维及特征提取

目录

一.定义

二.原理

  1. 编码器

  2. 解码器

三.代码实现

  1.步骤:

        代码实现:

        代码解析:

  2.进一步优化:

四.应用场景


一.定义

        自编码器(Autoencoder)是一种无监督学习的神经网络模型,主要用于数据的降维特征提取数据重构。自编码器通常由两部分组成:

  1. 编码器(Encoder): 将输入数据压缩为一个低维的表示(也称为“编码”或“隐含特征”),这部分网络逐渐减少输入的维度,从而提取数据的关键特征。

  2. 解码器(Decoder): 从编码器生成的低维表示中重构原始数据,解码器的目标是使得重构的输出尽量接近原始输入。

二.原理

        自编码器的基本目标是通过神经网络学习一个压缩和解压缩的过程。具体来说,自编码器通过一个编码器将高维输入数据转换为一个低维的表示(称为"瓶颈层"或"隐含表示"),然后通过解码器将低维表示重构回原始的高维数据。

        自编码器网络的目标是让输入数据 x 和重构后的数据 \hat{x} 尽可能接近,通常使用均方误差(MSE)作为损失函数

L(x, \hat{x}) = ||x - \hat{x}||^2

  1. 编码器

        编码器的任务是将高维数据压缩为低维数据。编码器部分可以是一个由几层全连接神经网络(或卷积神经网络)组成的模型。编码器的输出即是数据的低维表示。

        假设输入为 x,编码器为 f,则编码过程可以表示为:

z = f(x)

其中,z 是编码器提取到的低维表示。

  2. 解码器

        解码器的任务是将编码器提取到的低维表示重构为原始输入的近似值。解码器也是一个神经网络,通过学习将 z 解码为 \hat{x}

        解码过程可以表示为:

\hat{x} = g(z)

其中,g 是解码器,\hat{x} 是重构后的数据。

三.代码实现

        下面我们用PyTorch实现一个简单的自编码器。我们将使用MNIST手写数字数据集作为例子,来展示自编码器如何进行数据降维和重构。

  1.步骤:

  1. 导入所需库
  2. 定义编码器和解码器结构
  3. 训练自编码器
  4. 测试并可视化重构结果

        代码实现:

import torch
import torch.nn as nn
import torch.optim as optim
import torch.utils.data as DataLoader
from torchvision import datasets, transforms
import matplotlib.pyplot as plt

# 1. 数据准备(以MNIST为例)
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])
train_dataset = datasets.MNIST(root='./data', train=True, transform=transform, download=True)
train_loader = DataLoader.DataLoader(dataset=train_dataset, batch_size=64, shuffle=True)

# 2. 定义自编码器模型
class Autoencoder(nn.Module):
    def __init__(self):
        super(Autoencoder, self).__init__()
        # 编码器部分
        self.encoder = nn.Sequential(
            nn.Linear(28 * 28, 128),
            nn.ReLU(),
            nn.Linear(128, 64),
            nn.ReLU(),
            nn.Linear(64, 12)  # 压缩为12维特征
        )
        # 解码器部分
        self.decoder = nn.Sequential(
            nn.Linear(12, 64),
            nn.ReLU(),
            nn.Linear(64, 128),
            nn.ReLU(),
            nn.Linear(128, 28 * 28),  # 解码回28*28的图像尺寸
            nn.Tanh()  # 输出值范围在[-1, 1],与输入图像的归一化范围匹配
        )

    def forward(self, x):
        x = self.encoder(x)
        x = self.decoder(x)
        return x

# 3. 初始化模型、损失函数和优化器
autoencoder = Autoencoder()
criterion = nn.MSELoss()  # 使用均方误差作为损失函数
optimizer = optim.Adam(autoencoder.parameters(), lr=0.001)

# 4. 训练自编码器
num_epochs = 5
for epoch in range(num_epochs):
    for data in train_loader:
        img, _ = data
        img = img.view(img.size(0), -1)  # 展平图像数据为1D
        output = autoencoder(img)
        loss = criterion(output, img)  # 输入和输出的损失
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
    print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')

# 5. 可视化重构效果
test_dataset = datasets.MNIST(root='./data', train=False, transform=transform, download=True)
test_loader = DataLoader.DataLoader(dataset=test_dataset, batch_size=10, shuffle=False)

# 获取一组测试数据
test_data_iter = iter(test_loader)
test_img, _ = test_data_iter.next()
test_img = test_img.view(test_img.size(0), -1)
with torch.no_grad():
    reconstructed = autoencoder(test_img)

# 可视化原始图片和重构后的图片
f, axes = plt.subplots(1, 2)
# 原始图片
axes[0].imshow(test_img[0].view(28, 28), cmap='gray')
axes[0].set_title("Original Image")
# 重构图片
axes[1].imshow(reconstructed[0].view(28, 28), cmap='gray')
axes[1].set_title("Reconstructed Image")
plt.show()

        代码解析:

  1. 数据预处理: 使用transforms对MNIST数据集进行归一化和转换为Tensor。
  2. 自编码器模型:
    • 编码器部分将28x28的图像展平为784维,然后通过三层全连接网络逐步减少到12维的隐含表示。
    • 解码器部分将12维的编码通过三层全连接网络重建回原始尺寸。
  3. 训练过程: 使用均方误差作为损失函数,Adam优化器进行梯度更新。模型尝试让输入图像和重构图像之间的误差最小。
  4. 可视化: 对测试数据进行重构,并对比原始图像和重构后的图像。

  2.进一步优化:

  • 增加层数或改变网络结构:可以通过添加更多的层或使用卷积层(CNN)来增强自编码器的表达能力。
  • 变分自编码器(VAE): 使用变分推理对编码部分进行约束,从而使生成的编码更加有意义并可用于生成新数据。

四.应用场景

  • 数据降维: 通过压缩数据到低维空间,保留有用的特征信息,用于可视化或后续建模。
  • 去噪(Denoising): 自编码器能够从噪声中恢复原始数据,因此在图像或信号处理中的去噪任务中很有效。
  • 生成模型: 自编码器的变体,如变分自编码器(VAE),可以用于生成新的数据样本。
  • 异常检测: 自编码器可以用于检测异常数据点,因为异常点难以通过训练好的自编码器进行重构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/978659.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

stm32四种方式精密控制步进电机

在搭建完clion的开发环境后,我决定重写之前的项目并优化完善,争取做出完全可落地的东西,也结合要写的论文内容一同学习下去。 因此,首当其冲的就是回到步进电机控制领域,把之前使用中断溢出进行步进电机控制的方案进行…

管理后台环境配置

1. 后端配置及启动 a. 软件安装 Java sdk 1.8 maven 3.6 intellij IDEA 2024 Visual C Redistributable mongodb mysql wsl (管理员:wsl --install) redis curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/shar…

Python学习第十八天之深度学习之Tensorboard

Tensorboard 1.TensorBoard详解2.安装3.使用4.图像数据格式的一些理解 后续会陆续在词博客上更新Tensorboard相关知识 1.TensorBoard详解 TensorBoard是一个可视化的模块,该模块功能强大,可用于深度学习网络模型训练查看模型结构和训练效果(…

DeepSeek 大模型:带火算力,重塑 AI?

在全球人工智能蓬勃发展的当下,各类技术与模型持续迭代更新,深刻影响着各个行业的发展轨迹。DeepSeek 作为其中的重要参与者,快速崭露头角,在技术创新和市场拓展方面成果显著,对算力市场也产生了强大的带动效应。这引发…

(21)从strerror到strtok:解码C语言字符函数的“生存指南2”

❤个人主页:折枝寄北的博客 ❤专栏位置:简单入手C语言专栏 目录 前言1. 错误信息报告1.1 strerror 2. 字符操作2.1 字符分类函数2.2 字符转换函数 3. 内存操作函数3.1 memcpy3.2 memmove3.2memset3.3 memcmp 感谢您的阅读 前言 当你写下strcpy(dest, s…

wpf中如何让TextBox 显示字体的颜色为白色

在 WPF 中,要让 TextBox 的字体颜色显示为白色,可以通过以下方法实现: 方法 1:直接设置 Foreground 属性(XAML) 在 XAML 中直接为 TextBox 设置 Foreground 属性,使用 White 颜色: …

小白向-python实现插入排序算法

插入排序 一、插入排序的定义 插入排序(Insertion Sort)是一种稳定的排序算法,通过构建有序序列,逐步将新元素插入到正确位置,最终完成排序。 二、插入排序的发展历史 插入排序是一种古老且直观的排序算法&#xff…

python-leetcode-最长公共子序列

1143. 最长公共子序列 - 力扣(LeetCode) class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:m, n len(text1), len(text2)dp [[0] * (n 1) for _ in range(m 1)]for i in range(1, m 1):for j in range(1, n …

mac电脑中使用无线诊断.app查看连接的Wi-Fi带宽

问题 需要检查连接到的Wi-Fi的AP硬件支持的带宽。 步骤 1.按住 Option 键,然后点击屏幕顶部的Wi-Fi图标;2.从下拉菜单中选择 “打开无线诊断”(Open Wireless Diagnostics);3.你可能会看到一个提示窗口,…

什么是模型量化和模型蒸馏?

文章目录 一、模型量化二、模型蒸馏三、二者有联系吗?四、示例场景五、总结 一、模型量化 模型量化(Model Quantization)是一种优化技术,通过将模型的参数和计算从高精度(如 32 位浮点数,FP32)…

Asp.Net Web API| React.js| EF框架 | SQLite|

asp.net web api EF SQLiteReact前端框架 设计一个首页面,包含三个按钮分别对应三类用户(数据查看,设计人员,管理员),当点击管理员的时候弹出一个前端页面可以输入信息(以学生数据为例&#…

英文论文查重,Turnitin和IThenticate两个系统哪个更合适?

Turnitin系统和IThenticate系统都是检测英文论文的查重系统,但是两者之间还是有一些不一样的。 下面针对这两个系统给大家具体分析一下。 一、Turnitin系统 Turnitin检测系统: https://truth-turnitin.similarity-check.com Turnitin是世界上主流的…

Unity Dedicated Server 控制台 输出日志LOg 中文 乱码

现象: 中文乱码 原因: Unity打包出来的.exe文件,语言一栏是英文,VS控制台出来不一样 解决方案: 新建.bat文件 ,并使用命令chcp 65001,运行时启动.bat,而不是.exe, 改不了exe属性,虽然有点奇怪&#xff…

Cesium高级开发教程之四十三:缓冲区分析#面

一、简介 基本概念:面缓冲区分析是指围绕一个给定的面几何对象,根据指定的距离,在面的外部或内部生成一个新的面状区域。例如,对于一个表示湖泊的面要素,通过设置一定的缓冲距离,可以在湖泊周围生成一个环状的缓冲区域,用于分析湖泊周边的生态环境影响范围等;或者在一个…

18439二维前缀和

18439二维前缀和 ⭐️难度:中等 📖 📚 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();int m scanner.nextInt();int q s…

PwnLab详细解答

一、主机发现 arp-scan -l靶机ip:192.168.55.153 二、端口识别、目录枚举、指纹识别 2.1端口识别 nmap -p- 192.168.55.1532.2目录枚举 dirb http://192.168.55.153枚举出来的敏感目录找到了文件上传网站和上传的地址 2.3指纹识别 nmap 192.168.55.153 -sV -…

傅里叶分析

傅里叶分析之掐死教程(完整版)更新于2014.06.06 要让读者在不看任何数学公式的情况下理解傅里叶分析。 傅里叶分析不仅仅是一个数学工具,更是一种可以彻底颠覆一个人以前世界观的思维模式。但不幸的是,傅里叶分析的公式看起来太复…

unity学习56:旧版legacy和新版TMP文本输入框 InputField学习

目录 1 旧版文本输入框 legacy InputField 1.1 新建一个文本输入框 1.2 InputField 的子物体构成 1.3 input field的的component 1.4 input Field的属性 2 过渡 transition 3 控件导航 navigation 4 占位文本 placeholder 5 文本 text 5.1 文本内容,用户…

详解Tomcat下载安装以及IDEA配置Tomcat(2023最新)

目录 步骤一:首先确认自己是否已经安装JDK步骤二:下载安装Tomcat步骤三:Tomcat配置环境变量步骤四:验证Tomcat配置是否成功步骤五:为IDEA配置Tomcat 步骤一:首先确认自己是否已经安装JDK jdk各版本通用安…

《Qt动画编程实战:轻松实现头像旋转效果》

《Qt动画编程实战:轻松实现头像旋转效果》 Qt 提供了丰富的动画框架,可以轻松实现各种平滑的动画效果。其中,旋转动画是一种常见的 UI 交互方式,广泛应用于加载指示器、按钮动画、场景变换等。本篇文章将详细介绍如何使用 Qt 实现…