当前位置:网站首页>[代码阅读] CycleGAN: Unpaired Image-To-Image Translation Using Cycle-Consistent Adversarial Networks
[代码阅读] CycleGAN: Unpaired Image-To-Image Translation Using Cycle-Consistent Adversarial Networks
2022-08-04 09:51:00 【xiongxyowo】
损失函数
为了简单起见,只考虑Cycle中的半个循环,另一半是对称的。
Adversarial Loss
对抗损失的作用是判断生成的图像是否"像"目标域的图像,本文使用Least Square Loss(平方误差)来进行这一判断过程,公式如下:
L LSGAN ( G , D Y , X , Y ) = E y ∼ p data ( y ) [ ( D Y ( y ) − 1 ) 2 ] + E x ∼ p data ( x ) [ D Y ( G ( x ) ) 2 ] \mathcal{L}_{\text{LSGAN}}(G,\ D_{Y},\ X,\ Y)=\mathbb{E}_{y\sim p_{\text{data}}(y)}[(D_{Y}(y)-1)^{2}]+\mathbb{E}_{x\sim p_{\text{data}}(x)}[D_{Y}(G(x))^{2}] LLSGAN(G, DY, X, Y)=Ey∼pdata(y)[(DY(y)−1)2]+Ex∼pdata(x)[DY(G(x))2] 其中,G代表生成器, D Y D_{Y} DY表示目标域的判别器(用于区分生成的 G ( x ) G(x) G(x)与真实的 y y y), X X X表示源域, Y Y Y表示目标域。代码如下:
- 实现Least Square Loss:
# cycle_gan_model.py 90行
self.criterionGAN = networks.GANLoss(opt.gan_mode).to(self.device) # define GAN loss.
# networks.py 231行
if gan_mode == 'lsgan':
self.loss = nn.MSELoss()
- 将源域A的图像x(real_A)送入生成器,得到假的目标域B的图像(fake_B):
# cycle_gan_model.py 114行
self.fake_B = self.netG_A(self.real_A) # G_A(A)
- 将真实的目标域B的图像送入判别器,得到一个分数。我们希望判别器能够区分出真实的图像:
# cycle_gan_model.py 131行
pred_real = netD(real)
loss_D_real = self.criterionGAN(pred_real, True)
- 将生成的目标域B的图像送入判别器,得到一个分数,我们希望判别器能够区分虚假的图像:
# cycle_gan_model.py 134行
pred_fake = netD(fake.detach())
loss_D_fake = self.criterionGAN(pred_fake, False)
至此对抗损失的判别器部分结束。生成器部分如下,我们希望生成的图像能够骗过判别器:
# cycle_gan_model.py 169行
self.loss_G_A = self.criterionGAN(self.netD_A(self.fake_B), True)
Cycle Loss
循环损失的作用在于令源域A的图像在转换至目标域B后,仍然能转换回源域A,这就间接要求A->B的过程不去丢失图像中原有的信息,从而实现图像风格转换。本文使用L1 Loss(绝对误差)来实现这一过程: L cyc ( G , F ) = E x ∼ p data ( x ) [ ∥ F ( G ( x ) ) − x ∥ 1 ] \mathcal{L}_{\text{cyc}}(G,\ F)=\mathbb{E}_{x\sim p_{\text{data}}(x)}[\Vert F(G(x))-x \Vert_{1}] Lcyc(G, F)=Ex∼pdata(x)[∥F(G(x))−x∥1] 代码如下:
- 实现L1 Loss:
# cycle_gan_model.py 91行
self.criterionCycle = torch.nn.L1Loss()
- 将源域A的图像x(real_A)送入生成器,得到假的目标域B的图像(fake_B),再转换回源域A的图像(rec_A):
# cycle_gan_model.py 114行
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))
判断重建的图像与原始图像是否相同:
# cycle_gan_model.py 173行
self.loss_cycle_A = self.criterionCycle(self.rec_A, self.real_A)
边栏推荐
- 【cookie 临时存储数据,WebStorage ,sessionStorage】
- Cloud function to achieve automatic website check-in configuration details [Web function/Nodejs/cookie]
- LVS-DR集群部署
- Four common methods of network attacks and their protection
- How Oracle for current library or certain library data on the same server number?
- ps抠图怎么抠出来,自学ps软件photoshop2022,ps怎么抠出想要的部分-笔记记录
- Anton Paar Anton Paar Density Meter Hydrometer Repair DMA35 Performance Parameters
- 请问下Flink SQL如何写hologres分区表?我想要每天一个分区
- No module named 'flask_misaka' has been resolved [BUG solution]
- 学习在微信小程序中判断url的文件后缀格式
猜你喜欢
随机推荐
TiCDC同步延迟问题处理
Detailed explanation of MSTP protocol configuration on Layer 3 switches [Huawei eNSP experiment]
MindSpore:Ascend运行出现问题
TiFlash 源码阅读(五) DeltaTree 存储引擎设计及实现分析 - Part 2
数据使用要谨慎——不良数据带来严重后果
数据万象内容审核 — 共建安全互联网,专项开展“清朗”直播整治行动
双重for循环案例以及while循环和do while循环案例
加降息与BTC流动性事件策略研究
路由/三层交换机DHCP下发地址详解【华为eNSP】
Win11系统重装用什么好 一键重装Win11教程
LVS-DR集群部署
XCTF-reverse-signin
多媒体和物联网技术让版本“活”起来 129张黑胶唱片“百年留声”
超宽带UWB实时精准定位,短距离无缝交互应用,物联网厘米级精度方案
Layer 3 Switch/Router OSPF Configuration Details [Huawei eNSP Experiment]
已解决No module named ‘flask_misaka‘【BUG解决】
视频加密怎么播放_win播放器加密视频
v-model原理,在“radio”、“checkbox”、“select”、修饰符
ps如何换背景颜色,自学ps软件photoshop2022,3种不同的方式笔记记录
Person.class.getInterfaces() 注意使用方法









