cycleGAN算法解读
本文参考:https://blog.csdn.net/Mr_health/article/details/112545671
1 CycleGAN概述
CycleGAN:循环生成对抗神经网络,是一种非监督学习模型。
Pix2pix方法适用于成对数据的风格迁移,而大多数情况下对于A风格的图像,并没有与之相对应的B风格图像。获取严格意义上的成对数据是非常困难的,所以不依赖成对数据的算法具有非常重要的实际意义。我们所拥有的是一群处于风格A(源域)的图像和一群处于风格B(目标域)的图像,这样pix2pix方法就不管用了。
CycleGAN的创新点在于能够在源域和目标域之间,无须建立训练数据间一对一的映射,就可以实现这种迁移。
2 CycleGAN基本架构
(1)输入
X:源域,风格A的图像
Y:目标域,风格B的图像
(2)两个生成器:
G:用于将风格A的图像x转换为风格B的图像
F:用于将风格B的图像y转换为风格A的图像
(3)Cycle解释
通过G将风格A的图像x转换为风格B的图像Y‘,之后再将Y’通过F后仍然能够转换回风格A,并能保证图像中的内容一致。
通过F将风格B的图像y转换为风格A的图像X‘,之后再将X’通过G后仍然能够转换回风格B,并能保证图像中的内容一致。
也就是训练好G和F就可以自由地完成风格A、B的转换了。
3 损失函数
在训练中引入两个判别器:
Dy:区分真实的风格B的图像与通过G转换而来的假的风格B的图像
Dx:区分真实的风格A的图像与通过G转换而来的假的风格A的图像
损失函数主要由以下几个部分构成:
(1)Dy处的GAN损失:
(2)Dx处的GAN损失:
(3)循环一致性损失,即cycle解释那块逻辑
(4)Identity loss
这个loss的含义是:生成器G用来生成y风格的图像,那么把y送入G应该仍然生成y,只有这样才能证明G具有生成y风格的能力。因此G(y)和y应该尽可能接近。根据论文中的解释,如果不加入该loss,那么生成器可能会自主地修改图像的色调,使得整体的颜色发生变化。
4 CycleGAN网络结构解读
GAN由生成网络(Generator)和辨别(Discriminator)网络两部分组成
Generator网络有2个,分别支持A->B和B->A的转化,其输入输出不会改变维度信息,如下图所示:
Discriminator网络也有2个:
D_A:G_A(A) vs B
D_B:G_B(B) vs A
输入后会改变维度大小,输出channel从3变为1,特征为30*30。如果为真,则与30*30的1进行比较;如果为假,则与30*30的0进行比较。如下图所示:
Generator和Discriminator网络结构如下:
Loss组成:
由Generator的loss和Discriminator的loss两部分组成。
Generator部分的loss:
Loss_G_A = D_A(G_A(A)), #从G的角度生成的B要让D尽量判断为1
Loss_G_B = D_B(G_B(B)), #从G的角度生成的A要让D尽量判断为1
Loss_cycle_A = || G_B(G_A(A)) - A||
Loss_cycle_B = || G_A(G_B(B)) - B||
Loss_idt_A = ||G_A(B) - B||
Loss_idt_B = ||G_B(A) - A||
Loss_G = Loss_G_A + Loss_G_B + Loss_cycle_A + Loss_cycle_B + Loss_idt_A + Loss_idt_B
Discriminator部分的loss:
Loss_D = criterionGAN (netD(real), true) + criterionGAN(netD(fake), false)
从D的角度,G生成的要尽量判断为0,真实的要尽量判断为1。
5 代码解读
(1)前向传播部分:
NetG_A就是G,完成A->B的风格转换(源域到目标域)
NetG_B就是F,完成B->A的风格转换(目标域到源域)
def forward(self):"""Run forward pass; called by both functions <optimize_parameters> and <test>."""self.fake_B = self.netG_A(self.real_A) # G_A(A)self.rec_A = self.netG_B(self.fake_B) # G_B(G_A(A))self.fake_A = self.netG_B(self.real_B) # G_B(B)self.rec_B = self.netG_A(self.fake_A) # G_A(G_B(B))
(2)更新G
在if lambda_idt > 0:这个分支内,实现的就是identity loss。
后面就是GAN损失(loss_G_A、 loss_G_B)以及循环一致性损失(loss_cycle_A、loss_cycle_B)
代码里面的判别器netD_A判断的是真实B风格和生成B风格的真假,相当于论文中的Dy。
同理netD_B判断的是真实A风格和生成A风格的真假,相当于论文中的Dx。
def backward_G(self):"""Calculate the loss for generators G_A and G_B"""lambda_idt = self.opt.lambda_identitylambda_A = self.opt.lambda_Alambda_B = self.opt.lambda_B# Identity lossif lambda_idt > 0:# G_A should be identity if real_B is fed: ||G_A(B) - B||self.idt_A = self.netG_A(self.real_B) #将真实的B送入netG_A(A->B风格生成器)生成的应该还是B风格self.loss_idt_A = self.criterionIdt(self.idt_A, self.real_B) * lambda_B * lambda_idt# G_B should be identity if real_A is fed: ||G_B(A) - A||self.idt_B = self.netG_B(self.real_A) #将真实的A送入netG_B(B->A风格生成器)生成的应该还是A风格self.loss_idt_B = self.criterionIdt(self.idt_B, self.real_A) * lambda_A * lambda_idtelse:self.loss_idt_A = 0self.loss_idt_B = 0# GAN loss D_A(G_A(A))self.loss_G_A = self.criterionGAN(self.netD_A(self.fake_B), True)# GAN loss D_B(G_B(B))self.loss_G_B = self.criterionGAN(self.netD_B(self.fake_A), True)# Forward cycle loss || G_B(G_A(A)) - A||self.loss_cycle_A = self.criterionCycle(self.rec_A, self.real_A) * lambda_A# Backward cycle loss || G_A(G_B(B)) - B||self.loss_cycle_B = self.criterionCycle(self.rec_B, self.real_B) * lambda_B# combined loss and calculate gradientsself.loss_G = self.loss_G_A + self.loss_G_B + self.loss_cycle_A + self.loss_cycle_B + self.loss_idt_A + self.loss_idt_Bself.loss_G.backward()
(3)更新D:
def backward_D_A(self):"""Calculate GAN loss for discriminator D_A"""fake_B = self.fake_B_pool.query(self.fake_B)self.loss_D_A = self.backward_D_basic(self.netD_A, self.real_B, fake_B)def backward_D_B(self):"""Calculate GAN loss for discriminator D_B"""fake_A = self.fake_A_pool.query(self.fake_A)self.loss_D_B = self.backward_D_basic(self.netD_B, self.real_A, fake_A)
(4)生成器结构
一共由3个卷积层 + 5个残差块 + 3个卷积层构成。
这里没有用到池化等操作,在开始卷积层中(第二层、第三层)进行了下采样,在最后的3个卷积层中进行了上采样,这样最直接的就是减少了计算复杂度。另外还有一个好处是感受野增大,卷积下采样会增大有效区域。
5个残差块都是使用相同个数的(128)滤镜核,每个残差块中都有2个卷积层(3*3核),这里的卷积层中没有标准的0填充(padding),因为使用0填充会使生成出的图像的边界出现严重伪影。为了保证输入输出图像大小不改变,在图像初始输入部分加入了反射填充。
这里的残差网络不是使用何凯明的残差网络,卷积之后没有Relu,而是使用了Gross and Wilber的残差网络,后面这种方法验证在图像分类算法上面效果比较好。
相关文章:
cycleGAN算法解读
本文参考:https://blog.csdn.net/Mr_health/article/details/112545671 1 CycleGAN概述 CycleGAN:循环生成对抗神经网络,是一种非监督学习模型。 Pix2pix方法适用于成对数据的风格迁移,而大多数情况下对于A风格的图像…...
解读“方差”
其实,从这个标题就可以看出来,方差,这个问题不简单, 先给出定义: 方差其实应该叫,差方差,(差方)差,差的平方的差,与差的平方之间的误差࿰…...
记录面试问题
以下问题不分先后,按照印象深浅排序,可能一次记录不完成,后面想起来会及时补充,如有不对,恳请各位围观大佬多多指教🙏 印象最深的是一道很简单很简单的题目,我结束面试之后赶紧代码敲敲发现答错…...
(六十四)设计索引的时候,我们一般要考虑哪些因素呢?(上)
本周我们将要讲解一下设计索引的时候,我们通常应该考虑哪些因素,给哪些字段建立索引,如何建立索引,建立好索引之后应该如何使用才是最合适的。 可能有的朋友会希望尽快更新后面的内容,但是因为工作的原因的确非常忙&a…...
【蓝桥杯嵌入式】LCD屏的原理图解析与代码实现(第十三届省赛为例)——STM32
🎊【蓝桥杯嵌入式】专题正在持续更新中,原理图解析✨,各模块分析✨以及历年真题讲解✨都在这儿哦,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏 🪔本系列专栏 - 蓝…...
论文学习——Reproducing Activation Function for Deep Learning
论文学习——Reproducing Activation Function Abstract RAFs将集中基础激活函数进行线性组合,构建出神经元级的、数据驱动的激活函数。使用RAFs为激活函数的神经网络可以重现传统的近似工具,也能相对于传统网络以更少的参数量拟合目标函数。训练过程中,RAFs可以以更好的条…...
【趣味学Python】Python基础语法讲解
目录 编码 标识符 python保留字 注释 实例(Python 3.0) 实例(Python 3.0) 行与缩进 实例(Python 3.0) 实例 多行语句 数字(Number)类型 字符串(String) 实例(Python 3.0) 空行 等待用户输入 实例(Python 3.0) 同一行显示多条语句 实例(Python 3.0) 多个语句构…...
虚拟局域网VLAN的实现机制
虚拟局域网VLAN的实现机制1.IEEE 802.1Q帧2.交换的端口类型AccessTrunkHybrid(华为特有)1.IEEE 802.1Q帧 IEEE802.1Q帧(也称Dot One Q帧)对以太网的MAC帧格式进行了扩展,插入了4字节的VLAN标记。 2.交换的端口类型 A…...
Mask R-CNN 算法学习总结
Mask R-CNN 相关知识点整体框架1.Resnet 深度残差学习1.1 目的1.2 深度学习深度增加带来的问题1.3 Resnet实现思想【添加恒等映射】2.线性插值2.1 目的2.2 线性插值原理2.3 为什么使用线性插值?3.FPN 特征金字塔3.1 FPN介绍3.2 为什么使用FPN?3.3 自下而上层【提取特征】3.4 …...
Gorm -- 添加记录
文章目录添加单条记录直接添加模型对象赋予默认值方法一: gorm 标签赋予默认值方法二: 设置钩子方法(Hooks)指定字段插入插入时忽略某些字段插入时禁止使用钩子方法添加多条记录通过对象列表插入通过字典列表插入在字典中使用SQL内…...
go提高升阶(四) I/O流学习
I/O 官网课程 购买课程找博主推荐 文章目录I/O文件信息创建文件、目录IO读IO写(权限)文件复制Seeker接口断点续传遍历文件夹bufio电脑中一切,都是以 二进制流的形式存在的。jpg:010100000010010101001010101010010101010 编码格式,还原为一个…...
【代码随想录训练营】【Day28】第七章|回溯算法|93.复原IP地址|78.子集|90.子集II
复原IP地址 题目详细:LeetCode.93 这道题与上一道练习题分割回文字符串十分详细,一样是涉及到分割字符串、判断字符串、递归与回溯的问题,所以这道题要解决的难点在于: 如何分割IP地址字符串如何判断分割的IP地址是否合法递归的…...
Get请求和Post请求区别
前后端交互请求数据的方式有很多种。 例如:Get Post Put Patch Delete Copy 等等很多请求方式 但是用的最多的就是Get和Post Get请求方式 1. get多用于从服务器请求获取数据 2.get传送的数据量较小,不能大于2KB 3.get安全性非常低 Post请求方式 1.…...
static关键字
static的基本基本用法可以分为下面几种: (1)static修饰全局变量 (2) 修饰局部变量 (3)修饰普通函数 (4)修饰类的成员变量 一、static修饰全局变量 当同时编译多个文件时…...
A Comprehensive Tool for Modeling CMOS Image-Sensor-Noise Performance论文总结及翻译
A Comprehensive Tool for Modeling CMOS Image-Sensor-Noise Performance Author: Ryan D. Gow Link: https://ieeexplore.ieee.org/document/4215175/metrics#metrics Select: ⭐️⭐️⭐️⭐️ Type: Academic Journal 备注: CMOS图像传感器噪声性能建模的综合工具 总结 …...
嘀嗒出行再闯IPO:千军万马我无懈
羽扇纶巾笑谈间,千军万马我无懈。 在激烈竞争中再度冲刺港交所IPO的嘀嗒出行,闪露出一丝歌词里的气魄。交通运输部下属网约车监管信息交互系统的数据显示,截至2023年1月31日,全国共有300家网约车平台公司取得网约车平台经营许可。…...
MATLAB算法实战应用案例精讲-【优化算法】增强型鲸鱼优化算法(EWOA)(附matlab代码实现)
前言 增强型鲸鱼优化算法(Enhanced Whale Optimization Algorithm,EWOA)是Mohammad H. Nadimi-Shahraki等人于2022年提出的一种改进算法。由于标准的鲸鱼优化算法及其它的改进算法都存在种群多样性低和搜索策略差的问题,因此引入有效的策略来缓解鲸鱼优化算法的这些核心缺点…...
登录Oracle数据库遇到ORA-01017密码错误的解决办法
文章目录症状分析解决办法欢迎加下方我的微信👇,拉你入学习群我们在登录Oracle数据库时可能会遇到ORA-01017错误,这里分析原因并提供解决办法。点击试看博主的专著《MySQL 8.0运维与优化》(清华大学出版社) 症状 图像…...
10个黑客基础教程!简单有效
如果你的电脑运行缓慢,请使用下面介绍的方法来帮助加速、优化和提高电脑的性能。 1.关闭启动时自动运行的应用程序 计算机上安装的许多应用程序都可以将自己配置为在启动期间自动启动并继续在后台运行,但是,如果不是每天都使用这些应用程序…...
JPA之实体之间的关系
JPA之实体之间的关系 10.1.1实体类创建 注解的应用 Table,Entity IdGeneratedValue指定主键,Column P174 实体类编写规范 Table(name "t_user") Entity(name "User") public class User implements Serializable {IdGeneratedVa…...
如何在 C++ 中调用 python 解析器来执行 python 代码(三)?
本文在 C 中调用 multi.py 脚本,并向它传入参数并执行,然后获得返回值并在 C 中打印结果。 目录 如何在 C 中调用 python 解析器来执行 python 代码(一)?如何在 C 中调用 python 解析器来执行 python 代码࿰…...
【Linux】gcc/g++/gdb的使用
🔥🔥 欢迎来到小林的博客!! 🛰️博客主页:✈️小林爱敲代码 🛰️社区 : 进步学堂 🛰️欢迎关注:👍点赞🙌收…...
浅浅谈一谈B树和B+树
目录: 🚀1.B树 🚀2.B树 索引背后的数据结构是啥呢,是B树,是为了数据库索引设计的,我们可以先了解B树,再说B树 1.什么是B树 B树也叫B-树,这里的-不读减,是一个符号 我们已经学过了二叉搜素树,B树其实就是N叉搜素树,二叉搜索树只能在每一个结点放一个…...
Keil新建一个国民32位MCU工程
1.打开Keil软件,点击Project→New uVision→Project 2.将工程保存到自己的工程文件夹,并给项目命名,点击保存 3.选择自己需要开发的芯片,点击OK 4.点击OK 5.出现上图所示,工程已经建好了,点击配置工程。 6.…...
webpack.config.js与package.json文件的配置
path要使用绝对路径,通过每次复制文件位置非常麻烦且容易导致问题 使用node中的 写个包名跟入口名称,其他全部回车 此步完成后,自动生成一个package.json包 licence指的是开源,一般不写 安装文件夹需要的依赖 dirname是node自带…...
超详细Eclipse配置JDK
在此附上Eclipse安装教程 超详细Eclipse安装教程 在此附上JDK1.8安装配置教程 超详细JDK1.8安装与配置 ①打开Eclipse–>点击Window–>点击Preferences ②找到Java–>找到Installed JREs–>点击Add… ③选中Standard VM–>之后点击Next ④点击Directory找…...
成功解决numpy.linalg.LinAlgError: SVD did not converge in Linear Least Squares
成功解决numpy.linalg.LinAlgError: SVD did not converge in Linear Least Squares 目录 解决问题 解决思路 解决方法—四大原因分析 T1、数据本身问题的解决方法...
Allegro如何设置铜皮避让的优先级操作指导
Allegro如何设置铜皮避让的优先级操作指导 在用Allegro进行PCB设计的时候,时常需要使用动态铜皮进行设计,当两块动态铜皮存在交集的时候,避让就会存在一个优先级,如下图 上方的铜皮避让调了下方的铜皮,上方的铜皮被避让了 如何调整让下方的铜皮避让上方的铜皮,如下图 具…...
(Trie Tree)字典树
(Trie Tree)字典树 场景:在n个字符串中查找某个字符串。 暴力匹配,时间复杂度为O(nm),m为字符串平均长度,效率过低。 字典查找单词"fly",首先查找’f’,然后…...
MQTT的学习之Mosquitto集群搭建
文章钢要: 1、进行双服务器搭建 2、进行多服务器搭建 一、Mosquitto的分布式集群部署 如果需要做并发量很大的时候就需要考虑做集群处理,但是我在查找资料的时候发现并不多,所以整理了一下,搭建简单的Mosquitto集群模式。 首…...
phpcms 怎么做视频网站/武汉seo招聘网
本系列转自:https://www.cnblogs.com/woodytu/category/744422.html为什么简单恢复模式模式真的是坏主意?SQL Server里在文件组间如何移动数据?SQL Server里的文件和文件组故障恢复和恢复模式(Crash Recovery & Recovery Mode…...
做网站网页版和手机版/百度免费建网站
题面描述了一种加密的方式,让coder按照要求解密~ 将字母分成三段,再将位置用数组储存~所谓的旋转其实就是右移~ #include"cstdio" #include"iostream" #include"cstring" using namespace std; int main() { int k1,k2,…...
江门市专业做网站公司/开封网站设计
windows 之前对环境变量不了解,安装python时照搬,设置环境变零path路径为python安装路径。 再此解释下,这种设置是为了 在cmd窗口输入 python 时 自动搜索到python.exe执行。 我们安装是python2版本,则命令行启动的python2&#x…...
如何给局域网 做网站/友链交换网站
选择我们的理由:流量多 月享1500G超出流量不断网,每天50G(通常个人手机每月才30G左右流量)不拉网线,不插卡,三网随意切换 移动-联通-电信通用,开机自动优选当地3网较好的网络,也可以手动一键切换多人共享 支持32(随…...
泉州有什么网站是做鞋子批发的/网站推广去哪家比较好
ms類圖在網頁上看不完整。遇到這個問題的話,可以下載附件中的“兩個圖.wps”文檔來查看圖片。 類圖:交互序列圖: 转载于:https://blog.51cto.com/winters1224/1087138...
小程序和app的开发成本对比/seo优化什么意思
原标题:《我的世界》村民交易系统详解《我的世界》在村庄中是可以和村民进行交易的,但是很多玩家总是发现和村民交易非常亏,今天小编就为大家带来《我的世界》村民交易系统详解,赶来来看吧。交易(Trading)系统是一种允许玩家与NPC…...