深入解析AI绘画算法:从GANs到VAEs


在这里插入图片描述
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
在这里插入图片描述

  • 推荐:「stormsha的主页」👈,持续学习,不断总结,共同进步,为了踏实,做好当下事儿~
  • 专栏导航
    • Python面试合集系列:Python面试题合集,剑指大厂
    • GO基础学习笔记系列:记录博主学习GO语言的笔记,该笔记专栏尽量写的试用所有入门GO语言的初学者
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 运维系列:总结好用的命令,高效开发
    • 算法与数据结构系列:总结数据结构和算法,不同类型针对性训练,提升编程思维

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

💖The Start💖点点关注,收藏不迷路💖

📒文章目录

      • 1. 生成对抗网络(GANs)
        • 1.1 生成器(Generator)
        • 1.2 判别器(Discriminator)
        • 1.3 对抗训练
        • 1.4 代码讲解
      • 2. 变分自编码器(VAEs)
        • 2.1 编码器(Encoder)
        • 2.2 解码器(Decoder)
        • 2.3 损失函数
        • 2.4 代码讲解


当涉及到AI作画算法时,主要的方法包括生成对抗网络(GANs)、变分自编码器(VAEs)、神经风格迁移(Neural Style Transfer)等。下面我将详细介绍每个组成部分的原理,并给出数学公式和代码讲解。
在这里插入图片描述

1. 生成对抗网络(GANs)

生成对抗网络由两个主要组件组成:生成器(Generator)和判别器(Discriminator)

在这里插入图片描述

1.1 生成器(Generator)

生成器旨在从随机噪声中生成逼真的图像。它通常是一个深度卷积神经网络,其目标是最小化生成的图像与真实图像之间的差距。

在数学上,生成器可以表示为:
G : z → x G:z\to x G:zx
其中,( z ) 是输入的随机噪声向量,( x ) 是生成的图像。

1.2 判别器(Discriminator)

判别器旨在区分生成器生成的假图像和真实图像。它也是一个深度卷积神经网络,其目标是最大化正确分类真实图像和生成的图像的概率。

在数学上,判别器可以表示为:
D : x → [ 0 , 1 ] D:x\to[0,1] D:x[0,1]
其中, D ( x ) D(x) D(x) 表示输入图像 x x x 是真实图像的概率。

1.3 对抗训练

生成器和判别器通过对抗训练相互竞争。生成器试图最小化判别器的损失,而判别器试图最大化将真实图像与生成的图像正确分类的概率。他们的损失函数可以定义如下:

生成器的损失函数:
L G A N = − log ⁡ ( D ( G ( z ) ) ) \mathcal{L}_\mathrm{GAN}=-\log(D(G(z))) LGAN=log(D(G(z)))

判别器的损失函数:
L G A N = − log ⁡ ( D ( x ) ) − log ⁡ ( 1 − D ( G ( z ) ) ) \mathcal{L}_{\mathrm{GAN}}=-\log(D(x))-\log(1-D(G(z))) LGAN=log(D(x))log(1D(G(z)))

这样的对抗训练会持续进行,直到生成器生成的图像与真实图像难以区分为止。

1.4 代码讲解

以下是一个简化的生成器和判别器的PyTorch代码示例:

import torch
import torch.nn as nn# Generator
class Generator(nn.Module):def __init__(self):super(Generator, self).__init__()self.model = nn.Sequential(nn.Linear(noise_dim, hidden_dim),nn.ReLU(),nn.Linear(hidden_dim, output_dim),nn.Tanh())def forward(self, z):return self.model(z)# Discriminator
class Discriminator(nn.Module):def __init__(self):super(Discriminator, self).__init__()self.model = nn.Sequential(nn.Linear(input_dim, hidden_dim),nn.ReLU(),nn.Linear(hidden_dim, 1),nn.Sigmoid())def forward(self, x):return self.model(x)

2. 变分自编码器(VAEs)

变分自编码器是一种生成模型,通过学习数据的潜在分布来生成新的数据样本。
在这里插入图片描述

2.1 编码器(Encoder)

编码器将输入图像编码为潜在空间中的潜在表示。它学习将图像映射到潜在空间中的均值和方差。

在数学上,编码器可以表示为:
q ( z ∣ x ) = N ( μ ( x ) , σ 2 ( x ) ) q(z|x)=\mathcal{N}(\mu(x),\sigma^2(x)) q(zx)=N(μ(x),σ2(x))
其中, μ ( x ) \mu(x) μ(x) σ 2 ( x ) \sigma^2(x) σ2(x) 是图像 x x x 的均值和方差。

2.2 解码器(Decoder)

解码器将潜在表示解码为图像。它学习将潜在空间中的点映射回图像空间。

