训练的代码见于train.py,首先定义好网络,两个生成器A2B, B2A和两个判别器A, B,以及对应的优化器(优化器的设置保证了只更新生成器或判别器,不会互相影响)

###### Definition of variables #######Networks

netG_A2B =Generator(opt.input_nc, opt.output_nc)

netG_B2A=Generator(opt.output_nc, opt.input_nc)

netD_A=Discriminator(opt.input_nc)

netD_B= Discriminator(opt.output_nc)

#Optimizers & LR schedulers

optimizer_G =torch.optim.Adam(itertools.chain(netG_A2B.parameters(), netG_B2A.parameters()),

lr=opt.lr, betas=(0.5, 0.999))

optimizer_D_A= torch.optim.Adam(netD_A.parameters(), lr=opt.lr, betas=(0.5, 0.999))

optimizer_D_B= torch.optim.Adam(netD_B.parameters(), lr=opt.lr, betas=(0.5, 0.999))

然后是数据

#Dataset loader

transforms_ = [ transforms.Resize(int(opt.size*1.12), Image.BICUBIC),

transforms.RandomCrop(opt.size),

transforms.RandomHorizontalFlip(),

transforms.ToTensor(),

transforms.Normalize((0.5,0.5,0.5), (0.5,0.5,0.5)) ]

dataloader= DataLoader(ImageDataset(opt.dataroot, transforms_=transforms_, unaligned=True),

batch_size=opt.batchSize, shuffle=True, num_workers=opt.n_cpu)

接着就可以求取损失,反传梯度,更新网络,更新网络的时候首先更新生成器,然后分别更新两个判别器

生成器:损失函数=身份损失+对抗损失+循环一致损失

###### Generators A2B and B2A ######

optimizer_G.zero_grad()#Identity loss

#G_A2B(B) should equal B if real B is fed

same_B =netG_A2B(real_B)

loss_identity_B= criterion_identity(same_B, real_B)*5.0

#G_B2A(A) should equal A if real A is fed

same_A =netG_B2A(real_A)

loss_identity_A= criterion_identity(same_A, real_A)*5.0

#GAN loss

fake_B =netG_A2B(real_A)

pred_fake=netD_B(fake_B)

loss_GAN_A2B=criterion_GAN(pred_fake, target_real)

fake_A=netG_B2A(real_B)

pred_fake=netD_A(fake_A)

loss_GAN_B2A=criterion_GAN(pred_fake, target_real)#Cycle loss

recovered_A =netG_B2A(fake_B)

loss_cycle_ABA= criterion_cycle(recovered_A, real_A)*10.0recovered_B=netG_A2B(fake_A)

loss_cycle_BAB= criterion_cycle(recovered_B, real_B)*10.0

#Total loss

loss_G = loss_identity_A + loss_identity_B + loss_GAN_A2B + loss_GAN_B2A + loss_cycle_ABA +loss_cycle_BAB

loss_G.backward()

optimizer_G.step()

判别器A 损失函数= 真实样本分类损失 + 虚假样本分类损失

###### Discriminator A ######

optimizer_D_A.zero_grad()#Real loss

pred_real =netD_A(real_A)

loss_D_real=criterion_GAN(pred_real, target_real)#Fake loss

fake_A =fake_A_buffer.push_and_pop(fake_A)

pred_fake=netD_A(fake_A.detach())

loss_D_fake=criterion_GAN(pred_fake, target_fake)#Total loss

loss_D_A = (loss_D_real + loss_D_fake)*0.5loss_D_A.backward()

optimizer_D_A.step()###################################

判别器B损失函数= 真实样本分类损失 + 虚假样本分类损失

###### Discriminator B ######

optimizer_D_B.zero_grad()#Real loss

pred_real =netD_B(real_B)

loss_D_real=criterion_GAN(pred_real, target_real)#Fake loss

fake_B =fake_B_buffer.push_and_pop(fake_B)

pred_fake=netD_B(fake_B.detach())

loss_D_fake=criterion_GAN(pred_fake, target_fake)#Total loss

loss_D_B = (loss_D_real + loss_D_fake)*0.5loss_D_B.backward()

optimizer_D_B.step()###################################

可以注意到,判别器损失中,虚假样本fake_A,fake_B都采用detach()操作,脱离计算图,这样判别器的损失进行反向传播不会对整个网络计算梯度,避免了不必要的计算

