一文看懂PatchGAN
最近看到PatchGAN很是好奇原理是什么,发现网上很多介绍的并不清楚.故墙外墙内来回几次,大概是清楚了.
PatchGAN
PatchGAN其实指的是GAN的判别器,将判别器换成了全卷积网络.
这么说并不严谨,PatchGAN和普通GAN判别器是有区别的,普通的GAN判别器是将输入映射成一个实数,即输入样本为真样本的概率.PatchGAN将输入映射为NxN的patch(矩阵)X,XijX_{ij}Xij的值代表每个patch为真样本的概率,将XijX_{ij}Xij求均值,即为判别器最终输出,XXX其实就是卷积层输出的特征图.从这个特征图可以追溯到原始图像中的某一个位置,可以看出这个位置对最终输出结果的影响.
有什么好处呢?直观上理解就可以了,普通GAN输出一个数,像是一言堂,PatchGAN输出一个矩阵,最终结果求平均,考虑到图像的不同部分的影响,就像考虑了多人的建议然后给出决定。
实际上,一些研究表明对于要求高分辨率、高清细节的图像领域中,普通GAN判别器并不适合,由此引入了PatchGAN,它的感受域对于与输入中的一小块区域,也就是说,XijX_{ij}Xij对应了判别器对输入图像的一小块的判别输出,这样训练使模型更能关注图像细节。
感受域
对CycleGAN来说,判别器输出大小30x30x1,论文中却指出PatchGAN输入图像处理为70x70patches,就是根据判别器最终输出的特征图进行回溯,最终对应到输入图像70x70的区域.
为了便于理解,看下面的代码,其计算感受域大小
def f(output_size, ksize, stride):return (output_size - 1) * stride + ksizelast_layer = f(output_size=1, ksize=4, stride=1)
# Receptive field: 4
fourth_layer = f(output_size=last_layer, ksize=4, stride=1)
# Receptive field: 7
third_layer = f(output_size=fourth_layer, ksize=4, stride=2)
# Receptive field: 16
second_layer = f(output_size=third_layer, ksize=4, stride=2)
# Receptive field: 34
first_layer = f(output_size=second_layer, ksize=4, stride=2)
# Receptive field: 70print(f'最后一层感受域大小:{last_layer}')
print(f'第一层感受域大小:{first_layer}')
#最后一层感受域大小:4
#第一层感受域大小:70
fff即为计算卷积感受域的公式,最后一层的感受域即为卷积核大小4,那么这个卷积核能够感受到原始输入图像多大的范围呢?是70,也就是CycleGAN所说的70x70patches.
综上,PatchGAN并不神秘,其只是一个全卷积网络而已,只是最终输出是一个特征图X,而非一个实数.它就相当于对图像先进行若干次70x70的随机剪裁,将剪裁后图像输入普通的判别器,然后对所有输出的实数值取平均.
实现
啰嗦了这么多,并没有什么感觉,还是给大家上代码吧,最后附上一个PatchGAN实现,可以看到,只是几层卷积而已.
class NLayerDiscriminator(nn.Module):"""Defines a PatchGAN discriminator"""def __init__(self, input_nc, ndf=64, n_layers=3, norm_layer=nn.BatchNorm2d):"""Construct a PatchGAN discriminatorParameters:input_nc (int) -- the number of channels in input imagesndf (int) -- the number of filters in the last conv layern_layers (int) -- the number of conv layers in the discriminatornorm_layer -- normalization layer"""super(NLayerDiscriminator, self).__init__()if type(norm_layer) == functools.partial: # no need to use bias as BatchNorm2d has affine parametersuse_bias = norm_layer.func != nn.BatchNorm2delse:use_bias = norm_layer != nn.BatchNorm2dkw = 4padw = 1sequence = [nn.Conv2d(input_nc, ndf, kernel_size=kw, stride=2, padding=padw), nn.LeakyReLU(0.2, True)]nf_mult = 1nf_mult_prev = 1for n in range(1, n_layers): # gradually increase the number of filtersnf_mult_prev = nf_multnf_mult = min(2 ** n, 8)sequence += [nn.Conv2d(ndf * nf_mult_prev, ndf * nf_mult, kernel_size=kw, stride=1, padding=padw, bias=use_bias),norm_layer(ndf * nf_mult),nn.LeakyReLU(0.2, True)]nf_mult_prev = nf_multnf_mult = min(2 ** n_layers, 8)sequence += [nn.Conv2d(ndf * nf_mult_prev, ndf * nf_mult, kernel_size=kw, stride=1, padding=padw, bias=use_bias),norm_layer(ndf * nf_mult),nn.LeakyReLU(0.2, True)]sequence += [nn.Conv2d(ndf * nf_mult, 1, kernel_size=kw, stride=1, padding=padw)] # output 1 channel prediction mapself.model = nn.Sequential(*sequence)def forward(self, input):"""Standard forward."""print(input.shape)return self.model(input)
参考
https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix/issues/39
https://github.com/ChengBinJin/V-GAN-tensorflow
https://blog.csdn.net/baidu_33256174/article/details/88726427
一文看懂PatchGAN相关推荐
- 一文看懂 AI 训练集、验证集、测试集(附:分割方法+交叉验证)
2019-12-20 20:01:00 数据在人工智能技术里是非常重要的!本篇文章将详细给大家介绍3种数据集:训练集.验证集.测试集. 同时还会介绍如何更合理的讲数据划分为3种数据集.最后给大家介绍一 ...
- 一文看懂计算机视觉-CV(基本原理+2大挑战+8大任务+4个应用)
2020-03-06 20:00:00 计算机视觉(Computer Vision)是人工智能领域的一个重要分支.它的目的是:看懂图片里的内容. 本文将介绍计算机视觉的基本概念.实现原理.8 个任务和 ...
- 一文看懂人脸识别(4个特点+4个实现步骤+5个难点+算法发展轨迹)
2020-03-09 20:01:00 人脸识别是身份识别的一种方式,目的就是要判断图片和视频中人脸的身份时什么. 本文将详细介绍人脸识别的4个特点.4个步骤.5个难点及算法的发展轨迹. 什么是人脸识 ...
- 一文看懂卷积神经网络-CNN(基本原理+独特价值+实际应用)
http://blog.itpub.net/29829936/viewspace-2648775/ 2019-06-25 21:31:18 卷积神经网络 – CNN 最擅长的就是图片的处理.它受到人类 ...
- 【深度学习理论】一文看懂卷积神经网络
[深度学习理论]一文看懂卷积神经网络 https://mp.weixin.qq.com/s/wzpMtMFkVDDH6scVcAdhlA 选自Medium 作者: Pranjal Yadav 经机器之 ...
- python读取excelsheet-一文看懂用Python读取Excel数据
原标题:一文看懂用Python读取Excel数据 导读:现有的Excel分为两种格式:xls(Excel 97-2003)和xlsx(Excel 2007及以上). Python处理Excel文件主要 ...
- 【Python基础】一文看懂 Pandas 中的透视表
作者:来源于读者投稿 出品:Python数据之道 一文看懂 Pandas 中的透视表 透视表在一种功能很强大的图表,用户可以从中读取到很多的信息.利用excel可以生成简单的透视表.本文中讲解的是如何 ...
- angular 字符串转换成数字_一文看懂Python列表、元组和字符串操作
好文推荐,转自CSDN,原作星辰StarDust,感觉写的比自己清晰-大江狗荐语. 序列 序列是具有索引和切片能力的集合. 列表.元组和字符串具有通过索引访问某个具体的值,或通过切片返回一段切片的能力 ...
- 一文看懂深度学习——人工智能系列学习笔记
深度学习有很好的表现,引领了第三次人工智能的浪潮.目前大部分表现优异的应用都用到了深度学习,大红大紫的 AlphaGo 就使用到了深度学习. 本文将详细的给大家介绍深度学习的基本概念.优缺点和主流的几 ...
最新文章
- matplotlib----初探------4折线图
- 定时任务 Crontab命令 详解
- oracle backup arch,一个数据库备份的例子
- 春天重试,因为冬天来了
- uniq 去除重复命令使用方法介绍
- 钉钉关键字回复功能_在家办公首日:钉钉、企业微信集体“崩溃”,只能选择 QQ、微信...
- ASP.NET初级传智播客.net第十季asp.net基础 文字总结(未完)
- Python是否支持短路?
- SAP系统的模块分类
- unity头顶状态制作_Unity中结合IK实现Lookat
- AHA加速器测试,安卓、IOS、windos、mac测试正常
- 30种已验证有效的WordPress博客网上赚钱方法
- 如何将CHM文件翻译成中文
- PacketTracer简单使用】
- python爬虫 - 爬取堆糖图片
- 原神 - 米游社 每日签到
- phalapi做登录检测_Phalapi使用教程
- 计算机云维护是做什么的,IT运维是什么?云时代下的运维人员是怎样的?
- html和php网站哪个好,HTML和PHP网站设计实例
- 新项目中用 C# or Java
热门文章
- [蓝桥杯]最后十天,冲刺进国赛
- 2020-01-15 Vba Union用法
- MFC-490CW 清零正解
- 大数据培训课程Yarn资源调度器作业提交全过程
- 启动3dMax时一直停留在启动屏幕并显示文本“starting 3ds Max…”怎么办?
- webpack 热更新原理解析
- 【头歌】科比投篮预测——可视化与探索性数据分析(一)
- electron-vue 软件自动更新
- 自然语言处理4——TF-IDF及特征提取
- 陕西省2019计算机软考试题,2019湖北襄阳计算机软考程序员考试真题及答案解析...