CycleGAN论文解读及代码实现

news2024/11/23 9:20:46

paper: https://arxiv.org/pdf/1703.10593.pdf
github: https://github.com/aitorzip/PyTorch-CycleGAN

1 cycleGAN 小结

  • 网络:
    生成器2个:G_A,G_B
    判别器两个: D_A,D_B
  • 损失函数8个
    6个生成器损失函数
    2个判别器损失函数

1.1 数据

  • fake_B
    原始A,经过生成器G_A,生成fake_B
    A->G_A = fake_B
  • rec_A
    原始A,经过生成器G_A,生成fake_B,再经过生成器G_B,生成重构数据rec_A
    A->G_A ->G_B = rec_A
  • fake_A
    B->G_B = fake_A
    原始B,经过生成器G_B,生成fake_A
  • rec_B
    B->G_B ->G_A = rec_B
    原始B,经过生成器G_B,生成fake_A,再经过生成器G_A,生成重构数据rec_B

1.2 损失函数

6个生成器损失,2个判别器损失
1)6个生成器损失:

  • 生成器一致损失 2个
    数据B经过生成器G_A,后生成的B,与原始B距离最小。A同理
    ① B-> G_A->B’ : 使得B 与B’距离最小
    ② A-> F_B->A’ : 使得A 与A’距离最小
  • 生成器损失 2个
    生成器生成的数据,让判别器都判别为真
    ③ MSELoss(D_A(fake_B), True)
    ④ MSELoss(D_B(fake_A), True)
  • 循环一致损失 2个
    ⑤ 原始A,经过生成器G_A,生成fake_B,再经过生成器G_B,生成重构数据rec_A
    A->G_A ->G_B = rec_A
    ⑥原始B,经过生成器G_B,生成fake_A,再经过生成器G_A,生成重构数据rec_B
    B->G_B ->G_A = rec_B

2) 2个判别器损失

  • 判别器损失 2个
    使真实图片为判别为真,假图片判别为假
    ① D_A
    pred_real = D_A(real); pred_fake= D_A(fake)
    MSELoss(pred_real, True)+MSELoss(pred_fake, False)
    ②D_B
    pred_real = D_B(real); pred_fake= D_B(fake)
    MSELoss(pred_real, True)+MSELoss(pred_fake, False)

2 模型架构

  • 两个生成网络:
    G: X——> Y ,输入X生成Y
    F: Y——> X :输入Y生成X
  • 两个判别网络:
    D_A: 用于区分真实A和 F(B)生成的假A.
    D_B:用于区分真实B和 G(A)生成的假B.

在这里插入图片描述

3 损失函数

3.1 Adversarial Loss

对抗损失:

  • 对于生成器 G: X——> Y
    生成器G_X: 最小化以下目标函数
    对于判别器D_Y:最大化以下目标函数
    在这里插入图片描述
  • 对于生成器 F: Y——> X,损失函数同上
    生成器F_Y,使判别器D_X判断为真
    对于判别器D_X:是真实X判断为真,F_Y生成的X,判断为假。
    L G A N ( F , D X , Y , X ) L_{GAN}(F,D_X,Y,X) LGAN(F,DX,Y,X)

3.2 Cycle Consistency Loss

循环一致损失,即 X 经过生成器G_x后 得到Y,Y再过F_Y生成X,使得前后生成的X距离最小。
1) 前向一致损失
即从x 经过网络后还原为x的过程
X − > G ( x ) − > F ( G ( x ) ) = X X -> G(x) -> F(G(x)) =X X>G(x)>F(G(x))=X

2)反向一致损失
即y从经过网络后还原为y的过程
Y − > F ( y ) − > G ( F ( y ) ) = Y Y -> F(y) -> G(F(y)) =Y Y>F(y)>G(F(y))=Y

在这里插入图片描述

3.3 Full Objective

在这里插入图片描述

4 代码实现

4.1网络结构

  • 1 生成器A :
    netG_A:可以选用resnet,或者unet网络
    输入数据A,生成数据B
self.netG_A = networks.define_G(opt.input_nc, opt.output_nc, opt.ngf, opt.netG, opt.norm,
                                        not opt.no_dropout, opt.init_type, opt.init_gain, self.gpu_ids)
  • 2 生成器B:
    netG_B: 与netG_A网络一样
    输入数据B,生成数据A
 self.netG_B = networks.define_G(opt.output_nc, opt.input_nc, opt.ngf, opt.netG, opt.norm,
                                        not opt.no_dropout, opt.init_type, opt.init_gain, self.gpu_ids)
  • 3 判别器A
self.netD_A = networks.define_D(opt.output_nc, opt.ndf, opt.netD,
                                            opt.n_layers_D, opt.norm, opt.init_type, opt.init_gain, self.gpu_ids)

  • 4 判别器B
 self.netD_B = networks.define_D(opt.input_nc, opt.ndf, opt.netD,
                                            opt.n_layers_D, opt.norm, opt.init_type, opt.init_gain, self.gpu_ids)


