CycleGAN论文解读及代码实现

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.rhkb.cn/news/81539.html

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

相关文章

玩转graphQL

转载至酒仙桥的玩转graphQL - SecPulse.COM | 安全脉搏 前言 在测试中我发现了很多网站开始使用GraphQL技术,并且在测试中发现了其使用过程中存在的问题,那么,到底GraphQL是什么呢?了解了GraphQL后能帮助我们在渗透测试中发现哪些…

【单片机】51单片机,TLC2543,驱动程序,读取adc

TLC2543 是一款 12 位精密模数转换器 (ADC)。 1~9、11、12——AIN0~AIN10为模拟输入端; 15——CS 为片选端; 17——DIN 为串行数据输入端;(控制字输入端,用于选择转换及输出数据格式) 16——…

Unity进阶--使用PhotonServer实现服务端和客户端通信--PhotonServer(一)

文章目录 Unity进阶--使用PhotonServer实现服务端和客户端通信服务器的安装和配置添加日志客户端的配置客户端和服务器的通信Dlc 出现vscode引用不好使的时候 Unity进阶–使用PhotonServer实现服务端和客户端通信 服务器的安装和配置 Photon的地址:https://www.ph…

第八篇: K8S Prometheus Operator实现Ceph集群企业微信机器人告警

Prometheus Operator实现Ceph集群企业微信告警 实现方案 我们的k8s集群与ceph集群是部署在不同的服务器上,因此实现方案如下: (1) ceph集群开启mgr内置的exporter服务,用于获取ceph集群的metrics (2) k8s集群通过 Service Endponit Ser…

RESTful

RESTful 简介 REST(Representational State Transfer):表现层资源状态转移 ①资源 资源是一种看待服务器的方式,即,将服务器看作是由很多离散的资源组成。每个资源是服务器上可命名的抽象概念。因为资源是一种抽象概念&#xff0…

vue3获得url上的参数值

1、引入 import { useRoute } from vue-router2、获得const route useRoute() console.log(route.query.number)

el-table实现指定列合并

table传入span-method方法可以实现合并行或列,方法的参数是一个对象,里面包含当前行row、当前列column、当前行号rowIndex、当前列号columnIndex四个属性。该函数可以返回一个包含两个元素的数组,第一个元素代表rowspan,第二个元素…

HTML 初

前言 HTML的基本骨架 HTML基本骨架是构建网页的最基本的结果。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

conda install 和pip install有什么区别?

本篇为分享贴&#xff0c;截图部分选自知乎&#xff0c;部分选自csdn&#xff0c;文字内容是结合自己实践进行总结。 环境引用的包在哪&#xff1f; 首先&#xff0c;一条命令&#xff1a; python -m site 这条命令可以定位引用的包在哪里 &#xff0c;当然也可以自己设置默认…

Java课题笔记~ 关于错误与异常

非检查异常(unckecked exception)&#xff1a;Error 和 RuntimeException 以及他们的子类。javac在编译时&#xff0c;不会提示和发现这样的异常&#xff0c;不要求程序员必须处理这些异常。在运行阶段&#xff0c;倘若发生Error则虚拟机几乎崩溃&#xff0c;倘若发生RuntimeEx…

mysql的主从复制和读写分离

目录 一、mysql的主从复制和读写分离的相关知识 1&#xff09;什么是读写分离? 2&#xff09;为什么要读写分离呢? 3&#xff09;什么时候要读写分离? 4&#xff09;主从复制的优点 5&#xff09;主从复制与读写分离 6&#xff09;mysql支持的复制类型 STATEMENT和r…

Maven的安装与配置(包含所有细节)

一、idea版本和maven配对 这里是很多新手都会遇到的大坑&#xff0c;一定要先将自己的idea版本和maven进行版本配配对。 Maven3.6.3版本兼容问题 注意&#xff1a;针对一些老项目 还是尽量采用 3.6.3版本&#xff0c;针对idea各个版本的兼容性就很兼容 IDEA 2022 兼容maven 3.8…

vue中vuex的五个属性和基本用法,另加js-cookie的使用

VueX 是一个专门为 Vue.js 应用设计的状态管理构架&#xff0c;统一管理和维护各个vue组件的可变化状态(你可以理解成 vue 组件里的某些 data )。 Vuex有五个核心概念&#xff1a; state, getters, mutations, actions, modules。 1. state&#xff1a; vuex的基本数据&…

HDFS中snapshot快照机制

HDFS中snapshot快照机制 介绍作用功能实现相关命令和操作相关命令 介绍 snapshot是数据存储的某一时刻的状态记录&#xff0c;备份&#xff08;backup&#xff09;则是数据存储的某一个时刻的副本HDFS snapshot快照是整个文件系统或某个目录在某个时刻的镜像&#xff0c;该镜像…

EFLFK——ELK日志分析系统+kafka+filebeat架构(3)

zookeeperkafka分布式消息队列集群的部署 紧接上期&#xff0c;在ELFK的基础上&#xff0c;添加kafka做数据缓冲 附kafka消息队列 nginx服务器配置filebeat收集日志&#xff1a;192.168.116.40&#xff0c;修改配置将采集到的日志转发给kafka&#xff1b; kafka集群&#xff…

在生产环境中部署Elasticsearch:最佳实践和故障排除技巧——聚合与搜索(三)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

【数据分享】2023年我国省市县三级的上市公司数量(Excel/Shp格式)

企业是经济活动的参与主体&#xff0c;一个城市的企业数量决定了这个城市的经济发展水平&#xff01;在众多公司企业中&#xff0c;上市公司堪称明珠&#xff0c;上市公司通常经济规模大、影响力强、员工多。哪个城市的上市公司更多&#xff0c;往往这个城市的经济实力越强&…

使用罗技鼠标后 弹出当前页面的脚本发生错误AppData/Local/Temp/LogiUI/Pak/js/jquery-1.3.2.min.js解决

使用的台式机&#xff0c;没有蓝牙驱动&#xff0c;在用logi无线鼠标时&#xff0c;把鼠标连接插入台式机后弹出的如上图所示这个提示&#xff0c;无论是点是/否&#xff0c;还是X掉上图提示&#xff0c;电脑右下角的图依然存在。不习惯这丫的存在。 我重启还是有&#xff0c;然…

REDIS主从配置

目录 前言 一、概述 二、作用 三、缺点 四、redis主从复制的流程 五、搭建redis主从复制 总结 前言 Redis的主从配置是指在Redis集群中&#xff0c;将一个Redis节点配置为主节点&#xff08;master&#xff09;&#xff0c;其他节点配置为从节点&#xff08;slave&#xff09;…

如何将jar包部署到宝塔

尝试多种方式上传&#xff0c;但启动一直失败&#xff0c;这种方式亲测是好使的 项目内修改位置 在pom.xml文件中将mysql的scope改成provided&#xff0c;如果是固定的版本号会出现问题 之后就可以打包啦&#xff0c;直接点击maven中的package 找到打包文件的位置&#xff…