for basic discriminator of GANs

判别器用于感知生成器产生的合成图片和ground-truth的差异,并旨在实现区分出fake or real;

同时,判别器的输出也是经过一系列的conv后得到的一个标量值,一般使这个值激活在0~1之间;

但是,这样的结果存在着一些问题:

  1.输出的结果显然是一个整体图片的加权值,无法体现局部图像的特征,对于精度要求高的的图像迁移等任务比较困难。

for Patch-based discriminator of GANs

PatchGAN的思路是最后的输出不是一个标量值,而是一个$N*N$的矩阵$X$,其实$X_{ij}$表示patch $ij$是fake or real. 

关键点就是:在$X$上的一个神经元$X_{ij}$可以表示一块输入patch,这个神经元就对这块patch的像素敏感,这块patch 就是 输出$X_{ij}$的感知域(receptive field).

1.这样方法 通过每个patch 进行差别的判别, 实现了局部图像特征的提取和表征, 有利于实现更为高分辨率的图像生产;同时, 对最后的 分类特征图进行平均后, 也能够实现相比

2.单标量输出的更为精确的整体差异表示,相当于对整体进行加权求和平均,对于某些特征差异大的局部图像特征, 能够实现比basic D 更为合理的 损失表示。

3.这种机制,将局部图像特征和整体图像特性相融合。

Mathematical:

有个解决办法就是将图像裁剪成多个重叠的patches,分别进行判别器的差异识别,并对得到的结果进行平均,但是这样存在大的运算消耗。

Obviously,卷积神经网络的强大之处在于,它们能以相同的方式独立地处理每个图像块,所以在最后的实际过程中,得到的输出矩阵的每一神经元相当于就是在执行每个patch的单独判断的结果,这样的结果具有高效的运算效果。

The size of receptive field:

堆叠不同层的convnets, 最后输出矩阵的单个神经元的表征的感知域的大小显然不一样;感知域越大,这意味着它应该学习距离更远的对象之间的关系

empirical, 层数越深, 能够感知的patch的尺寸也越大,但是这样会付出更多的计算成本和时间消耗,所以需要通过traceback:

function receptive_field_sizes()

% compute input size from a given output size
f = @(output_size, ksize, stride) (output_size - 1) * stride + ksize; %% n=1 discriminator % fix the output size to 1 and derive the receptive field in the input
out = ...
f(f(f(1, 4, 1), ... % conv2 -> conv3
4, 1), ... % conv1 -> conv2
4, 2); % input -> conv1 fprintf('n=1 discriminator receptive field size: %d\n', out); %% n=2 discriminator % fix the output size to 1 and derive the receptive field in the input
out = ...
f(f(f(f(1, 4, 1), ... % conv3 -> conv4
4, 1), ... % conv2 -> conv3
4, 2), ... % conv1 -> conv2
4, 2); % input -> conv1 fprintf('n=2 discriminator receptive field size: %d\n', out); %% n=3 discriminator % fix the output size to 1 and derive the receptive field in the input
out = ...
f(f(f(f(f(1, 4, 1), ... % conv4 -> conv5
4, 1), ... % conv3 -> conv4
4, 2), ... % conv2 -> conv3
4, 2), ... % conv1 -> conv2
4, 2); % input -> conv1 fprintf('n=3 discriminator receptive field size: %d\n', out); %% n=4 discriminator % fix the output size to 1 and derive the receptive field in the input
out = ...
f(f(f(f(f(f(1, 4, 1), ... % conv5 -> conv6
4, 1), ... % conv4 -> conv5
4, 2), ... % conv3 -> conv4
4, 2), ... % conv2 -> conv3
4, 2), ... % conv1 -> conv2
4, 2); % input -> conv1 fprintf('n=4 discriminator receptive field size: %d\n', out); %% n=5 discriminator % fix the output size to 1 and derive the receptive field in the input
out = ...
f(f(f(f(f(f(f(1, 4, 1), ... % conv6 -> conv7
4, 1), ... % conv5 -> conv6
4, 2), ... % conv4 -> conv5
4, 2), ... % conv3 -> conv4
4, 2), ... % conv2 -> conv3
4, 2), ... % conv1 -> conv2
4, 2); % input -> conv1 fprintf('n=5 discriminator receptive field size: %d\n', out);