5 损失

5.1 前向传播数据

  • self.fake_B
    原始A,经过生成器G_A,生成fake_B
    A->G_A = fake_B
  • self.rec_A
    原始A,经过生成器G_A,生成fake_B,再经过生成器G_B,生成重构数据rec_A
    A->G_A ->G_B = rec_A
  • self.fake_A
    B->G_B = fake_A
    原始B,经过生成器G_B,生成fake_A
  • self.rec_B
    B->G_B ->G_A = rec_B
    原始B,经过生成器G_B,生成fake_A,再经过生成器G_A,生成重构数据rec_B
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))

5.2 生成器一致损失

数据B经过生成器G_A,后生成的B,与原始B距离最小。
B-> G_A->B’ : 使得B 与B’距离最小
A-> F_B->A’ : 使得A 与A’距离最小

self.idt_A = self.netG_A(self.real_B)
self.loss_idt_A= self.L1Loss(self.idt_A, self.real_B)

self.idt_B = self.netG_B(self.real_A)
self.loss_idt_B = self.L1Loss(self.idt_B, self.real_A)

5.2 生成器损失

生成器生成的数据,让判别器都判别为真

(备注:判别器输出不是一个值,而是一个矩阵,需要使判别器输出矩阵每一个值都接近1)

# GAN loss D_A(G_A(A))
self.loss_G_A = self.MSELoss(self.netD_A(self.fake_B), True)
# GAN loss D_B(G_B(B))
self.loss_G_B = self.criterioMSELossGAN(self.netD_B(self.fake_A), True)

5.3 循环一致损失

使得重构的A与原始A距离最近,使用L1Loss

  • self.rec_A
    原始A,经过生成器G_A,生成fake_B,再经过生成器G_B,生成重构数据rec_A
    A->G_A ->G_B = rec_A
  • self.rec_B
    B->G_B ->G_A = rec_B
    原始B,经过生成器G_B,生成fake_A,再经过生成器G_A,生成重构数据rec_B
# Forward cycle loss || G_B(G_A(A)) - A||
self.loss_cycle_A = self.L1Loss(self.rec_A, self.real_A) 
# Backward cycle loss || G_A(G_B(B)) - B||
self.loss_cycle_B = self.L1Loss(self.rec_B, self.real_B) 

5.4 生成器总loss

上面6个生成器损失求和即为总的生成损失函数

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

5.5 判别器损失

判别器:使真实图片为判别为真,假图片判别为假

pred_real = netD(real)
loss_D_real = self.MSELoss(pred_real, True)
# Fake
pred_fake = netD(fake.detach())
loss_D_fake = self.MSELoss(pred_fake, False)
# Combined loss and calculate gradients
loss_D = (loss_D_real + loss_D_fake) * 0.5

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

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

相关文章

Freemarker:生成HTML文本文件

前置工作参考: Freemarker:基本使用_moreCalm的博客-CSDN博客 1、修改application.yml配置文件 server:port: 8881 #服务端口 spring:application:name: freemarker-demo #指定服务名freemarker:cache: false #关闭模板缓存,方便测试settin…

leetcode904. 水果成篮(java)

水果成篮 leetcode904. 水果成篮题目描述滑动窗口代码演示 回溯算法 leetcode904. 水果成篮 难度 - 中等 leetcode 904 水果成蓝 题目描述 你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树…

PPG心率血氧检测健康型沙发方案

《中国心血管健康与疾病报告2021》数据显示,我国心血管病患病人数已达 3.3 亿。目前,心脑血管病 死亡占城乡居民总死亡原因的首位,农村为46.7%,城市为44%。老年人是心脑血管病的主要发病体,老年 人患心脑血管病的几率较…

jmeter测试rpc接口-使用dubbo框架调用【杭州多测师_王sir】

1.基于SOAP架构。基于XML规范。基于WebService协议。特点:接口地址?wsdl结尾2.基于RPC架构,基于dubbo协议,thrift协议。SpringCloud微服务。3.基于RestFul架构,基于json规范。基于http协议(我们常用的都是这种,cms平台也是) Rest…

【数据分享】2000-2022年我国乡镇人口数量数据(免费获取/Shp/Excel格式)

在之前的文章中我们分享了基于LandScan数据集的2000-2022年的1km精度的全球、全国、分省、分市的人口空间分布栅格数据(可查看之前的文章获悉详情)。以及基于栅格数据处理出的Shp和Excel两种格式的我国省市县三级的2000-2022年度的人口数量数据&#xff…

【密码学】六、公钥密码

公钥密码 1、概述1.1设计要求1.2单向函数和单向陷门函数 2、RSA公钥密码体制2.1加解密2.2安全性分析 3、ElGamal公钥密码体制3.1加解密算法3.2安全性分析 4、椭圆曲线4.1椭圆曲线上的运算4.2ECC 5、SM2公钥密码体制5.1参数选取5.2密钥派生函数5.3加解密过程5.3.1初始化5.3.2加密…

