人工智能算法工程师(高级)课程4-图像生成项目之自编码生成模型与代码详解

大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(高级)课程4-图像生成项目之自编码生成模型与代码详解。自编码生成模型(Autoencoder)是一种无监督学习算法,旨在通过编码器和解码器学习数据的有效表示。本文将介绍自编码生成模型的几种常见类型,包括AE模型、SAE模型、DAE模型和VAE模型,并使用PyTorch搭建这些模型,最后介绍图像生成的原理和技术。

文章目录

  • 一、AE模型(Autoencoder)
    • AE模型原理
    • AE模型代码:
  • 二、SAE模型(Stacked Autoencoder)
    • SAE模型原理
    • SAE模型代码实现
  • 三、DAE模型(Denoising Autoencoder)
    • 数学原理
    • DAE模型代码实现:
  • 四、VAE模型(Variational Autoencoder)
    • VAE模型数学原理
    • VAE模型代码实现
  • 四、图像生成的原理和技术
  • 五、总结

一、AE模型(Autoencoder)

AE模型原理

AE模型的目标是最小化输入数据x和重构数据x’之间的重构误差。损失函数通常采用均方误差(MSE):
L ( x , x ′ ) = 1 n ∑ i = 1 n ( x i − x i ′ ) 2 L(x, x') = \frac{1}{n}\sum_{i=1}^{n}(x_i - x'_i)^2 L(x,x)=n1i=1n(xixi)2
其中,n为数据维度。

AE模型代码:

import torch
import torch.nn as nn
import torch.optim as optim
# 定义AE模型
class Autoencoder(nn.Module):def __init__(self):super(Autoencoder, self).__init__()self.encoder = nn.Sequential(nn.Linear(784, 256),nn.ReLU(True),nn.Linear(256, 128),nn.ReLU(True),nn.Linear(128, 64),nn.ReLU(True))self.decoder = nn.Sequential(nn.Linear(64, 128),nn.ReLU(True),nn.Linear(128, 256),nn.ReLU(True),nn.Linear(256, 784),nn.Sigmoid())def forward(self, x):x = self.encoder(x)x = self.decoder(x)return x
# 实例化模型、损失函数和优化器
model = Autoencoder()
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 训练模型
for epoch in range(100):for data in dataloader:inputs, _ = datainputs = inputs.view(-1, 784)outputs = model(inputs)loss = criterion(outputs, inputs)optimizer.zero_grad()loss.backward()optimizer.step()print(f'Epoch [{epoch+1}/100], Loss: {loss.item()}')

二、SAE模型(Stacked Autoencoder)

SAE模型原理

稀疏自编码器SAE是一种特殊类型的自编码器,它在隐藏层加入稀疏性约束,目的是让隐藏层的激活值在大多数情况下接近零,从而学习更加有效的特征表示。稀疏性可以通过添加额外的损失项来实现,例如KL散度,用于衡量隐藏层激活分布与目标稀疏分布之间的差异。
假设隐藏层的激活概率为 p j p_j pj,目标稀疏系数为 ρ \rho ρ,则稀疏惩罚项可以表示为:
∑ j K L ( ρ ∣ ∣ p j ) = ρ log ⁡ ( ρ p j ) + ( 1 − ρ ) log ⁡ ( 1 − ρ 1 − p j ) \sum_j KL(\rho || p_j) = \rho \log\left(\frac{\rho}{p_j}\right) + (1-\rho)\log\left(\frac{1-\rho}{1-p_j}\right) jKL(ρ∣∣pj)=ρlog(pjρ)+(1ρ)log(1pj1ρ)

SAE模型代码实现

# SAE模型代码与AE模型类似,只需在AE模型的基础上增加更多层
class StackedAutoencoder(nn.Module):def __init__(self):super(StackedAutoencoder, self).__init__()self.encoder = nn.Sequential(nn.Linear(784, 256),nn.ReLU(True),nn.Linear(256, 128),nn.ReLU(True),nn.Linear(128, 64),nn.ReLU(True))self.decoder = nn.Sequential(nn.Linear(64, 128),nn.ReLU(True),nn.Linear(128, 256),nn.ReLU(True),nn.Linear(256, 784),nn.Sigmoid())def forward(self, x):x = self.encoder(x)x = self.decoder(x)return x

三、DAE模型(Denoising Autoencoder)

数学原理

