Denoising Autoencoders 视频截图 DAEs简单实现 kaggle 去噪编码器

news2025/6/3 9:21:30

https://www.bilibili.com/video/BV1syzrYaEtw
在这里插入图片描述

Denoising Autoencoders (DAEs) 是一种无监督学习模型,属于自动编码器(Autoencoder)的一种扩展形式。它们的目标是通过训练神经网络来学习数据的鲁棒表示(robust representation),同时具备从被噪声污染的数据中恢复原始输入的能力。


一、什么是 Denoising Autoencoder?

一个 Denoising Autoencoder 的基本思想是:

  • 给定一个输入样本 $ x $,我们人为地向它添加一些噪声,得到一个“损坏”版本 $ \tilde{x} $。
  • 然后训练一个神经网络模型,让它从这个被损坏的输入 $ \tilde{x} $ 中尽可能还原出原始的、干净的输入 $ x $。

结构图示意:

x → [加噪] → ˜x → [Encoder] → z → [Decoder] → x̂

其中:

  • $ x $:原始输入(如图像、文本等)
  • $ \tilde{x} $:加入噪声后的输入
  • $ z $:隐藏层表示(latent representation)
  • $ \hat{x} $:重构输出

二、为什么使用 Denoising Autoencoder?

传统的自编码器(Vanilla Autoencoder)直接学习恒等映射(identity mapping),即让网络学会将输入复制到输出。这可能导致模型只是“记住”了输入,而不是学到有用的特征表示。

而 DAEs 强迫网络去理解输入数据的结构和分布,从而学到更鲁棒、更有意义的特征表示。

主要优点:

  1. 防止过拟合:通过引入噪声,增加模型泛化能力。
  2. 学习高阶特征:迫使模型提取输入的本质特征,以完成去噪任务。
  3. 用于预训练:DAE 可作为深度网络的预训练方法,提升后续监督学习任务的性能。
  4. 可用于异常检测:如果某个输入经过 DAE 后重构误差很大,可能意味着该输入是异常点。

三、常见的噪声类型

在训练 DAE 时,通常会使用以下几种方式对输入进行“损坏”:

噪声类型描述
高斯噪声(Gaussian Noise)在每个输入维度上加上服从正态分布的随机数
随机遮蔽(Masking Noise)将部分输入值设置为0或均值(如随机屏蔽图像像素)
Salt-and-Pepper 噪声将部分输入值随机置为最大值或最小值
输入缺失模拟真实场景中的缺失数据

四、损失函数

DAE 的目标是最小化原始输入 $ x $ 和重构输出 $ \hat{x} $ 之间的差异,常用的损失函数包括:

  • 均方误差(MSE)
    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=1n(xix^i)2

  • 交叉熵损失(Cross-Entropy Loss)(适用于归一化到 [0,1] 的图像数据)


五、代码示例(PyTorch)

下面是一个简单的 Denoising Autoencoder 示例,使用 PyTorch 实现:

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

# 定义 Autoencoder 模型
class DenoisingAutoencoder(nn.Module):
    def __init__(self):
        super(DenoisingAutoencoder, self).__init__()
        self.encoder = nn.Sequential(
            nn.Linear(28*28, 512),
            nn.ReLU(True)
        )
        self.decoder = nn.Sequential(
            nn.Linear(512, 28*28),
            nn.Sigmoid()
        )

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

# 加载 MNIST 数据集
transform = transforms.Compose([transforms.ToTensor()])
dataset = datasets.MNIST(root='./data', train=True, transform=transform, download=True)
loader = DataLoader(dataset, batch_size=64, shuffle=True)

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = DenoisingAutoencoder().to(device)
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=1e-3)

# 训练循环
for epoch in range(10):
    for data, _ in loader:
        # 添加高斯噪声
        noisy_data = data + 0.2 * torch.randn(data.shape)
        noisy_data = torch.clamp(noisy_data, 0., 1.)

        data = data.view(-1, 28*28).to(device)
        noisy_data = noisy_data.view(-1, 28*28).to(device)

        output = model(noisy_data)
        loss = criterion(output, data)

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

    print(f'Epoch {epoch+1}, Loss: {loss.item():.4f}')

六、应用领域

  • 图像去噪
  • 特征提取与降维
  • 异常检测
  • 半监督学习
  • 深度生成模型的基础组件(如VAE、GAN)

七、变体与其他相关模型

模型名称说明
Sparse Autoencoder对隐藏层施加稀疏性约束
Variational Autoencoder (VAE)引入概率建模,实现生成式建模
Contractive Autoencoder对编码器的雅可比矩阵施加惩罚,增强鲁棒性
Stacked Denoising Autoencoder多层堆叠的 DAE,用于构建深度网络