circlegan_【源码解读】cycleGAN(二) :训练相关推荐

  1. print python 带回车_python标准库threading源码解读【二】

    紧接着上一篇文章继续解析源码 甘蔗:python标准库threading源码解读[一]​zhuanlan.zhihu.com 目录 Event的介绍和用法 Event源码解析 以后的内容尽量少一点并且 ...

  2. x264源码解读(二)- VCL和NAL那些事

    目录 ANNEXB vs. AVCC VCL vs. NAL signal函数响应键盘事件 收尾清理工作 x264的编码 ANNEXB vs. AVCC 今天我们继续来说一下x264结构中非常重要的属 ...

  3. PyTorch 源码解读之分布式训练了解一下?

    来源丨商汤学术   编辑丨极市平台 本文由浅入深讲解 torch.distributed 这一并行计算包的概念,实现细节和应用方式,并带大家快速入门 PyTorch 分布式训练. 0 前言 由于大规模 ...

  4. ReactiveCocoa源码解读(二)

    上一篇解读了ReactiveCocoa的三个重要的类的底层实现,本篇继续. 一.RACMulticastConnection 1.应用 RACMulticastConnection: 用于当一个信号被 ...

  5. jpcsp源码解读之二:main函数与jpcsp的初始化流程

    虽然这个软件是用java语言编写,面向对象,可是总要有个开始的入口,这里关心的就是,main函数在哪里. 似乎java中也可以没有main函数,也可能是我的错误认识.暂且不管,jpcsp中是有main ...

  6. PhotoSwipe源码解读系列(二)

    作者: 铁锚 日期: 2013年12月19日 说明: 本系列文章为草稿,等待后期完善.源码是jQuery版本的,code.photoswipe-3.0.5.js 1. 代码开头,就是一些版权申明,没什 ...

  7. YYModel 源码解读(二)之YYClassInfo.h (1)

    1 NS_ASSUME_NONNULL_BEGIN 2 NS_ASSUME_NONNULL_END 为了兼容Swift 中的 ? 和 ! oc 在6.3引入了两个新的类型注释:__nullable和_ ...

  8. php网页游戏学习之xnova(ogame)源码解读,PHP网页游戏学习之Xnova(ogame)源码解读(二)...

    三. 安装(install/index.php) 这个文件是安装页面,一开始就可以看到定义了两个常量: 因为这两个常量在接下来的代码中总是用到,所以在这里先说明下.INSIDE是用来防止攻击的:INS ...

  9. Alamofire源码解读系列(十二)之请求(Request)

    本篇是Alamofire中的请求抽象层的讲解 前言 在Alamofire中,围绕着Request,设计了很多额外的特性,这也恰恰表明,Request是所有请求的基础部分和发起点.这无疑给我们一个Req ...

  10. Alamofire源码解读系列(九)之响应封装(Response)

    本篇主要带来Alamofire中Response的解读 前言 在每篇文章的前言部分,我都会把我认为的本篇最重要的内容提前讲一下.我更想同大家分享这些顶级框架在设计和编码层次究竟有哪些过人的地方?当然, ...

最新文章

  1. ACL 2018论文解读 | 基于排序思想的弱监督关系抽取选种与降噪算法
  2. android x86_64 服务器运行,魔趣 android10 编译x86-64 运行模拟器
  3. html 透视效果,html – CSS – 对背景图像的“敲除”/透视效果
  4. Esper 7.x集成SparkStream 2.x
  5. 147. Insertion Sort List
  6. 教你快速运行谷歌EfficientDet目标检测
  7. Labview子VI的创建与调用
  8. 东软 c语言笔试题,C语言笔试题及参考答案东软集团
  9. 通过keil5下载hex文件
  10. 私钥、证书、USBKey
  11. TDP158RSBR 6-Gbps 转接驱动器,兼容HDMI2.0
  12. 无线传感网络——串口通信
  13. 关于TDA1557Q
  14. 基于vue-cli3的vue项目 通过postcss-pxtorem 实现px自动转换成rem
  15. 计算机房里面味道很大,搞笑段子:我负责单位的计算机房,同事的计算机有问题来向我讨教...
  16. 论文解读:ChangeFormer | A TRANSFORMER-BASED SIAMESE NETWORK FOR CHANGE DETECTION
  17. 魔方(6)三阶空心魔方、二阶空心魔方
  18. 公司网站制作需要多少钱?
  19. discuz!内置代码
  20. DAY DAY UP 1

热门文章

  1. 1024 程序员节专题论坛来袭,聚焦企业级开源数据库 openGauss
  2. Kubernetes 也有局限性吗?
  3. 玛莎拉蒂“跨界”腾讯车联打造车载互联系统,新Ghibli “触电新生”
  4. AI赋能红外测温助力精准防控疫情……
  5. css让背景图片显示透明遮罩_CSS项目测试(支持深色模式)
  6. javacurrentmap_Java ConcurrentHashMap.forEach方法代码示例
  7. java 使用c .dll_Windows下java调用c的dll动态库--Dev_Cpp编译c生成dll
  8. android 模拟器声音设置,使用android模拟器录制声音
  9. ./mysqld: error while loading shared libraries: libnuma.so.1: cannot open shared object file: No suc
  10. 秒杀场景_同步秒杀分析和实战_01