DAE在自编码器的基础上引入了去噪的概念,它通过在训练时向输入数据 x \mathbf{x} x 添加噪声 ϵ \epsilon ϵ 来生成带噪输入 x ~ = x + ϵ \tilde{\mathbf{x}} = \mathbf{x} + \epsilon x~=x+ϵ 或者通过某种机制(如随机遮挡)来模拟噪声。DAE的目标是学习一个函数 f DAE ( x ~ ; θ ) f_\text{DAE}(\tilde{\mathbf{x}}; \theta) fDAE(x~;θ),该函数能够从带噪输入 x ~ \tilde{\mathbf{x}} x~ 中恢复出原始的干净输入 x \mathbf{x} x
DAE的训练目标函数可以表示为:
L DAE ( x , x ^ ) = E x ~ ∼ q ( x ~ ∣ x ) [ L ( x , f DAE ( x ~ ; θ ) ) ] L_{\text{DAE}}(\mathbf{x}, \hat{\mathbf{x}}) = \mathbb{E}_{\tilde{\mathbf{x}} \sim q(\tilde{\mathbf{x}}|\mathbf{x})} \left[ L(\mathbf{x}, f_\text{DAE}(\tilde{\mathbf{x}}; \theta)) \right] LDAE(x,x^)=Ex~q(x~x)[L(x,fDAE(x~;θ))]
其中 q ( x ~ ∣ x ) q(\tilde{\mathbf{x}}|\mathbf{x}) q(x~x) 是噪声数据的分布, E \mathbb{E} E 表示期望值,即对所有可能的噪声样本 x ~ \tilde{\mathbf{x}} x~ 求平均重构误差。

DAE模型代码实现:

# DAE模型代码与AE模型类似,只需在训练过程中添加噪声
for epoch in range(100):for data in dataloader:inputs, _ = datainputs = inputs.view(-1, 784)noisy_inputs = inputs + 0.3 * torch.randn_like(inputs)  # 添加噪声outputs = model(noisy_inputs)loss = criterion(outputs, inputs)optimizer.zero_grad()loss.backward()optimizer.step()print(f'Epoch [{epoch+1}/100], Loss: {loss.item()}')

四、VAE模型(Variational Autoencoder)

VAE模型数学原理

VAE模型引入了变分推断,使模型能够学习到数据的概率分布。损失函数由两部分组成:重构误差和KL散度。
L ( x , x ′ ) = − 1 n ∑ i = 1 n ( x i log ⁡ ( x i ′ ) + ( 1 − x i ) log ⁡ ( 1 − x i ′ ) ) + D K L ( q ( z ∣ x ) ∣ ∣ p ( z ) ) L(x, x') = -\frac{1}{n}\sum_{i=1}^{n}(x_i \log(x'_i) + (1 - x_i) \log(1 - x'_i)) + D_{KL}(q(z|x) || p(z)) L(x,x)=n1i=1n(xilog(xi)+(1xi)log(1xi))+DKL(q(zx)∣∣p(z))
其中, D K L ( q ( z ∣ x ) ∣ ∣ p ( z ) ) D_{KL}(q(z|x) || p(z)) DKL(q(zx)∣∣p(z))为KL散度,用于衡量潜在变量分布 q ( z ∣ x ) q(z|x) q(zx)与先验分布 p ( z ) p(z) p(z)之间的差异。
在这里插入图片描述

VAE模型代码实现

class VariationalAutoencoder(nn.Module):def __init__(self):super(VariationalAutoencoder, self).__init__()# 编码器部分self.fc1 = nn.Linear(784, 400)self.fc21 = nn.Linear(400, 20) # 均值向量self.fc22 = nn.Linear(400, 20) # 方差向量# 解码器部分self.fc3 = nn.Linear(20, 400)self.fc4 = nn.Linear(400, 784)def encode(self, x):h1 = torch.relu(self.fc1(x))return self.fc21(h1), self.fc22(h1)def reparameterize(self, mu, logvar):std = torch.exp(0.5*logvar)eps = torch.randn_like(std)return mu + eps*stddef decode(self, z):h3 = torch.relu(self.fc3(z))return torch.sigmoid(self.fc4(h3))def forward(self, x):mu, logvar = self.encode(x.view(-1, 784))z = self.reparameterize(mu, logvar)return self.decode(z), mu, logvar
# 实例化模型、损失函数和优化器
vae = VariationalAutoencoder()
optimizer = optim.Adam(vae.parameters(), lr=1e-3)
# 训练模型
def loss_function(recon_x, x, mu, logvar):BCE = nn.functional.binary_cross_entropy(recon_x, x.view(-1, 784), reduction='sum')KLD = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())return BCE + KLD
for epoch in range(100):vae.train()train_loss = 0for data in dataloader:inputs, _ = dataoptimizer.zero_grad()recon_batch, mu, logvar = vae(inputs)loss = loss_function(recon_batch, inputs, mu, logvar)loss.backward()train_loss += loss.item()optimizer.step()print(f'Epoch [{epoch+1}/100], Loss: {train_loss/len(dataloader.dataset)}')