如果你需要我进一步讲解某一部分(比如具体数学推导、PyTorch Lightning 实现、如何可视化结果等),欢迎继续提问!

import matplotlib.pyplot as plt
def visualize_autoencoder(model, device, data_loader):
    model.eval()
    data_iter = iter(data_loader)
    images, _ = next(data_iter)

    # 添加噪声
    noisy_images = images + 0.2 * torch.randn(images.shape)
    noisy_images = torch.clamp(noisy_images, 0., 1.)

    # 展平 & 移动到设备
    images_flat = images.view(-1, 28*28).to(device)
    noisy_images_flat = noisy_images.view(-1, 28*28).to(device)

    with torch.no_grad():
        reconstructed = model(noisy_images_flat)

    # 恢复为图像格式
    reconstructed = reconstructed.view(-1, 1, 28, 28).cpu()

    # 可视化前 5 张图片
    fig, axes = plt.subplots(nrows=3, ncols=5, figsize=(10, 6))
    for i in range(5):
        # 原始图像
        axes[0, i].imshow(images[i].squeeze(), cmap='gray')
        axes[0, i].set_title('Original')
        axes[0, i].axis('off')

        # 加噪图像
        axes[1, i].imshow(noisy_images[i].squeeze(), cmap='gray')
        axes[1, i].set_title('Noisy')
        axes[1, i].axis('off')

        # 重构图像
        axes[2, i].imshow(reconstructed[i].squeeze(), cmap='gray')
        axes[2, i].set_title('Reconstructed')
        axes[2, i].axis('off')

    plt.tight_layout()
    plt.show()

# 调用可视化函数
visualize_autoencoder(model, device, loader)

在这里插入图片描述
https://www.kaggle.com/code/alihhhjj/daes-easy
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GoogLeNet网络模型

GoogLeNet网络模型 诞生背景 在2014年的ImageNet图像识别挑战赛中,一个GoogLeNet的网络架构大放异彩,与VGG不同的是,VGG用的是3*3的卷积,而GoogLeNet从1*1到7*7的卷积核都用,也就是使用不同大小的卷积核组合。 网络…

仿真科普|弥合市场需求断层,高性能仿真,“性能”与“安全”如何兼得?

2025年3月,塔塔科技(Tata Technologies)确认曾在去年遭受勒索软件组织“猎手国际”(Hunters International)的攻击,1.4TB工程数据被窃取,涉及航空发动机热障涂层工艺参数等超过 73 万份文件。 X…

Maven---配置本地仓库

目录 5. 5.1在Maven路径下新建文件夹用于本地仓库存储 5.2 复制本地仓库路径 5.3 找到配置文件路径,使用VSCode方式打开 5.4 新增一行代码 5.5 复制本地仓库路径,设置存储路径 5.1在Maven路径下新建文件夹用于本地仓库存储 5.2 复制本地仓库路径 5…

【C++ 】智能指针:内存管理的 “自动导航仪”

目录 一、引入 二、智能指针的两大特性: 1、RAII 特点: 好处: 2、行为像指针 三、智能指针起初的缺陷:拷贝问题 四、几种智能指针的介绍。 1、C98出现的智能指针——auto_ptr auto_ptr解决上述拷贝构造的问题&#xff1a…

设备制造行业项目管理难点解析,如何有效解决?

在设备制造行业,项目管理是企业运营的核心环节,直接影响项目交付效率、成本控制和盈利能力。然而,由于行业特性复杂、项目周期长、涉及部门多,企业在实际操作中常常面临诸多管理痛点。金众诚工程项目管理系统,依托金蝶…

浅谈 PAM-2 到 PAM-4 的信令技术演变

