cycleGAN算法解读

news2024/12/25 2:35:45

本文参考: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_identity

        lambda_A = self.opt.lambda_A

        lambda_B = self.opt.lambda_B

        # Identity loss

        if 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_idt

        else:

            self.loss_idt_A = 0

            self.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 gradients

        self.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_B

        self.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的残差网络,后面这种方法验证在图像分类算法上面效果比较好。

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

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

相关文章

vue样式绑定(v-if)

文章目录一.第一次用vue框架二.要求:1.定义两种样式&#xff0c;一种描述正确的状态&#xff0c;一种描述错误的状态。2.在结构代码中定义一个块&#xff0c;实现绑定正确的样式状态。3.定义一个按钮&#xff0c;实现正确和错误两种状态的class切换。三.源代码四.效果一.第一次…

极客之选:用Rollup打包工具优化前端代码,让你成为前端领域的高手

前端开发面临着不断变化的技术和越来越复杂的项目需求&#xff0c;如何优化前端代码成为了前端开发人员必须要面对的挑战。本论文介绍了一个名为Rollup的打包工具&#xff0c;该工具可以帮助开发人员优化前端代码&#xff0c;减小代码体积&#xff0c;提高网站性能。本论文将介…

那些年用过的IDEA插件

今天和大家分享一下经常使用的IDEA的插件&#xff0c;希望有所帮助。一、IDEA插件CodeGlance2显示代码缩略图插件&#xff0c;方便查看代码。Lombok用于编译期间自动生成getter、setter、构造、toString等方法&#xff0c;简化代码。Mybatis Builder或MybatisXMapper接口和xml双…

2023雅虎邮箱不能注册?别急,这份教程教你成功注册雅虎邮箱

这几年&#xff0c;跨境电商的迅猛发展&#xff0c;越来越多人加入这片蓝海&#xff0c;跨境人拥有一个专业的邮箱账户显得尤为重要&#xff0c;它是商业交流和日常工作的必备工具。因此&#xff0c;雅虎邮箱成为了许多人的首选&#xff0c;全球范围内使用雅虎邮箱的人数是非常…

问题三十二:离散二维傅立叶变换(Discrete Fourier Transformation)

为了将灰度图像表示为频谱图&#xff0c;我们需要进行以下步骤&#xff1a; 加载图像并将其转换为灰度图像。对图像进行二维离散傅里叶变换。将变换结果表示为幅度谱和相位谱。可以对幅度谱和相位谱进行可视化&#xff0c;以查看频率分布。对幅度谱和相位谱进行逆变换&#xf…

做毕业设计,前端部分你需要掌握的6个核心技能

其实前端新手如果想要自己实现一套毕业设计项目并非简单的事&#xff0c;因为之前很多人一直还停留在知识点的阶段&#xff0c;而且管理系统和C端网站都需要开发&#xff0c;但现在需要点连成线了。所以在启动项目开发之前呢&#xff0c;针对前端部分&#xff0c;我列举一些非常…

react lazyLoad学习记录

react lazyLoad学习记录1.lazyLoad用处2.使用2.1 react-router-dom5版本写法2.2 react-router-dom6版本写法1.lazyLoad用处 默认例如首页&#xff0c;如果有好十几个甚至百个路由&#xff0c;react是会默认一下全部把路由组件一下全部加载的&#xff0c;极可能造成页面卡顿。r…

mysql数据库之sql语句性能分析工具

一、sql执行频率。 mysql客户端连接成功后&#xff0c;通过show [session | global] status 命令可以提供服务器状态信息。通过如下指令&#xff0c;可以查看当前数据库的INSERT/UPDATE/DELETE的访问频次。 #一个下划线代表一个字符 show global status like com_; 二、慢查…

冲鸭!33% 程序员月薪达到 5 万元以上~

2023年&#xff0c;随着互联网产业的蓬勃发展&#xff0c;程序员作为一个自带“高薪多金”标签的热门群体&#xff0c;被越来越多的人所关注。在过去充满未知的一年中&#xff0c;他们的职场现状发生了一定的改变。那么&#xff0c;程序员岗位的整体薪资水平、婚恋现状、职业方…

注意,摸鱼程序员常用的9个小技巧,早点下班不秃头