四、图像生成的原理和技术

图像生成是利用学习到的数据表示来生成新的数据样本。在自编码生成模型中,图像生成主要依赖于解码器部分。以下是图像生成的步骤:

  1. 从先验分布(例如高斯分布)中采样潜在变量z。
  2. 将潜在变量z输入到解码器中,生成新的数据样本。
    在VAE模型中,图像生成的代码如下:
# 图像生成
vae.eval()
with torch.no_grad():sample = torch.randn(64, 20).to(device)  # 从标准正态分布中抽取样本sample = vae.decode(sample).cpu()sample = sample.view(64, 1, 28, 28)save_image(sample, 'sample.png')

五、总结

本文介绍了自编码生成模型的几种常见类型,并使用PyTorch搭建了这些模型。通过训练,模型能够学习到数据的有效表示。利用这些表示,我们可以生成新的图像样本。掌握图像生成的原理和技术,有助于进一步研究深度学习和生成模型。

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

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

相关文章

聊聊Hugging Face

概述 HuggingFace是一个开源社区,提供了开源的AI研发框架、工具集、可在线加载的数据集仓库和预训练模型仓库。HuggingFace提出了一套可以依照的标准研发流程,按照该框架实施工程,能够在一定程度上规避开发混乱、开发人员水平不一致的问题&a…

spring 5.3.x 、6.1.x、6.0.x 源码本地编译运行

参考大佬文章,完美完成本地idea spring源码编译和demo测试 参考链接(spring5.3.x) spring5.3.x源码阅读环境搭建 下面是spring6.0.x参考 spring6.0.x jdk调成17 idea 2022.2.4版本本地编译spring源码项目 spring6.0.x 分支 gradle-8…

ubuntu22.04 配置grpc(优化官方教程)

优化了官方教程,2024.7.17顺利打通。 一:添加环境变量 打开root文件夹下的 .bashrc 文件 编辑文件:滚动到文件的底部,然后添加以下行: export MY_INSTALL_DIR$HOME/.local mkdir -p "$MY_INSTALL_DIR" exp…

视觉巡线小车——STM32+OpenMV(三)

目录 前言 一、OpenMV代码 二、STM32端接收数据 1.配置串口 2.接收数据并解析 总结 前言 通过视觉巡线小车——STM32OpenMV(二),已基本实现了减速电机的速度闭环控制。要使小车能够自主巡线,除了能够精准的控制速度之外&#xff0…

Hadoop3:MR程序处理小文件的优化办法(uber模式)

一、解决方案 1、在数据采集的时候,就将小文件或小批数据合成大文件再上传HDFS(数据源头) 2、Hadoop Archive(存储方向) 是一个高效的将小文件放入HDFS块中的文件存档工具,能够将多个小文件打包成一个HAR…

深入理解 Linux Zero-copy 原理与实现策略图解

