当前位置:

首页 > 图像处理 > 业界资讯 > 变分自编码器的应用于图像压缩(包含实现步骤)

变分自编码器的应用于图像压缩(包含实现步骤)

变分自编码器(VariationalAutoencoder,VAE)是一种无监督学习的神经网络,用于图像压缩和生成。相比传统自编码器,VAE可以重建输入图像,还能生成与之类似的新图像。其核心思想是将输入图像编码为潜在变量的分布,并从中进行采样以生成新的图像。VAE的独特之处在于使用变分推断来训练模型,通过最大化观测数据与生成数据之间的下界来实现参数学习。这种方法使得VAE能够学习到数据的潜在结构和生成新样本的能力。VAE已经在许多领域取得了显著的成功,包括图像生成、属性编辑和图像重建等任务。VAE(变分自

本文目录

    用于图像压缩的变分自编码器(附实现过程)

    变分自编码器(Variational Autoencoder,VAE)是一种无监督学习的神经网络,用于图像压缩和生成。相比传统自编码器,VAE可以重建输入图像,还能生成与之类似的新图像。其核心思想是将输入图像编码为潜在变量的分布,并从中进行采样以生成新的图像。VAE的独特之处在于使用变分推断来训练模型,通过最大化观测数据与生成数据之间的下界来实现参数学习。这种方法使得VAE能够学习到数据的潜在结构和生成新样本的能力。VAE已经在许多领域取得了显著的成功,包括图像生成、属性编辑和图像重建等任务。

    VAE(变分自编码器)的结构与自编码器类似,由编码器和解码器两部分组成。编码器将输入图像压缩成潜在变量的分布,包括均值向量和方差向量。解码器从潜在变量中采样生成新的图像。为了使潜在变量的分布更合理,VAE引入了KL散度的正则化项,使潜在变量的分布更接近标准正态分布。这样做可以提高模型的表达能力和生成能力。

    下面以MNIST手写数字数据集为例,介绍VAE的实现过程。

    首先,我们需要导入必要的库和数据集。

    import torch
    import torch.nn as nn
    import torch.optim as optim
    from torchvision import datasets, transforms
    from torch.autograd import Variable
    
    # 加载数据集
    transform = transforms.Compose([
        transforms.ToTensor(),
    ])
    train_dataset = datasets.MNIST(root='./data/', train=True, transform=transform, download=True)
    train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=128, shuffle=True)

    接下来,定义编码器和解码器的网络结构。

    # 定义编码器
    class Encoder(nn.Module):
        def __init__(self):
            super(Encoder, self).__init__()
            self.conv1 = nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1)
            self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=2, padding=1)
            self.conv3 = nn.Conv2d(64, 128, kernel_size=3, stride=2, padding=1)
            self.fc1 = nn.Linear(128 * 7 * 7, 256)
            self.fc21 = nn.Linear(256, 20) # 均值向量
            self.fc22 = nn.Linear(256, 20) # 方差向量
    
        def forward(self, x):
            x = nn.functional.relu(self.conv1(x))
            x = nn.functional.relu(self.conv2(x))
            x = nn.functional.relu(self.conv3(x))
            x = x.view(-1, 128 * 7 * 7)
            x = nn.functional.relu(self.fc1(x))
            mean = self.fc21(x)
            log_var = self.fc22(x)
            return mean, log_var
    
    
    # 定义解码器
    class Decoder(nn.Module):
        def __init__(self):
            super(Decoder, self).__init__()
            self.fc1 = nn.Linear(20, 256)
            self.fc2 = nn.Linear(256, 128 * 7 * 7)
            self.conv1 = nn.ConvTranspose2d(128, 64, kernel_size=3, stride=2, padding=1, output_padding=1)
            self.conv2 = nn.ConvTranspose2d(64, 32, kernel_size=3, stride=2, padding=1, output_padding=1)
            self.conv3 = nn.ConvTranspose2d(32, 1, kernel_size=3, stride=1, padding=1)
    
        def forward(self, x):
            x = nn.functional.relu(self.fc1(x))
            x = nn.functional.relu(self.fc2(x))
            x = x.view(-1, 128, 7, 7)
            x = nn.functional.relu(self.conv1(x))
            x = nn.functional.relu(self.conv2(x))
            x = nn.functional.sigmoid(self.conv3(x))
            return x
    
    
    # 定义VAE模型
    class VAE(nn.Module):
        def __init__(self):
            super(VAE, self).__init__()
            self.encoder = Encoder()
            self.decoder = Decoder()
    
        def reparameterize(self, mean, log_var):
            std = torch.exp(0.5 * log_var)
            eps = torch.randn_like(std)
            return eps * std + mean
    
        def forward(self, x):
            mean, log_var = self.encoder(x)

    接下来是VAE模型的前向传播过程,其中包括从潜在变量中采样生成新的图像,以及计算重构误差和KL散度的正则化项。

    z = self.reparameterize(mean, log_var)
    x_recon = self.decoder(z)
    return x_recon, mean, log_var
    
    def loss_function(self, x_recon, x, mean, log_var):
        recon_loss = nn.functional.binary_cross_entropy(x_recon, x, size_average=False)
        kl_loss = -0.5 * torch.sum(1 + log_var - mean.pow(2) - log_var.exp())
        return recon_loss + kl_loss
    
    def sample(self, num_samples):
        z = torch.randn(num_samples, 20)
        samples = self.decoder(z)
        return samples

    最后,我们定义优化器,并开始训练模型。

    # 定义优化器
    vae = VAE()
    optimizer = optim.Adam(vae.parameters(), lr=1e-3)
    
    # 开始训练模型
    num_epochs = 10
    for epoch in range(num_epochs):
    for batch_idx, (data, _) in enumerate(train_loader):
    data = Variable(data)
    optimizer.zero_grad()
    x_recon, mean, log_var = vae(data)
    loss = vae.loss_function(x_recon, data, mean, log_var)
    loss.backward()
    optimizer.step()
    
        if batch_idx % 100 == 0:
            print('Epoch [{}/{}], Batch [{}/{}], Loss: {:.4f}'.format(
                epoch+1, num_epochs, batch_idx+1, len(train_loader), loss.data.item()))

    在训练完成后,我们可以使用VAE生成新的手写数字图像。

    # 生成手写数字图像
    samples = vae.sample(10)
    fig, ax = plt.subplots(1, 10, figsize=(10, 1))
    for i in range(10):
    ax[i].imshow(samples[i].detach().numpy().reshape(28, 28), cmap='gray')
    ax[i].axis('off')
    plt.show()

    VAE是一种强大的图像压缩和生成模型,其通过将输入图像编码为潜在变量的分布来实现图像压缩,同时从中采样生成新的图像。与传统的自编码器不同,VAE还引入了KL散度的正则化项,使得潜在变量的分布更加合理。在实现VAE时,需要定义编码器和解码器的网络结构,并计算重构误差和KL散度的正则化项。通过训练VAE模型,可以学习到输入图像的潜在变量分布,并从中生成新的图像。

    以上是VAE的基本介绍和实现过程,希望能对读者有所帮助。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    图像处理 业界资讯 机器学习
    相关文章 更多
    机器学习之父MichaelJordan:AGl是炒作,AI的下一个战场是经济学
    机器学习之父MichaelJordan:AGl是炒作,AI的下一个战场是经济学

    机器学习奠基人MichaelJordan认为AGI是公关炒作,AI的真正挑战在于让系统学会协调。他主张机器学习必须与经济学结合,关注不确定性、激励机制和数据流动等社会系统性问题,而非单纯追求模型能力。

    手写线程池,对照学习ThreadPoolExecutor线程池实现原理!
    手写线程池,对照学习ThreadPoolExecutor线程池实现原理!

    持续坚持原创输出,点击蓝字关注我吧 ❝ 沉淀、分享、成长,让自己和他人都能有所收获! ❞ 目录 一、前言二、面试题三、线程池讲解1. 先看个例子2. 手写一个线程池3. 线程池源码分析四、总结五、系列推荐一、前言人看手机,机器学习!正好是2020年,看到这张图还是蛮有意思的。以前小时候总会看到一些科

    deepseek-智能助手入口
    deepseek-智能助手入口

    当前数字时代,deepseek入口智能助手凭借前沿技术架构为用户带来革新体验 在如今这个数字浪潮翻涌的时代,deepseek入口智能助手凭借其前沿的技术架构,为用户带来了真正意义上的革新体验。这个平台巧妙融合了自然语言处理与知识图谱技术,能够精准解析那些看似复杂的语义需求,已然成为提升工作效率的智能

    用相关性分析消除“冗余特征”
    用相关性分析消除“冗余特征”

    刚开始学机器学习时,我也像大部分人 一样,有个很朴素的想法:特征越多,模型能学到的信息就越多,效果自然越好。 所以每次拿到数据,我就拼命往模型里塞特征——能算出来的统计量全加上,能衍生出来的比率全拼上。 一个原本 20 列的数据集,经常被我搞到七八十列。 然后我就发现事情不太对劲了: 训练时间明显变

    用方差阈值过滤掉“惰性特征”
    用方差阈值过滤掉“惰性特征”

    机器学习实战中,大家往往把精力花在调参和选模型上,却忽略了一个更基础的问题:喂给模型的数据里,有多少特征是真正有用的? 刚开始学机器学习那会儿,很多人特别喜欢堆特征——不管有用没用先一股脑全塞进去,总觉得特征越多模型越聪明。直到有一次跑练习数据集,X_train.shape 直接干到了 (50000

    超细空气颗粒物每年致约199万人早亡
    超细空气颗粒物每年致约199万人早亡

    空气中直径小于100纳米的超细颗粒物每年导致约199万人早逝,其中近半因心血管疾病。该颗粒物主要来自化石燃料,可通过呼吸进入血液,引发氧化应激和内皮功能紊乱,是未被充分认识的心血管危险因素。若年均浓度控制在每立方厘米5000个以下,全球超额死亡率可降低约45%。

    当我们用错误的尺子量对了东西,会发生什么?
    当我们用错误的尺子量对了东西,会发生什么?

    这项研究来自Ezgi Korkmaz,论文以预印本形式发布于2026年7月8日,编号为arXiv:2607.07769,发表于cs.LG(机器学习)领域,并将出版于2026年人工智能促进协会(AAAI)会议论文集。有兴趣深入了解的读者可以通过arXiv编号2607.07769查询完整论文。 深度强化

    学少儿编程还是机器人编程
    学少儿编程还是机器人编程

    机器人编程侧重硬件组装与程序驱动,编程受限于特定机器人;少儿编程系统化教授编程知识,从Scratch启蒙延伸至Python、C++等高级语言。两者各有侧重,选择取决于希望孩子提升的能力方向。

    少儿编程分类全解析:软件编程 VS 硬件编程,孩子该怎么选?
    少儿编程分类全解析:软件编程 VS 硬件编程,孩子该怎么选?

    少儿编程分为软件与硬件两大方向。软件编程侧重逻辑与代码能力,含图形化、Python、C++,适配学业竞赛;硬件编程侧重动手与工程实践,含乐高搭建与机器人。选择应基于孩子兴趣与年龄。

    Python 基础(一):入门必备知识
    Python 基础(一):入门必备知识

    学习Python,从基础语法开始是最稳妥的路径。这篇文章整理了Python入门阶段必须掌握的核心概念,包括标识符、关键字、引号、编码、输入输出、缩进、多行、注释、数据类型以及运算符等,后面还整理了基础进阶、爬虫、自动化、数据分析、小游戏、趣味项目以及自学路线等系列内容,方便你按需查阅。 目录 1 标

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。