通信信令技术演进:从 PAM-2 到 PAM-4 在当今数字化高速发展的时代,数据传输需求呈爆炸式增长,行业对通信带宽的要求愈发严苛。为顺应这一趋势,通信信令技术不断革新,曾经占据主导地位的不归零(NRZ&#xff…

Protos-SIP:经典 SIP 协议模糊测试工具!全参数详细教程!Kali Linux教程!

简介 该测试套件的目的是评估会话发起协议 (SIP) 实现的实现级别安全性和稳健性。 Protos-SIP 是一款专为 SIP 协议模糊测试(Fuzzing)设计的工具,最初由 OUSPG(Oulu University Secure Programming Group)开发&#…

复数三角不等式简介及 MATLAB 演示

复数三角不等式简介及 MATLAB 演示 1. 复数三角不等式简介 复数三角不等式(Complex Triangle Inequality)是复数的一种重要性质,它类似于普通的三角不等式,但适用于复数空间。具体来说,复数三角不等式可以描述复数之…

【Doris基础】Apache Doris 基本架构深度解析:从存储到查询的完整技术演进

目录 1 引言 2 Doris 架构全景图 2 核心组件技术解析 2.1 Frontend 层(FE) 2.2 Backend 层(BE) 3 数据存储与复制机制 3.1 存储架构演进 3.2 副本复制策略 4 查询处理全流程解析 4.1 查询生命周期 5 高可用设计 5.1 F…

程序人生-hellohelloo

计算机系统 大作业 题 目 程序人生-Hello’s P2P 专 业 计算机与电子通信 学   号 2023111976 班   级 23L0504 学 生 孙恩旗     指 导 教 师 刘宏伟    计算机科…

ASP.NET Core SignalR的基本使用

文章目录 前言一、SignalR是什么?在 ASP.NET Core 中的关键特性:SignalR 工作原理简图: 二、使用步骤1.创建ASP.NET Core web Api 项目2.添加 SignalR 包3.创建 SignalR Hub4.配置服务与中间件5.创建控制器(模拟服务器向客户端发送消息)6.创建…

【C语言】讲解 程序分配的区域(新手)

目录 代码区 数据区 堆区 栈区 常量区 重点比较一下堆区与 栈区 总结: 前言: C语言程序的内存分配区域是理解其运行机制的重要部分。根据提供的多条证据,我们可以总结出C语言程序在运行时主要涉及以下五个关键内存区域: 代…

LeetCode 算 法 实 战 - - - 移 除 链 表 元 素、反 转 链 表

LeetCode 算 法 实 战 - - - 移 除 链 表 元 素、反 转 链 表 第 一 题 - - - 移 除 链 表 元 素方 法 一 - - - 原 地 删 除方 法 二 - - - 双 指 针方 法 三 - - - 尾 插 第 二 题 - - - 反 转 链 表方 法 一 - - - 迭 代方 法 二 - - - 采 用 头 插 创 建 新 链 表 总 结 &a…

从头认识AI-----循环神经网络(RNN)

前言 前面我们讲了传统的神经网络,如MLP、CNN,这些网络中的输入都被单独处理,没有上下文之间的信息传递机制,这在处理序列数据(如语音、文本、时间序列)时很鸡肋: 如何理解一句话中“前后文”的…

kafka学习笔记(三、消费者Consumer使用教程——使用实例及及核心流程源码讲解)

1.核心概念与架构 1.1.消费者与消费者组 Kafka消费者是订阅主题(Topic)并拉取消息的客户端实例,其核心逻辑通过KafkaConsumer类实现。消费者组(Consumer Group)是由多个逻辑关联的消费者组成的集合。 核心规则 同一…

鸿蒙 Form Kit(卡片开发服务)

Form Kit(卡片开发服务) 鸿蒙应用中,Form / Card / Widget 都翻译为“卡片” Form Kit(卡片开发服务)提供一种界面展示形式,可以将应用的重要信息或操作前置到服务卡片,以达到服务直达、减少跳转…

算力卡上部署OCR文本识别服务与测试

使用modelscope上的图像文本行检测和文本识别模型进行本地部署并转为API服务。 本地部署时把代码中的检测和识别模型路径改为本地模型的路径。 关于模型和代码原理可以参见modelscope上这两个模型相关的页面: iic/cv_resnet18_ocr-detection-db-line-level_damo iic…

KWIC—Implicit Invocation

KWIC—Implicit Invocation ✏️ KWIC—Implicit Invocation 文章目录 KWIC—Implicit Invocation📝KWIC—Implicit Invocation🧩KWIC🧩核心组件🧩ImplementationScheme⚖️ 隐式调用 vs 显式调用对比 🌟 总结 &#x…

Visual Studio 2022 发布独立的 exe 文件

我们在用 Visual Studio 2022 写好一个 exe 程序之后,如果想把这个拿到其他地方运行,需要把 exe 所在的文件夹一起拿过去。 编译出来的 exe 文件需要其他几个文件一同放在同一目录才能运行,原因在于默认情况下,Visual Studio 是把…

11.4java语言执行浅析4

编译成字节码(.class 文件) 使用 javac 命令将源代码编译为 Java 字节码(bytecode) 它不是机器码,而是 JVM 能理解的中间语言(字节码),具有平台无关性。 编译过程简要&#xff1…