实际模型搭建

显然,是需要堆积多个convnets即可实现PatchGAN的判别器, PatchGAN更多的将它理解为一种机制mechanism,其实整个模型就是一个FCN结构

对于不同的感知域,肯定在D中表征为有不同的convnet层, torch:

function defineD_n_layers(input_nc, output_nc, ndf, n_layers)
if n_layers==0 then
return defineD_pixelGAN(input_nc, output_nc, ndf)
else local netD = nn.Sequential() -- input is (nc) x 256 x 256
netD:add(nn.SpatialConvolution(input_nc+output_nc, ndf, 4, 4, 2, 2, 1, 1)) module = nn.SpatialConvolution(nInputPlane, nOutputPlane, kW, kH, [dW], [dH], [padW], [padH]) netD:add(nn.LeakyReLU(0.2, true)) local nf_mult = 1
local nf_mult_prev = 1
for n = 1, n_layers-1 do
nf_mult_prev = nf_mult
nf_mult = math.min(2^n,8)
netD:add(nn.SpatialConvolution(ndf * nf_mult_prev, ndf * nf_mult, 4, 4, 2, 2, 1, 1))
netD:add(nn.SpatialBatchNormalization(ndf * nf_mult)):add(nn.LeakyReLU(0.2, true))
end -- state size: (ndf*M) x N x N
nf_mult_prev = nf_mult
nf_mult = math.min(2^n_layers,8)
netD:add(nn.SpatialConvolution(ndf * nf_mult_prev, ndf * nf_mult, 4, 4, 1, 1, 1, 1))
netD:add(nn.SpatialBatchNormalization(ndf * nf_mult)):add(nn.LeakyReLU(0.2, true))
-- state size: (ndf*M*2) x (N-1) x (N-1)
netD:add(nn.SpatialConvolution(ndf * nf_mult, 1, 4, 4, 1, 1, 1, 1))
-- state size: 1 x (N-2) x (N-2) netD:add(nn.Sigmoid())
-- state size: 1 x (N-2) x (N-2) return netD
end
end9

一些思考 future works

1.PatchGAN的整个机制的核心在于对 G网络结果的优化,优化了类似U-net的结构(encoder-decoder的架构),使得低阶信息跨越bottleneck,让更多的低阶信息得以交换,

并让G的训练有如同  Res-block般的平缓梯度,一定程度上减缓了梯度消失, 我们知道Resnet较为好的解决了多层convnet堆叠后的训练困难的问题,其类似于放大器的结构,让训练

更为的有效。

2.由于patches的重叠性和局部特征性,对于不同的任务, patches之间的局部特征的相关性肯定存在差异, 所以对于感知域的尺寸确定需要有差异性和动态性,才能实现较为好的性能。

3.对于G 来说, 其解码过程其实使用的是微步幅卷积操作或叫做反卷积操作,但是反卷积操作其实对于图像的产生是存在着争议性的,改善和提高这个部分,具有一点的前景, 可以采用

多个的feature map进行重叠作为输入的操作, 得到一个多层特征图, 尝试直接使用一个下采样卷积作为一个生成器。

4.对于CGANs 机制的引入, 其实是使得 GAN的训练更加稳定, 进行有约束的执行generative 任务, 进行加 buff的 判别的任务。