photoshop生成器引入到electron项目(electron与photoshop建立通信)

Photoshop引入了nodejs,在启动的时候,通过pipe调起nodejs运行时核心generator-builtin,通过KLVR机制与ps进行通信和交互,同时会加载用户编写的扩展。 这里记录一下引入时的踩坑过程 generator-core就是它的源码,elect…

【项目部署】JavaScript解析JSON解析报错Unexpected token xxx is not valid JSON

问题背景 这个报错发生在之前部署的一个前后端分离的项目中。后端使用的Spring Boot,前端使用的JavaScript,前后端交互使用Thymeleaf框架。 现象 项目组的另一个小伙伴说,突然有个页面打不开了,整个页面全空白。我F12打开浏览器…

JAVA集合框架 一:Collection(LIst,Set)和Iterator(迭代器)

目录 一、Java 集合框架体系 1.Collection接口:用于存储一个一个的数据,也称单列数据集合(single)。 2.Map接口:用于存储具有映射关系“key-value对”的集合(couple) 3.Iterator接口&#…

pycharm的Terminal中如何设置打开anaconda3的虚拟环境

在pycharm的File -> Settings -> Tools -> Terminal下面,如下图所示 修改为红框中内容,然后关闭终端在重新打开终端,即可看到anaconda3的虚拟环境就已经会被更新

开源语言模型的历史和重要性;Edge浏览器将推出Bing AI重写文本功能

🦉 AI新闻 🚀 微软即将推出桌面版Microsoft Edge浏览器的Bing AI重写文本功能 摘要:微软最近在桌面版Microsoft Edge浏览器中引入了一个新功能,允许用户使用Bing AI重写文本。用户可以选择不同的语气、格式和长度,然…

5、螺旋矩阵

螺旋矩阵是指一个呈螺旋状的矩阵,它的数字由第一行开始到右边不断变大,向下变大,向左变大,向上变大,如此循环。如: 1 2 3 4 10 11 12 5 9 8 7 …

让三驾马车奔腾:华为如何推动空间智能化发展?

上个月,国务院常务会议审议通过了《关于促进家居消费的若干措施》,其中明确提出了“推动单品智能向全屋智能发展创新培育智能消费”“开展数字家庭建设试点”等推动全屋智能拼配发展的建议与方案。 可以说,以整屋为单位的空间智能品类&#x…

神码ai伪原创【php源码】

大家好,小编为大家解答python必备常用英语词汇笔记的问题。很多人还不知道python中常用的英语单词,现在让我们一起来看看吧! 火车头采集ai伪原创插件截图: 一.什么是注释 注释是对一段代码的解释,不参与程序运行&…

LeetCode题解:判断是否能拆分数组

⭐简单说两句⭐ 作者:后端小知识 CSDN个人主页:后端小知识 🔎GZH:后端小知识 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 上周做了力扣周赛的题,给大家分享一个中等题目&#xff…

适用HarmonyOS 3.1版本及以上的应用及服务开发工具 DevEco Studio 3.1.1 Release 安装

文章目录 安装步骤1.下载安装包2.安装成功后,初次运行studio2.1 配置node与ohpm的环境2.2安装sdk2.3等待安装结束 3.创建项目3.1 点击Create Project3.2 选择一个空项目3.3 项目配置3.4 Finish、等待依赖下载完毕3.5 项目创建完成 tip 提示4.配置运行环境4.1 真机运…

C++-使用clang-format格式化代码

clang-format既是一个库,也是一个单独的工具,它可以自动格式化代码。下面我们介绍如何在QtCreator中使用clang-format。 点击帮助->关于插件,勾选Beautifier 重启后,点击工具->选项->Beautifier->Clang Format&…

[保研/考研机试] KY109 Zero-complexity Transposition 上海交通大学复试上机题 C++实现

描述: You are given a sequence of integer numbers. Zero-complexity transposition of the sequence is the reverse of this sequence. Your task is to write a program that prints zero-complexity transposition of the given sequence. 输入描述&#xf…

开发安卓项目kotlin编写时应用闪退

最近在开发一个公司的安卓项目(kotlin和java混合)遇到一个问题卡了半天。 TODO("Not yet implemented")自己实现了一个方法,系统自动生成了 TODO("Not yet implemented")注释。刚开始也没有在意(java开发时常…

【VisualGLM】大模型之 VisualGLM 部署

目录 1. VisualGLM 效果展示 2. VisualGLM 介绍 3. VisualGLM 部署 1. VisualGLM 效果展示 VisualGLM 问答 原始图片 2. VisualGLM 介绍 VisualGLM 主要做的是通过图像生成文字,而 Stable Diffusion 是通过文字生成图像。 一种方法是将图像当作一种特殊的语言进…