在数学上,解码器可以表示为:
p ( x ∣ z ) = N ( f ( z ) , σ 2 I ) p(x|z)=\mathcal{N}(f(z),\sigma^2I) p(xz)=N(f(z),σ2I)
其中, f ( z ) f(z) f(z) 是潜在表示 z z z 的解码结果, σ 2 I \sigma^2 I σ2I 是噪声。

2.3 损失函数

VAEs使用重构损失和KL散度来训练模型。

重构损失:
L recon = − E q ( z ∣ x ) [ log ⁡ p ( x ∣ z ) ] \mathcal{L}_{\text{recon}} = -\mathbb{E}_{q(z|x)}[\log p(x|z)] Lrecon=Eq(zx)[logp(xz)]

KL散度:
L KL = KL ( q ( z ∣ x ) ∣ ∣ p ( z ) ) \mathcal{L}_{\text{KL}} = \text{KL}(q(z|x)||p(z)) LKL=KL(q(zx)∣∣p(z))

总损失:
L VAE = L recon + L KL \mathcal{L}_{\text{VAE}} = \mathcal{L}_{\text{recon}} + \mathcal{L}_{\text{KL}} LVAE=Lrecon+LKL

2.4 代码讲解

以下是一个简化的VAE的PyTorch代码示例:

import torch
import torch.nn as nn# Encoder
class Encoder(nn.Module):def __init__(self, input_dim, hidden_dim, latent_dim):super(Encoder, self).__init__()self.fc1 = nn.Linear(input_dim, hidden_dim)self.fc2_mean = nn.Linear(hidden_dim, latent_dim)self.fc2_logvar = nn.Linear(hidden_dim, latent_dim)def forward(self, x):h = torch.relu(self.fc1(x))return self.fc2_mean(h), self.fc2_logvar(h)# Decoder
class Decoder(nn.Module):def __init__(self, latent_dim, hidden_dim, output_dim):super(Decoder, self).__init__()self.fc1 = nn.Linear(latent_dim, hidden_dim)self.fc2 = nn.Linear(hidden_dim, output_dim)def forward(self, z):h = torch.relu(self.fc1(z))return torch.sigmoid(self.fc2(h))# VAE
class VAE(nn.Module):def __init__(self, encoder, decoder):super(VAE, self).__init__()self.encoder = encoderself.decoder = decoderdef reparameterize(self, mu, logvar):std = torch.exp(0.5*logvar)eps = torch.randn_like(std)return mu + eps * stddef forward(self, x):mu, logvar = self.encoder(x)z = self.reparameterize(mu, logvar)recon_x = self.decoder(z)return recon_x, mu, logvardef reconstruct(self, x):recon_x, _, _ = self.forward(x)return recon_x

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏、分享下吧,非常感谢!👍 👍 👍

🔥🔥🔥道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

💖The End💖点点关注,收藏不迷路💖

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

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

相关文章

FebHost:摩洛哥.ma域名注册介绍,规则有哪些?

摩洛哥国家域名介绍 摩洛哥是位于非洲西北部的一个国家,北部和西部面向地中海和大西洋,东部和南部则与阿尔及利亚、西撒哈拉和毛里塔尼亚接壤。摩洛哥的首都是拉巴特,但最大城市是卡萨布兰卡。摩洛哥的官方语言是阿拉伯语和柏柏尔语&#xf…

使用 Python 和 DirectShow 从相机捕获图像

在 Python 中使用 OpenCV 是视觉应用程序原型的一个非常好的解决方案,它允许您快速起草和测试算法。处理从文件中读取的图像非常容易,如果要处理从相机捕获的图像,则不那么容易。OpenCV 提供了一些基本方法来访问链接到 PC 的相机(通过对象),但大多数时候,即使对于简单的…

Github创建远程仓库(项目)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

MongoDB的安装(Linux环境)

登录到Linux服务器执行 lsb_release -a ,即可得知服务器的版本信息为:CentOS 7。 # CentOS安装lsb_release包 [rootlinux100 ~]# sudo yum install redhat-lsb# 查看Linux版本 [rootlinux100 ~]# lsb_release -a LSB Version: :core-4.1-amd64:core-…

Blender笔记之基本操作

code review! —— 2024-04-27 杭州 Blender笔记…

c++理论篇(一) ——浅谈tcp缓存与tcp的分包与粘包

介绍 在网络通讯中,Linux系统为每一个socket创建了接收缓冲区与发送缓冲区,对于TCP协议来说,这两个缓冲区是必须的.应用程序在调用send/recv函数时,Linux内核会把数据从应用进程拷贝到socket的发送缓冲区中,应用程序在调用recv/read函数时,内核把接收缓冲区中的数据拷贝到应用…

黑马程序员2024最新SpringCloud微服务开发与实战 个人学习心得、踩坑、与bug记录Day1