对PatchGAN的感知域(receptive_field)理解的更多相关文章

  1. 载域和运行域的理解(ARM程序是怎么运行的)

    对ARM加载域和运行域的理解 一般而言,一个程序包括只读的代码段和可读写的数据段.在ARM的集成开发环境中,只读的代码段和常量被称作RO段(ReadOnly):可读写的全局变量和静态变量被称作RW段( ...

  2. 同源策略引发对跨域jsonp跨域的理解

    一,同源策略其实网络的安全基石,既:http://www.baidu.com:80协议(http或者HTTPS或者ws或者wss).域名(www.baidu.com).端口(默认80,可以不写 htt ...

  3. cors跨域深刻理解

    1.跨域问题只出现在前端和后端不在同一个主机上.前后端在同一个主机上不会出现跨域问题. 2.浏览器的一种自我保护机制,不允许出现本地浏览器ajax异步请求访问127.0.0.1以外的系统,因为浏览器不 ...

  4. request 域 个人理解

    1.转发到另一个servlet时候 地址还是输入当前的servlet 2.通过服务器转到另一个servlet时候 另一个servlet是最终接收端 端到端模式 相当于这个东西是发给自己的 只不过经过多 ...

  5. js 跨域深入理解与解决方法

    参考博客: https://www.cnblogs.com/2050/p/3191744.html

  6. Aleax prize (开放域聊天系统比赛)2018冠军论文阅读笔记

    Abstract Gunrock是一种社交机器人,旨在让用户参与开放域的对话.我们使用大规模的用户交互数据来迭代地改进了我们的机器人,使其更具能力和人性化.在2018年Alexa奖的半决赛期间,我们的 ...

  7. thinkphp如何一次性的上传多个文件,在文件域中可以多选?

    可以做到类似于某度网盘的样式吗? 文件夹的命名, 可以用单数, 也可以用复数, 在同一个项目中, 只要统一就好了. 毕竟项目开发不同于英语写作. 建议使用缩写, 不管是不是缩写都用单数, 这样简洁,容 ...

  8. AJAX跨域完全讲解

    AJAX跨域完全讲解 今天在慕课网上学习了AJAX跨域完全讲解:https://www.imooc.com/learn/947 我在收集AJAX面试题的时候其实就已经有过AJAX跨域的问题的了,当时候 ...

  9. (1)Deep Learning之感知器

    What is deep learning? 在人工智能领域,有一个方法叫机器学习.在机器学习这个方法里,有一类算法叫神经网络.神经网络如下图所示: 上图中每个圆圈都是一个神经元,每条线表示神经元之间 ...

随机推荐

  1. day56:django:csrf_token&文件上传

    目录 1.csrf介绍 2.django实现csrf_token认证 3.django实现文件上传 csrf介绍 什么是csrf? csrf:跨站请求伪造.攻击者通过HTTP请求将数据传送到服务器,从 ...

  2. 【译】使用 WebView2 将最好的 Web 带到 .NET 桌面应用程序中

    在去年的 Build 大会上,我们引入了 WebView2,这是一个浏览器控件,可以用新的基于 Chrome 的 Microsoft Edge 来呈现 Web 内容(HTML / CSS / Java ...

  3. 极简 Node.js 入门 - 4.4 可写流

    极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...

  4. springboot的启动流程源码分析

    .测试项目,随便一个简单的springboot项目即可: 直接debug调试: 可见,分2步,第一步是创建SpringApplication对象,第二步是调用run方法: 1.SpringApplic ...

  5. MySQL 5.7安装与配置

    Windows 一.到MySQL官网下载压缩版本,下载后文件为mysql-5.7.20-winx64.zip,解压到D:\develop\mysql-5.7.20-winx64.   二.在系统变量P ...

  6. helm部署的服务如何修改配置

    关于helm部署服务 在Kubernetes上进行容器化部署时,使用helm可以简化操作,以部署Jenkins为例,只需要以下命令即可完成部署: helm install --namespace he ...

  7. 002 01 Android 零基础入门 01 Java基础语法 01 Java初识 02 Java简介

    002 01 Android 零基础入门 01 Java基础语法 01 Java初识 02 Java简介 学习Java的基础语法 Java是一门编程语言,学习的逻辑其实和现实世界的语言是一样的,需要了 ...

  8. Java知识系统回顾整理01基础04操作符06三元运算符

    一.三元运算符 表达式?值1:值2 如果表达式为真 返回值1 如果表达式为假 返回值2 if语句学习链接:if语句 public class HelloWorld { public static vo ...

  9. 利用TfidfVectorizer进行中文文本分类(数据集是复旦中文语料)

    1.对语料进行分析 基本目录如下: 其中train存放的是训练集,answer存放的是测试集,具体看下train中的文件: 下面有20个文件夹,对应着20个类,我们继续看下其中的文件,以C3-Art为 ...

  10. [学习笔记] Tarjan算法求强连通分量

    今天,我们要探讨的就是--Tarjan算法. Tarjan算法的主要作用便是求一张无向图中的强连通分量,并且用它缩点,把原本一个杂乱无章的有向图转化为一张DAG(有向无环图),以便解决之后的问题. 首 ...