9个养生小技巧&#xff0c;祝大家不秃头嗨害大家好鸭&#xff01; 我是小熊猫~毕竟摸鱼一时爽&#xff0c;一直摸一直爽嘛~一、整理字符串输入二、迭代器切片&#xff08;Slice&#xff09;三、跳过可迭代对象的开头四、只包含关键字参数的函数 (kwargs)五、创建支持「with」语…

【C/C++】getchar()在处理字符输入时的一个细节

1、当我们进行“输入”后&#xff0c;无论输入一个字符或者是一个数字、一个字符串。都会自动产生一个换行符&#xff0c;而这个不起眼的回车符(‘\n’)也是一个‘字符’。如果我们需要连续多次输入‘字符’&#xff0c;则需要在每次输入字符后&#xff0c;及时处理这个换行符。…

前端二面vue面试题总结

什么是 mixin &#xff1f; Mixin 使我们能够为 Vue 组件编写可插拔和可重用的功能。如果希望在多个组件之间重用一组组件选项&#xff0c;例如生命周期 hook、 方法等&#xff0c;则可以将其编写为 mixin&#xff0c;并在组件中简单的引用它。然后将 mixin 的内容合并到组件中…

如何使用BackupOperatorToDA将Backup Operators用户权限提升为域管理员

关于BackupOperatorToDA BackupOperatorToDA是一款功能强大的红队提权工具&#xff0c;该工具能够在不使用域控制器RDP或WinRM的情况下&#xff0c;帮助广大研究人员将Backup Operators组的成员账号提升为域管理员权限。 如果红队研究人员在渗透测试的过程中&#xff0c;拿到…

代码随想录之数组(力扣题号)

69 x的平方根 这题需要注意的点在于数据的数据范围导致计算x的平方可能会超过Integer范围 超出范围之后的大小判断就会出错 if(2147488281>2147395600) System.out.println("yes"); //没有输出 注意不能这样&#xff0c;会超出Integer范围解决&#xff1a;前面…

百度文心大模型开发者斩获CCF BDCI大赛唯一『最佳算法能力奖』

‍2023年2月24日至25日&#xff0c;中国计算机学会&#xff08;CCF&#xff09;主办、苏州市吴江区人民政府支持&#xff0c;苏州市吴江区工信局、吴江区东太湖度假区管理办公室、苏州市吴江区科技局、CCF大数据专家委员会及其他专业委员会等多家组织单位共同承办的大数据与AI领…

在C#中使用互斥量解决多线程访问共享资源的冲突问题

在阿里云上对互斥量的概述&#xff1a;互斥量的获取是完全互斥的&#xff0c;即同一时刻&#xff0c;互斥量只能被一个任务获取。而信号量按照起始的计数值的配置&#xff0c;可以存在多个任务获取同一信号量的情况&#xff0c;直到计数值减为0&#xff0c;则后续任务无法再获取…

王道操作系统课代表 - 考研计算机 第四章 文件管理 究极精华总结笔记

本篇博客是考研期间学习王道课程 传送门 的笔记&#xff0c;以及一整年里对 操作系统 知识点的理解的总结。希望对新一届的计算机考研人提供帮助&#xff01;&#xff01;&#xff01; 关于对 “文件管理” 章节知识点总结的十分全面&#xff0c;涵括了《操作系统》课程里的全部…

Python使用异步线程池实现异步TCP服务器交互

背景&#xff1a; 实现客户端与服务端交互&#xff0c;由于效率原因&#xff0c;要发送与接收异步&#xff0c;提高效率。 需要多线程&#xff0c;本文用线程池管理。 common代码&#xff1a; import pickle import struct import timedef send_msg(conn, data):time.sleep(…

centos7配置静态网络常见问题归纳

系列相似配置与安装软件问题整理与归纳文章目录 安装pymysql库_pymysql库安装_张小鱼༒的博客-CSDN博客 解决pip更新的代码_pip更新代码_张小鱼༒的博客-CSDN博客 python当中的第三方wxPython库的安装解答_pip install wx_张小鱼༒的博客-CSDN博客 spark里面配置jdk后的编程…

MATLAB算法实战应用案例精讲-【优化算法】增强型鲸鱼优化算法(EWOA)(附matlab代码实现)

前言 增强型鲸鱼优化算法(Enhanced Whale Optimization Algorithm,EWOA)是Mohammad H. Nadimi-Shahraki等人于2022年提出的一种改进算法。由于标准的鲸鱼优化算法及其它的改进算法都存在种群多样性低和搜索策略差的问题,因此引入有效的策略来缓解鲸鱼优化算法的这些核心缺点…