你好,我是Qiuner. 为记录自己编程学习过程和帮助别人少走弯路而写博客 这是我的 github gitee 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 😄 (^ ~ ^) 想看更多 那就点个关注吧 我会尽力带来有趣的内容 2024黑马程序员 SpringCloud微服务开发与实战&#xff…

FPGA高端项目:FPGA帧差算法多目标图像识别+目标跟踪,提供11套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐FPGA帧差算法单个目标图像识别目标跟踪 3、详细设计方案设计原理框图运动目标检测原理OV5640摄像头配置与采集OV7725摄像头配置与采集RGB视频流转AXI4-StreamVDMA图像缓存多目标帧差算法图像识别目标跟踪模块视频输出Xilinx系列FPGA工程源…

【c++】cpp类的继承

目录 (1)继承概念与语法 (2)派生类的访问控制 (3)继承中的构造和析构 1.类型兼容性原则 2.继承中的构造析构调用原则 3.继承与组合混搭下构造和析构调用原则 (4)同名成员(函数…

slice

最重要的一张图 endlessSummer :summer[:5]//这是这张图真正厉害的地方为什么向函数传递slice允许在函数内部修改底层数组的元素? 因为slice值包含指向第一个sllice元素的指针,传入的slice允许在函数内部修改底层数组的元素。 复制的slice只是对底层的…

LabVIEW与Modbus协议的多点温度监控系统

LabVIEW与Modbus协议的多点温度监控系统 随着工业自动化和智能化水平的不断提升,对于现场监控技术的需求日益增长。开发了一种基于LabVIEW与Modbus协议的多点温度监控系统,实现高效、准确的温度数据采集、处理和显示,以及数据存储功能&#…

TCP/IP协议族中的TCP(一):解析其关键特性与机制

⭐小白苦学IT的博客主页⭐ ⭐初学者必看:Linux操作系统入门⭐ ⭐代码仓库:Linux代码仓库⭐ ❤关注我一起讨论和学习Linux系统 前言 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字…

牛客社区帖子分页显示实现

下图是前端分页的组件: 下面是对应的静态html页面,每一个方块,都是一个a标签,可以点击,执行的链接是/community/index,GET请求,拼接的参数是current,也就是pageNum,只需…

力扣HOT100 208. 实现Trie(前缀树)

解题思路: class Trie {private Trie[] children; // 存储子节点的数组private boolean isEnd; // 记录是否为单词结尾public Trie() {children new Trie[26]; // 数组大小为26,代表26个小写字母isEnd false;}public void insert(String word) {Trie …

智能小程序 Ray 开发实践——基础内容组件 Text 和 Icon 介绍

Text 文本内容。 导入 import { Text } from ray-js/ray; Props 属性类型默认值说明支持平台classNamestring样式名涂鸦、微信selectablebooleanfalse文本是否可选涂鸦、微信onClick(e: { type: click }) > voidfalse点击事件涂鸦、微信 示例代码 基本使用 import Re…

【yolov8算法道路-墙面裂缝检测-汽车车身凹陷-抓痕-损伤检测】

yolo算法道路-墙面裂缝检测-汽车车身凹陷-抓痕-损伤检测 1. yolo算法裂缝检测-汽车车身凹陷-抓痕检测-汽车车身损伤检测2. yolo房屋墙面路面裂缝-发霉-油漆脱落-渗水-墙皮脱落检测3. 水泥墙面裂缝检测 YOLOv8算法是一种先进的目标检测技术,它基于YOLO系列算法的改进…

探索矿业数字化平台:实现智能化采矿与管理

随着信息技术的迅猛发展,矿业领域也在逐步实现数字化转型。数字化平台的出现为矿业企业带来了更高效、更智能的采矿与管理方式。本文将探讨矿业数字化平台的意义、特点以及未来发展方向。 ### 1. 数字化平台的意义 传统的矿业生产和管理方式存在诸多问题&#xff…

Python赋值运算符

目录 赋值运算符 将值赋给变量: 做加法运算之后完成赋值: 做减法运算之后完成赋值:- 做乘法运算之后完成赋值:* 做除法运算之后完成赋值:/ 做整除运算之后完成赋值:// 做幂次运算之后完成赋值:*…

Pytorch 计算深度模型的大小

计算模型大小的方法 卷积 时间复杂度 与 空间复杂度 的计算方式: C 通道的个数,K卷积核大小,M特征图大小,C_l-1是输入通道的个数,C_l是输出通道的个数 1 模型大小 MB 计算模型的大小的原理就是计算保存模型所需要…

在MySQL中isnull()函数不能作为替代null值!

在MySQL中isnull()函数不能作为替代null值! 如下: 首先有个名字为business的表: SELECT ISNULL(business_name,no business_name) AS bus_isnull FROM business WHERE id2 直接运行就会报错: 错误代码: 1582 Incor…