用户态和内核态 一般来说,我们在编写程序操作 Linux I/O 之时十有八九是在用户空间和内核空间之间传输数据,因此有必要先了解一下 Linux 的用户态和内核态的概念。 从宏观上来看,Linux 操作系统的体系架构分为用户态和内核态(或者…

SourceCodester v1.0 SQL 注入漏洞(CVE-2023-2130)

前言 CVE-2023-2130是一个影响SourceCodester Purchase Order Management System v1.0的SQL注入漏洞。此漏洞的存在是由于应用程序未能正确过滤和验证用户输入,使得攻击者可以通过SQL注入来执行任意SQL命令,从而对数据库进行未授权的访问和操作。 在利…

15Kg级无人机降落伞系统技术详解

15Kg级无人机降落伞系统由以下几个主要部分组成: 1. 降落伞主体:采用轻质高强度的材料制成,能够承受无人机在降落过程中产生的冲击力,并确保无人机平稳安全地着陆。 2. 伞绳与连接机构:伞绳负责连接降落伞主体与无人机…

1-2、truffle与webjs亲密接触(truffle智能合约项目实战)

1-2、truffle与webjs亲密接触(truffle智能合约项目实战) 5,web3调用智能合约6,Ganache 5,web3调用智能合约 在前面已经完成简单的合约编写 使用web3调用此函数 Web端的代码使用web3进行智能合约的访问 首先在cmd以…

使用9种方法隐藏和显示元素

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>使用9种方法隐藏和显示元素</title><sty…

火影评论词云图

背景介绍 词云图(Word cloud)又称文字云,是一种文本数据的图片视觉表达方式,一般是由词汇组成类似云的图形,用于展示大量文本数据。 我收集了豆瓣网站上火影博人传下方的网友评论&#xff0c;以评论为数据基础制作了词云图。 准备工作 安装两个模块&#xff1a;词云模块和结…

verilog行为建模(四):过程赋值

目录 1.两类过程赋值2.阻塞与非阻塞赋值语句行为差别举例13.阻塞与非阻塞赋值语句行为差别举例24.阻塞与非阻塞赋值语句行为差别举例35.举例4&#xff1a;非阻塞赋值语句中延时在左边和右边的差别 微信公众号获取更多FPGA相关源码&#xff1a; 1.两类过程赋值 阻塞过程赋值执…

HTML零基础自学笔记(上)-7.18

HTML零基础自学笔记&#xff08;上&#xff09; 参考&#xff1a;pink老师一、HTML, Javascript, CSS的关系是什么?二、什么是HTML?1、网页&#xff0c;网站的概念2、THML的基本概念3、THML的骨架标签/基本结构标签 三、HTML标签1、THML标签介绍2、常用标签图像标签&#xff…

网易易盾图标点选验证码识别代码

简介 网易图标点选一直都是一个大难题&#xff0c;如上图所示。难点之一是图标变幻莫测&#xff0c;很难刷出有重复的图标&#xff0c;所以使用传统等等方式去标注、识别具有较大的难度。 经过我们大量的数据标注&#xff0c;终于完成了这款验证码的识别。 目前我们提供两种识…

Shell程序设计

各位看官&#xff0c;从今天开始&#xff0c;我们进入新的专栏Shell学习&#xff0c;Shell 是操作系统的命令行界面&#xff0c;它允许用户通过输入命令与操作系统交互。常见的 Shell 有 Bash 和 Zsh&#xff0c;它们可以执行用户输入的命令或运行脚本文件。Shell 广泛应用于系…

昇思25天学习打卡营第5天 | 数据集

在探索MindSpore深度学习框架中的数据集处理过程&#xff0c;我对其数据加载和处理流程有了深入的了解。MindSpore提供了一套功能强大的工具&#xff0c;可以有效地处理和转换数据&#xff0c;确保了数据预处理的效率和质量。以下是我从本次学习中得到的几点主要心得&#xff1…

[算法题]重排字符串

题目链接: 重排字符串 首先找出出现次数最多的字符和其出现次数, 如果该字符的出现次数大于 (字符串的长度 1) / 2, 那么该字符串必然不能重排, 如果该字符的出现次数小于等于 (字符串的长度 1) / 2, 是可以重排的, 重排方式如下图所示: 先以间隔的方式将出现次数最多的字符…

MRD、BRD、PRD

MRD、BRD、PRD是产品开发过程中不同的文档类型&#xff0c;‌它们各自具有特定的目的和内容&#xff0c;‌以支持产品从概念到实现的各个阶段。‌ MRD&#xff08;‌Market Requirement Document&#xff09;‌&#xff0c;‌即市场需求文档&#xff0c;‌侧重于市场和用户需求…

宇航人今年部分瓶装饮料铅浓度超标,采购成本连年大增

《港湾商业观察》廖紫雯 日前&#xff0c;内蒙古宇航人沙产业股份有限公司&#xff08;以下简称&#xff1a;宇航人&#xff09;递表港交所&#xff0c;保荐机构为中银国际&#xff0c;宇航人国内运营主体为内蒙古宇航人高技术产业有限责任公司、内蒙古宇航人沙产业股份有限公…

【SASS/SCSS(三)】样式的复用与动态计算(@mixin和@function)

目录 一、mixin 1、定义复用的样式代码&#xff0c;接受传参&#xff0c;搭配include使用。 位置传参 关键词传参 ...语法糖接受传入的任意参数 2、在mixin中使用content&#xff0c;获取外部对mixin的追加内容 二、function 三、字符串——值得注意的点 很多时候&#…