Jekyll2022-07-13T01:46:25-07:00https://alanyannick.github.io/feed.xmlYangming Wendaily noteYangming Wenymnwen@ucdavis.eduUniversal Style Transfer via Feature Transforms2017-12-24T00:00:00-08:002017-12-24T00:00:00-08:00https://alanyannick.github.io/deep%20learning/UniversalStyleTransfer<p><img src="/assets/posts/2017-12/UniversalStyle11.png" alt="img" /></p>
<p>以下将分为3个部分介绍:</p>
<blockquote>
<ul>
<li>1.提出的background和sense</li>
<li>2.proposal network pipeline</li>
<li>3.results</li>
</ul>
</blockquote>
<h3 id="background"><strong>Background</strong></h3>
<p>先来review一下过去的架构.<br />
1.传统的neural style存在两个巨大的弊端: 调参/耗时。即不仅需要我们对neural style的层级进行大量调参,而且整个迭代过程是对于z噪声进行迭代,非常耗时。</p>
<p><img src="/assets/posts/2017-12/UniversalStyle1.png" alt="img" /></p>
<p>2.即使Texture Net和 Feifei Li在2016的工作中提出在前面承接一个G,将迭代过程变成一个网络来进行泛化style的学习,仍然避免不了调参。</p>
<p>即对于style和content loss 我们仍然需要通过对layer的尝试参数,来得到一个和style较为匹配的表述才能有较好的效果,且针对不同的style这一步骤需要重新training。</p>
<figure>
<img src="/assets/posts/2017-12/UniversalStyle2.png" />
</figure>
<h3 id="sense"><strong>Sense</strong></h3>
<p>因此近期style transfer领域的作者都在思考一件事情,就是来探究是否能够进行泛化的特征style transfer 通过encoder/decoder来进行不需要训练的style transfer。
这篇文章就是一个较好的扩展。</p>
<h3 id="introduction-of-proposal-network-pipeline"><strong>Introduction of proposal network pipeline</strong></h3>
<p>文章提出了一个通用的reconstruction network,能够对任意输入的style进行transfer,而不需要重新训练。
其中主要insight的点在于三个:</p>
<p><strong>1. 提出了WCT层 whitening & coloring transform layer:对于任意一个style image,要能够使得content能够表现出style风格,则只需feature map层级上分布表征一致。</strong></p>
<p><strong>Steps:</strong><br />
(实际和传统的color transfer的方式很相似)</p>
<blockquote>
<p>1.首先将feature map减去均值,然后乘上对自身的协方差矩阵的逆矩阵,进行whitening, 将feature map拉到一个白化的分布空间。<br />
2.然后通过对style image取得image feature map的coloring协方差矩阵,乘上content image
白化后的结果加上mean,即将content图白化后的feature map空间迁移到style图的分布上。<br />
3.不断向上迭代,最后解码出来。</p>
</blockquote>
<p><strong>WCT:</strong></p>
<p><em>Whitening Transform</em></p>
<p><img src="/assets/posts/2017-12/UniversalStyle3.png" alt="img" /></p>
<p><em>Coloring Transform</em></p>
<p><img src="/assets/posts/2017-12/UniversalStyle4.png" alt="img" /></p>
<p><strong>2.训练一个通用的decoder, 对于进行WCT后的feature map能够通用解码。</strong></p>
<blockquote>
<p>(实际和style swap思想基本一致,即训练出多个decoder,能够对于VGG不同层级的feature map进行deconvolution翻译到上一层直至原图,这里的作用为能够对于WCT后的feature map进行统一解码),训练数据是MSCOCO。</p>
</blockquote>
<figure>
<img src="/assets/posts/2017-12/UniversalStyle5.png" />
</figure>
<p>这边的 <strong><em>encoder</em></strong> 和 <strong><em>decoder</em></strong> 训练loss为:<br />
<img src="/assets/posts/2017-12/UniversalStyle6.png" alt="img" /></p>
<p>解释一下和style swap思想一致的训练重建<strong><em>vgg decoder</em></strong>的过程:<br />
L1: 为Decoder - Relu4-1 -> 重建的 Relu5_1 和 VGG-19 Encoder的Relu5_1做loss <strong>(实际为一个有监督过程)</strong> <br />
L2: 为Decoder - Relu4-1 和 通过重建的<strong><em>Relu5_1</em></strong>过<strong><em>VGG-19 Relu5_1</em></strong> 的Encoder后得到Relu4_1的结果做loss 使得<strong><em>Relu 4-1</em></strong> 的监督为一致。 <strong>(实际为一个无监督过程)</strong></p>
<p>因此单层的WCT和训练出的重建encoder可将style结果重建为:</p>
<p><img src="/assets/posts/2017-12/UniversalStyle7.png" alt="img" /></p>
<p><strong>3.作者为了精化效果,采用了多层叠加coarse to fine的思想,类似与上一篇hierarchy multimodel transfer类似的思想来进行style transfer效果的refine.</strong></p>
<figure>
<img src="/assets/posts/2017-12/UniversalStyle8.png" />
</figure>
<p>可以看到效果达到了预期,有了更好的style表现。</p>
<p><img src="/assets/posts/2017-12/UniversalStyle9.png" alt="img" /></p>
<h3 id="results--implement-"><strong>Results & Implement :</strong></h3>
<blockquote>
<p>可以看到结果是不仅不需要调参 且笔触的表现都是非常不错de~ <br />
<img src="/assets/posts/2017-12/UniversalStyle10.png" alt="img" /></p>
<p>结合不同的mask,且不需要style的调优,只需要挑选到好的图就可以进行不错的整体的实时风格迁移和用户交互接口。<br />
<img src="/assets/posts/2017-12/UniversalStyle11.png" alt="img" /></p>
</blockquote>Yangming Wenymnwen@ucdavis.eduMultimodal Transfer: A Hierarchical Deep Convolutional Neural Network for Fast Artistic Style Transfer2017-12-22T00:00:00-08:002017-12-22T00:00:00-08:00https://alanyannick.github.io/deep%20learning/MultiModelStyleTransfer<p><img src="/assets/posts/2017-12/MultimodelTransfer1.png" alt="img" /></p>
<p>以下将分为3个部分介绍:</p>
<blockquote>
<ul>
<li>效果</li>
<li>解決的問題</li>
<li>How to solve it?</li>
</ul>
</blockquote>
<h3 id="1效果"><strong>1.效果:</strong></h3>
<p>先来看一下效果</p>
<p><img src="/assets/posts/2017-12/MultimodelTransfer1.png" alt="img" /></p>
<h3 id="2解决的问题-通用框架下进行style-transfer时候的笔触差异-原始的方法永远会和style差距较大"><strong>2.解决的问题: 通用框架下进行style transfer时候的<em>笔触差异</em> 原始的方法永远会和style差距较大</strong></h3>
<p>和我们之前方案类似 解决不同size下的笔触问题,如下图如果只用256的size去训练较coarse的笔触 或者 用1024的size去训练较fine的笔触 因此单独训练 学出来的结果的<strong><em>笔触</em></strong>会和原图有较大的出入。</p>
<p><img src="/assets/posts/2017-12/MultimodelTransfer2.png" alt="img" /></p>
<h3 id="3how"><strong>3.How?</strong></h3>
<h4 id="easy-way-to-improve-it">Easy way to improve it.</h4>
<hr />
<ol>
<li><strong><em>Trick one</em></strong> 输入图片增加为 RGB + L 然后联合起来训练训练多一个通道的结构,原因是作者认为因为人类对L通道比较敏感 因此L通道可以辅助作为一个较好的信息输入指导。</li>
</ol>
<p><img src="/assets/posts/2017-12/MultimodelTransfer33.jpg" alt="img" /></p>
<p>Tensorflow Block 实现 Detail:</p>
<p><img src="/assets/posts/2017-12/MultimodelTransfer4.png" alt="img" /></p>
<p>2.Trick2 把de-convolution 都换为bilinear upsampling的方式来避免checkerboard</p>
<p><img src="/assets/posts/2017-12/MultimodelTransfer5.png" alt="img" /></p>
<p>3.Trick3 模型迭代refine法 把模型分为三部分来进行训练refine。</p>
<hr />
<p>分别为 <br />
1) <strong><em>Style Subnet(256)</em></strong> 用来捕获 color & texture traits <br />
2) <strong><em>Enhance Subnet(512)</em></strong> 用来做stylization strength <br />
3) <strong><em>Refine Subnet(1024)</em></strong> 用来remove local pixelization artifacts</p>
<p><img src="/assets/posts/2017-12/MultimodelTransfer6.png" alt="img" /></p>
<hr />
<p>Loss组合为:
<img src="/assets/posts/2017-12/MultimodelTransfer7.png" alt="img" /></p>
<p><strong>Scale Basic Loss = Content Loss + Style Loss</strong></p>
<p><img src="/assets/posts/2017-12/MultimodelTransfer8.png" alt="img" /></p>
<p><strong>Combine Loss = a * Scale1 Basic Loss + b * Scale2 Basic Loss + c * Scale3 Basic Loss (a : b : c = 1 : 0.5 : 0.25)</strong></p>
<p><img src="/assets/posts/2017-12/MultimodelTransfer9.png" alt="img" /></p>Yangming Wenymnwen@ucdavis.eduUnderstand Autoencoder(2):Variational Autoencoder2017-05-27T00:00:00-07:002017-05-27T00:00:00-07:00https://alanyannick.github.io/deep%20learning/Understanding-Autoencoder2<p><img src="/assets/posts/2017-05/VAE_Image4.png" alt="img" /></p>
<p>以下将分为6个部分介绍:</p>
<blockquote>
<ul>
<li>vae结构框架</li>
<li>vae与ae区别</li>
<li>提及一下为什么要采样</li>
<li>如何优化</li>
<li>vae应用</li>
<li>vae生成/抽象看待vae学习</li>
</ul>
</blockquote>
<h3 id="1框架"><strong>1.框架:</strong></h3>
<p>先来看一下VAE的结构框架,并先预告一下结论:
VAE 包括 encoder (模块 1)和 decoder(模块 4) 两个神经网络。两者通过模块 2、3 连接成一个大网络。利益于 reparemeterization 技巧,我们可以使用常规的 SGD 来训练网络。</p>
<figure>
<img src="/assets/posts/2017-05/VAE_Image1.png" height="100" />
<figcaption>Figure1.VAE framework.</figcaption>
</figure>
<h3 id="2区别"><strong>2.区别:</strong></h3>
<p>个人认为和ae在本质上的区别在于z code的生成方式,以及loss的定义.
先看一下torch vae中的代码对loss的定义:</p>
<p><img src="/assets/posts/2017-05/VAE_Image2.png" alt="img" /></p>
<p>以及梯度的回传:</p>
<p><img src="/assets/posts/2017-05/VAE_Image3.png" alt="img" /></p>
<p>所以结论为:<br />
1)在ae中,z是encoder直接的显式输出的神经元向量,decoder出来的衡量为距离.<br />
2)在vae中,<strong><em>encoder 的输出(2×m 个数)视作分别为 m 个高斯分布的均值(z_mean)和方差的对数(z_log_var)而输入decoder的z是根据均值和方差生成服从相应高斯分布的随机数的一个向量.</em></strong>对编码器添加约束,就是强迫它产生服从单位高斯分布的潜在变量。正式这种约束,把VAE和标准自编码器给区分开来了。
如下:</p>
<p><img src="/assets/posts/2017-05/VAE_Image4.png" alt="img" />
<img src="/assets/posts/2017-05/VAE_Image5.png" alt="img" /></p>
<p><strong><em>我们计算解码器的loss时,我们就可以从标准差向量中采样,然后加到我们的均值向量上,就得到了编码去需要的潜在变量。</em></strong></p>
<p><img src="/assets/posts/2017-05/VAE_Image6.png" alt="img" /></p>
<p><strong><em>同时,decoder出来的衡量为交叉熵加kl散度:</em></strong></p>
<p><img src="/assets/posts/2017-05/VAE_Image7.png" alt="img" /></p>
<h3 id="3为什么要采样"><strong>3.为什么要采样:</strong></h3>
<p>为了SGD能够使用。</p>
<p>运用了 reparemerization 的技巧。由于 z∼N(μ,σ),我们应该从 N(μ,σ) 采样,<strong><em>但这个采样操作对 μ 和 σ 是不可导的,导致常规的通过误差反传的梯度下降法(GD)不能使用。</em></strong>通过 reparemerization,我们首先从 <strong><em>N(0,1) 上采样 ϵ,然后,z=σ⋅ϵ+μ。这样,z∼N(μ,σ)</em></strong>,而且,从 encoder 输出到 z,只涉及线性操作,(ϵ 对神经网络而言只是常数),因此,可以正常使用 GD 进行优化。</p>
<p><img src="/assets/posts/2017-05/VAE_Image8.png" alt="img" /></p>
<h3 id="4如何优化"><strong>4.如何优化:</strong></h3>
<p>1)首先明确目标:<br />
encoder 和 decoder 组合在一起,我们能够对每个 x∈X,输出一个相同维度的 x̂ 。我们目标是,令 x̂ 与 x 自身尽量的接近。即 x 经过编码(encode)后,能够通过解码(decode)尽可能多的恢复出原来的信息。
(注:严格而言,按照模型的假设,<strong><em>我们要优化的并不是 x 与 x̂ 之间的距离,而是要最大化 x 的似然。</em></strong>即若是encoder/decoder的编码过程中,编码满足的是一个<strong><em>x 与 x̂ 之间最大似然概率分布.</em></strong>)</p>
<p>2)定义损失函数以及约束:<br />
不同的损失函数,对应着不是 p(x|z) 的不同概率分布假设,由于 x∈[0,1],因此,我们用交叉熵(cross entropy)度量 x 与 x̂ 差异,xent 越小,x 与 x̂ 越接近。</p>
<p><img src="/assets/posts/2017-05/VAE_Image9.png" alt="img" /></p>
<p>我们也可以用均方误差来度量,mse 越小,两者越接近。</p>
<p><img src="/assets/posts/2017-05/VAE_Image10.png" alt="img" /></p>
<p>3)训练过程中的附加约束KL散度<br />
训练过程中,输出即是输入,这便是 VAE 中 AE(autoencoder,自编码)的含义。另外,我们需要对 encoder 的输出 z_mean(μ)及 z_log_var(logσ2)加以约束。这里使用的是 KL 散度。</p>
<p><img src="/assets/posts/2017-05/VAE_Image11.png" alt="img" /></p>
<p>4)总的优化目标:</p>
<p><img src="/assets/posts/2017-05/VAE_Image12.png" alt="img" /></p>
<h3 id="5vae应用"><strong>5.vae应用:</strong></h3>
<p>1)相似数据生成:<br />
由于我们指定 p(z) 标准正态分布,再接合已经训练和的 decoder (p(x|z)),就可以进行采样,生成类似但不同于训练集数据的新样本。</p>
<p><img src="/assets/posts/2017-05/VAE_Image13.png" alt="img" /></p>
<p>下图是基于训练出来的 decoder,采样生成的图像x̂ 。
严格来说,生成下图的代码并不是采样,而是 E[x|z] 。伯努力分布和高斯分布的期望,正好是 decocder 的输出 x̂。</p>
<p><img src="/assets/posts/2017-05/VAE_Image14.png" alt="img" /></p>
<p>2)高维数据可视化:<br />
encoder 可以将数据 x,映射到更低维的 z 空间,如果是2维或3维,就可以直观的展示出来。</p>
<p><img src="/assets/posts/2017-05/VAE_Image15.png" alt="img" /></p>
<p>3) 缺失数据补充:<br />
对许多现实问题,样本点的各维数据存在相关性。因此,在部分维度缺失或不准确的情况,有可能通过相关信息得到填补。下图展示一个简单的数据填补的实例。其中,第一行为原图,第二行为人行中间某些像素的缺失图,第三行为利用 VAE 模型恢复的图。</p>
<p><img src="/assets/posts/2017-05/VAE_Image16.png" alt="img" /></p>
<p>4)半监督学习:<br />
相比于高成本的有标注的数据,无标注数据更容易获取。半监督学习试图只用一小部分有标注的数据加上大量无标注数据,来学习到一个较好预测模型(分类或回归)。<br />
VAE 是无监督的,而且也可以学习到较好的特征表征,因此,可以被用来作无监督学习。</p>
<h3 id="6vae学习到的问题抽象"><strong>6.vae学习到的问题抽象:</strong></h3>
<p>1)模型结构类别ae:</p>
<p>从模型结构(以及名字)上看,<strong><em>VAE</em></strong>和<strong><em>自编码器(audoencoder)</em></strong>非常的像。特别的,VAE 和 CAE(constractive AE)非常相似,两者都对隐层输出增加长约束。而 VAE 在隐层的采样过程,起到和 dropout 类似的正则化作用。</p>
<p>2)学习过程中,实际为<strong><em>学习一个分布</em></strong></p>
<p>数据虽然高维,但相似数据可能分布在高维空间的某个流形上(例如下图)。<strong><em>而特征学习就要显式或隐式地学习到这种流形。正是这种流形分布,我们才能从低的隐变量恢复出高维的观测变量。</em></strong>如上面回复mnist数据,相似的隐变量对应的观测变量确实比较像,并且这样相似性是平滑的变化。</p>
<p><img src="/assets/posts/2017-05/VAE_Image17.png" alt="img" /></p>
<p>3) 数据生成的衡量:
举个例子, 当我们计算解码器的loss时,我们就可以从标准差向量中采样,然后加到我们的均值向量上,就得到了编码去需要的潜在变量, 实现如下图:</p>
<p><img src="/assets/posts/2017-05/VAE_Image18.png" alt="img" /></p>
<p>VAE除了能让我们能够自己产生随机的潜在变量,这种约束也能提高网络的产生图片的能力。 <br />
为了更加形象,我们可以认为<strong><em>潜在变量是一种数据的转换</em></strong>。 我们假设我们有一堆实数在区间[0, 10]上,每个实数对应一个物体名字。比如,5.43对应着苹果,5.44对应着香蕉。当有个人给你个5.43,你就知道这是代表着苹果。我们能用这种方法够编码无穷多的物体,因为[0, 10]之间的实数有无穷多个。</p>
<p>但是,如果某人给你一个实数的时候其实是加了高斯噪声的呢?比如你接受到了5.43,原始的数值可能是 [4.4 ~ 6.4]之间的任意一个数,真实值可能是5.44(香蕉)。<br />
如果给的方差越大,那么这个平均值向量所携带的可用信息就越少。现在,我们可以把这种逻辑用在编码器和解码器上。</p>
<p><strong><em>编码越有效,那么标准差向量就越能趋近于标准高斯分布的单位标准差。</em></strong>
(以0为均数、以1为标准差的正态分布,记为N(0,1))
这种约束迫使编码器更加高效,并能够产生信息丰富的潜在变量。这也提高了产生图片的性能。而且我们的潜变量不仅可以随机产生,也能从未经过训练的图片输入编码器后产生。</p>
<hr />
<p><em>reference material: http://blog.csdn.net/jackytintin/article/details/53641885</em></p>Yangming Wenymnwen@ucdavis.eduUnderstand Autoencoder(1):Traditional AE2017-05-21T00:00:00-07:002017-05-21T00:00:00-07:00https://alanyannick.github.io/deep%20learning/Understanding-Autoencoder-AE<p><img src="/assets/posts/2017-05/AE_Image6.png" alt="Image" /></p>
<p>以下将分为4个部分介绍:</p>
<blockquote>
<ul>
<li>ae基本概念</li>
<li>ae训练方式</li>
<li>ae特征如何做分类</li>
<li>ae变体</li>
</ul>
</blockquote>
<h3 id="1先来理解autoencoder的基本概念">1)先来理解autoencoder的基本概念:</h3>
<p>自动编码器其实可以理解为是一种尽可能<strong><em>复现输入信号的神经网络</em></strong>,也可以认为自动编码器是可以像pca那样找到可以表征信息的主要成分,只不过这个过程是通过学习得到的.</p>
<p>Encoder的过程,按照理论上来说<strong><em>这个code其实就是包含了事物丰富的表征信息</em></strong>,而decoder则是<strong>负责解释和翻译这个表征</strong>.所以a/e可以分开训练.</p>
<h3 id="2再来看autoencoder的两种训练方式">2)再来看autoencoder的两种训练方式:</h3>
<p><em>第一种</em> 就是给定无标签数据,进行非监督学习表征</p>
<figure>
<img src="/assets/posts/2017-05/AE_Image1.png" height="200" />
<figcaption>Figure 1 Learning processing of AutoEncoder.</figcaption>
</figure>
<p>如上图,我们将input输入一个encoder编码器,就会得到一个code,这个code也就是输入的一个表示,那么我们怎么知道这个code表示的就是input呢?</p>
<p>我们加一个decoder解码器,这时候decoder就会输出一个信息,那么如果输出的这个信息和一开始的输入信号input是很像的(理想情况下就是一样的),那很明显,我们就有理由相信这个code是靠谱的。所以,我们就通过调整encoder和decoder的参数,使得重构误差最小,这时候我们就得到了输入input信号的第一个表示了,也就是编码code了。因为是无标签数据,所以误差的来源就是直接重构后与原输入相比得到。</p>
<p><em>第二种</em> 通过编码器产生特征,然后训练下一层。这样逐层训练.</p>
<figure>
<img src="/assets/posts/2017-05/AE_Image2.png" height="200" />
<figcaption>Figure 2 Learning processing of AutoEncoder.</figcaption>
</figure>
<p>那上面我们就得到第一层的code,我们的重构误差最小让我们相信这个code就是原输入信号的良好表达了,或者牵强点说,它和原信号是一模一样的(表达不一样,反映的是一个东西)那第二层和第一层的训练方式就没有差别了,我们将第一层输出的code当成第二层的输入信号,同样最小化重构误差,就会得到第二层的参数,并且得到第二层输入的code,也就是原输入信息的第二个表达了。其他层就同样的方法炮制就行了
(训练这一层,前面层的参数都是固定的,并且他们的decoder已经没用了,都不需要了)。</p>
<h3 id="3-再来看一下如何通过上面两种方法ae建立的表征来做分类">3) 再来看一下,如何通过上面两种方法ae建立的表征来做分类:</h3>
<p>既然已经训练好encoder,那么这个网络就可以得到一个良好代表输入的特征,这个特征可以最大程度上复原输入.</p>
<p>那么这个时候我们需要将最后层的特征code输入到最后的分类器,通过有标签样本,通过监督学习进行微调,这也分两种。</p>
<ul>
<li>一个是只调整分类器(黑色部分)</li>
</ul>
<figure>
<img src="/assets/posts/2017-05/AE_Image3.png" height="200" />
<figcaption>Figure 3 Learning processing of AutoEncoder.</figcaption>
</figure>
<ul>
<li>另一种:通过有标签样本,微调整个系统</li>
</ul>
<figure>
<img src="/assets/posts/2017-05/AE_Image4.png" height="200" />
<figcaption>Figure 4 Learning processing of AutoEncoder.</figcaption>
</figure>
<h3 id="4-ae变体">4) AE变体</h3>
<h3 id="sparse-ae"><code class="language-plaintext highlighter-rouge">Sparse AE</code>:</h3>
<p>在ae基础上加上L1约束,限制每次得到的表达尽量稀疏,因为稀疏的表达往往比其他的表达有效</p>
<figure>
<img src="/assets/posts/2017-05/AE_Image5.png" height="200" />
<figcaption>Figure 5 Sparse AE.</figcaption>
</figure>
<h3 id="denoise-ae"><code class="language-plaintext highlighter-rouge">Denoise AE</code>:</h3>
<p>在ae的基础上,输入加入一个噪声,然后让编码器再重新重建出输入,无形中其实就学会了一个去除噪声的能力.</p>
<figure>
<img src="/assets/posts/2017-05/AE_Image6.png" height="200" />
<figcaption>Figure 6 Denoise AE.</figcaption>
</figure>
<hr />
<p><em>reference material: http://blog.csdn.net/u011534057/article/details/53261920</em></p>Yangming Wenymnwen@ucdavis.eduGP-GAN: Towards Realistic High-Resolution Image Blending2017-05-13T00:00:00-07:002017-05-13T00:00:00-07:00https://alanyannick.github.io/deep%20learning/GPGAN<p><img src="/assets/posts/2017-05/GP_GAN.png" alt="img" /></p>
<p><strong><em>About Merging Algorithm:</em></strong></p>
<blockquote>
<p>GP-GAN其实就是将融合任务拆解成了两个部分:<br />
1.让GAN来学会低清晰度上融合后的颜色约束<br />
2.加上poisson融合的梯度约束,来保留高纹理细节</p>
</blockquote>
<h4 id="步骤"><strong>步骤:</strong></h4>
<blockquote>
<p>1) 先用alpha融合后的图取laplacian金字塔的coarsest scale作为输入图,来训练一个GAN让他学会在低清晰度上做融合(GAN高清任务无法克服),得到x_L,再up-sample到x_h的分辨率,并且被输入x的finer scale的laplician金字塔优化。生成的图作为后续融合的颜色约束。<br />
2) 然后再用Gaussian-Poisson 方程进行迭代计算。</p>
</blockquote>
<p><img src="/assets/posts/2017-05/GPGAN_Image1.png" alt="img" /></p>
<h4 id="detail"><strong><em>Detail:</em></strong></h4>
<p>1.训练blending GAN的时候,采用WGAN的方式,不同的是中间层加了个全连接层用于(Fuse the global information)融合全局信息,只是卷积在图像融合task中会缺乏全局信息)<br />
Loss采用 L2作为content loss(文章中说perceptual loss 更好。但是为了快速训练就用了L2) 加上GAN loss</p>
<p><img src="/assets/posts/2017-05/GPGAN_Image2.png" alt="img" /></p>
<p>这里的GAN loss 权重为0.001</p>
<p><img src="/assets/posts/2017-05/GPGAN_Image3.png" alt="img" /></p>
<p>2.在第二次进行融合的时候,用了Gaussian 和 Poisson, 前者常用于提取低频颜色信息,后者用于高频纹理信息,迭代优化cost function:</p>
<p><img src="/assets/posts/2017-05/GPGAN_Image4.png" alt="img" /></p>
<p>beta值就是背景颜色保留度,在这里设为1.</p>
<h4 id="迭代优化过程">迭代优化过程:</h4>
<p>laplacian金字塔提取不同的维度,在不同的金字塔下迭代优化:</p>
<p><img src="/assets/posts/2017-05/GPGAN_Image5.png" alt="img" /></p>
<h4 id="data">Data:</h4>
<p>数据方面用的是同个位置的图像在不同季节,天气,以及一天中不同时间段的图像。<br />
因为groudtruth比较难获取,就选用了要融进去的背景图作为groudtruth,copy-PASTE的作为前景<br />
( (d) false/ (b) true)</p>
<p><img src="/assets/posts/2017-05/GPGAN_Image6.png" alt="img" /></p>
<p>作者还说了,尽管用了中心patch的mask1作为训练,但是还是学到了比较好的网络,当输入为任意的mask时,能够很好的输出结果.
如上图,就是用了标注工具,标注出下面田野作为mask输入,输出图可以学到很好的融合。</p>
<h4 id="对比实验">对比实验:</h4>
<p><img src="/assets/posts/2017-05/GPGAN_Image7.png" alt="img" /></p>
<p>用了copy&paste的图像前的图像作为颜色约束,和用GAN出来的图像作为颜色约束,会更好。</p>
<h4 id="评估方式">评估方式:</h4>
<p>1.用了一个叫做RealismCNN(能分辨出真实还是合成图片的一个网络)的网络来评估。 <br />
<img src="/assets/posts/2017-05/GPGAN_Image8.png" alt="img" /></p>
<p>2.用了AMT来评估:
(输入为要融的前景和背景)、 (输出为结果图)
<img src="/assets/posts/2017-05/GPGAN_Image9.png" alt="img" /> <br />
(poisson融合最低,较好是改良的poisson融合)</p>
<p><img src="/assets/posts/2017-05/GPGAN_Image10.png" alt="img" /></p>
<h4 id="存在问题">存在问题:</h4>
<p>对于远离训练数据集内的数据,生成会有问题,意味着要收集大量场景的数据集。</p>Yangming Wenymnwen@ucdavis.eduGAN:F-GAN/EBGAN/infoGAN/GAN+VAE/catGAN/DCGAN/ImprovedGAN2017-05-01T00:00:00-07:002017-05-01T00:00:00-07:00https://alanyannick.github.io/deep%20learning/GANoverview<p><img src="/assets/posts/2017-05/GAN_Image6.png" alt="img" /></p>
<blockquote>
<p>文章结构: <br />
对比VAE/pixelRNN/GAN缺陷,了解GAN与之相似结构之间存在的缺陷
GAN在2016年的进展方向总结</p>
<ul>
<li>理论框架层面的拓展和改进: f-GAN、EBGAN、infoGAN、GAN+VAE、CatGAN</li>
<li>模型改进: loss方面 perceptual loss</li>
<li>训练技巧: DCGAN、Improved GAN</li>
</ul>
</blockquote>
<h3 id="1对比vaepixelrnn以及gan的缺陷"><strong>1.对比VAE&pixelRNN以及GAN的缺陷:</strong></h3>
<p><strong><em>VAE的缺陷</em></strong>:在最终模拟的概率分布一定会存在一些偏置<br />
<strong><em>pixelRNN的缺陷</em></strong>: 将图像的生成问题转换为像素序列的预测和生成,因此需要对每个像素操作,耗时.</p>
<p><img src="/assets/posts/2017-05/GAN_Image1.png" alt="img" /></p>
<p><strong><em>GAN最大的缺陷</em></strong>: 训练过程中的稳定性和收敛性<br />
其训练过程中的稳定性和收敛性难以保证,在2016年有许多相关工作都在尝试解决其训练稳定性问题。
(模型崩塌问题 model collapsed)</p>
<h3 id="2较为瞩目的工作"><strong>2.较为瞩目的工作:</strong></h3>
<blockquote>
<p>GAN理论层面的改进</p>
<ul>
<li>一类是从第三方的角度,而不是从GAN模型本身,来看待GAN并进行改进和扩展的方法;</li>
<li>第二类是从GAN模型框架的稳定性、实用性等角度出发对模型本身进行改进的工作。</li>
</ul>
</blockquote>
<p><strong><em>f-GAN</em></strong>: 在理解GAN上,将GAN的优化问题求解看作是求解某种divergence的最小化问题。</p>
<p>Detail:</p>
<blockquote>
<p>1)提出一个量化距离标准,f-divergence,包括了常见的多种概率分布的距离度量.<br />
2)作者利用GAN模型框架结合不同度量条件,即不同divergence进行图像生成。<br />
其中,在选择KL散度的度量方式时,对比结果如下图所示,可以看出两者的效果其实相差不大。</p>
</blockquote>
<p><img src="/assets/posts/2017-05/GAN_Image2.png" alt="img" /></p>
<p><strong><em>EBGAN(hinton)</em></strong>: 从能量模型的角度来看待GAN的判别器。</p>
<p>EBGAN将判别器看做是一个能量函数,这个能量函数在真实数据域附近的区域中能量值会比较小,而在其他区域(即非真实数据域区域)都拥有较高能量值。<br />
因此,EBGAN中给予GAN一种能量模型的解释,即生成器是以产生能量最小的样本为目的,而判别器则以对这些产生的样本赋予较高的能量为目的。<br />
<strong><em>网络结构</em></strong>:<br />
D的部分用了AE即z(随机向量)进去G生成图像后,不直接用传统方式的判别器进行判别,
使用了<strong><em>AE重新做一个encoder/decoder,然后对target图算mse的loss。</em></strong></p>
<p><img src="/assets/posts/2017-05/GAN_Image3.png" alt="img" /></p>
<p>EBGAN比GAN展示出了更稳定的性能,也产生出了更加清晰的图像。</p>
<p><img src="/assets/posts/2017-05/GAN_Image4.png" alt="img" /></p>
<p>infoGAN: 加入latent code C来使得训练好的网络在生成时是可控的。</p>
<p>网络结构: 在训练GAN的时候,将随机输入的噪声强行拆解为两部分,其中有一部分的可解释的有隐含意义的c。
c可以对应于笔画粗细、图像光照、字体倾斜度等,用C1,C2,…,CL表示,我们称之为latent code
而z则可以认为是剩下的不知道怎么描述的或者说不能明确描述的信息
目标函数:</p>
<p><img src="/assets/posts/2017-05/GAN_Image5.png" alt="img" /></p>
<p>此时生成器的输出就从原来的G(z)变成了G(z,c);<br />
在学习过程中,为了避免学到一些trivial的latent code而忽略了重要的code,文章对原始的GAN目标函数加了一个约束,
即约束latent code c和生成器的输出G(z,c)之间的互信息I(c;G(z,c))越高越好,以此希望能学到比较重要的<strong><em>有意义的codes c</em></strong></p>
<p><img src="/assets/posts/2017-05/GAN_Image6.png" alt="img" /></p>
<p>实验: latent code确实学到了一些维度,如对应于图像的角度或光照的因素,也即说明InfoGAN确实学习到了数据中的disentangled的可解释部分的表示。</p>
<p>Detail:</p>
<blockquote>
<p>1)潜在编码 latent code c<br />
原来的GAN G的输出为 G(z) 现在改为 G(z,c) / c可以包含多种变量,根据不同的分布<br />
比如在MNIST中,c可以一个值来表示类别,一个高斯分布的值来表示手写体的粗细<br />
2)共同信息 mutual information<br />
如果使用潜在编码c,其实没有监督让网络去使用c。它就往往会被忽略
为了避免这种情况,作者定义了一个熵。作为衡量X,Y两个变量之间 mutual information的程度<br />
I(X;Y) = entropy(X) - entropy(X|Y) = entropy(Y) - entropy(Y|X) 这个值就像条件概率,联系越大的话,这个值应该越小
-新的loss被定义为 old loss - lamda* I(G(z,c);c) 后一项应该需要越来越小。<br />
3)variational mutual information maximisation<br />
就是用一个网络从 G(z,c) 来regress c 可以和D是同一个网络,最后分个叉来回归c。</p>
</blockquote>
<p><strong><em>GAN+VAE: (encoder + decoder/generator)</em></strong> 看做一个产生式模型的整体,从而和最后一个部分 (discriminator) 构成了扩展的GAN模型.</p>
<p>将GAN与其它模型结合,综合利用GAN模型与其它模型的优点来完成数据生成任务。<br />
相当于把G的部分改为AE做编解码</p>
<p><img src="/assets/posts/2017-05/GAN_Image7.png" alt="img" /></p>
<p><strong><em>CatGAN</em></strong>: 增加了一个类别损失的约束,也就是添加<strong><em>少量有label</em></strong>的样本来训练。</p>
<p>对于真实的数据,模型希望判别器不仅能具有较大的确信度将其划分为真实样本,同时还有较大的确信度将数据划分到某一个现有的类别中去;</p>
<p>而对于生成数据却不是十分确定要将其划分到哪一个现有的类别,也就是这个不确信度比较大,从而生成器的目标即为产生出那些“将其划分到某一类别中去”的确信度较高的样本,尝试骗过判别器。<br />
接下来,为了衡量这个确信程度,作者用熵来表示,<strong><em>熵值越大,即为越不确定;而熵值越小,则表示越确定</em></strong>。然后,将该确信度目标与原始GAN的真伪鉴别的优化目标结合,即得到了CatGAN的最终优化目标。</p>
<p>对于半监督的情况,即当部分数据有标签时,那么对有标签数据计算交叉熵损失,而对其他数据计算上面的基于熵的损失,然后在原来的目标函数的基础上进行叠加即得</p>
<p><img src="/assets/posts/2017-05/GAN_Image8.png" alt="img" /></p>
<blockquote>
<p>GAN模型层面的改进</p>
<ul>
<li>主要为perceptual loss, 即feature map特征层面上的L1/L2</li>
</ul>
</blockquote>
<p><strong><em>Perceptual Similarity Metrics (NIPS-2016)</em></strong>: 引入feature map loss / l1 loss / gan loss 一起训练</p>
<p>具体来说,在训练GAN时,除了原始GAN中的对抗训练损失,额外加入了两个损失项,共计三个损失项。<br />
可以看出:</p>
<blockquote>
<p>1)如果没有对抗损失Ladv,产生的结果非常差;<br />
2)如果没有特征空间的损失项Lfeat,会使产生的图像只有大概的轮廓信息,但会丢失许多细节信息;<br />
3)如果没有图像空间损失Limg,最终产生的结果跟有Limg差不多,但在训练的时候没有这一项的话会使网络更容易不稳定;
而同时利用三项loss的结果则可以相对稳定的产生出较为清晰的图像。<br />
<img src="/assets/posts/2017-05/GAN_Image9.png" alt="img" /></p>
</blockquote>
<p>在最近SR的task中,由feature map loss + gan loss + tv loss 基本成为标配.<br />
比如SRCNN中的loss函数:<br />
<img src="/assets/posts/2017-05/GAN_Image10.png" alt="img" /></p>
<blockquote>
<p>GAN训练方式的改进</p>
<ul>
<li>DCGAN</li>
<li>Improved GAN</li>
</ul>
</blockquote>
<p><strong><em>DCGAN:</em></strong></p>
<p>目前GAN系列基本都基于DCGAN进行改进,是目前沿用的比较work的结构标配:</p>
<blockquote>
<p>1) 去掉max pooling<br />
2) 去掉fc层<br />
3) 加入BN<br />
4) generator输出加入tanh, 其他用RELU, discriminator中用leaky ReLU</p>
</blockquote>
<p>Detail:</p>
<p><img src="/assets/posts/2017-05/GAN_Image11.png" alt="img" /></p>
<p><strong><em>Improved GAN:</em></strong></p>
<p>主要做了:</p>
<blockquote>
<p>1) 特征匹配<br />
2) disciminator对比的是一个batch中的差异性。<br />
3) 增加参数约束项<br />
4) 标签设置为0.1 / 0.9 而不是 0, 1<br />
5) 提出了VBN, 相当于设置一个虚拟的集合,不断扩充这个样本空间做BN</p>
</blockquote>
<p>Detail:</p>
<p><img src="/assets/posts/2017-05/GAN_Image12.png" alt="img" /></p>
<hr />
<p><em>reference material: https://mp.weixin.qq.com/s?__biz=MzI1NTE4NTUwOQ==&mid=2650325876&idx=1&sn=5b30f8341f250be0147583b0ad18c689</em></p>Yangming Wenymnwen@ucdavis.eduE-net: A Deep Neural Network Architecture for Real-Time Semantic Segmentation2017-04-15T00:00:00-07:002017-04-15T00:00:00-07:00https://alanyannick.github.io/deep%20learning/E-net<p><img src="/assets/posts/2017-05/enet.png" alt="img" /></p>
<p><strong><em>About Segmentation Task:</em></strong></p>
<blockquote>
<p>在基于segmentation的这类framework上,和neural style(texture net)很相似,(encorder <-> decorder),虽然实际的task不同,但是在某些方面的网络设计和模型压缩时有很多值得去学习和借鉴的地方.</p>
</blockquote>
<h3 id="1introduction"><strong>1.Introduction:</strong></h3>
<p>从FCN网络出来后,基本就奠定了后续基于分割的一套比较通用的framework。即</p>
<p><img src="/assets/posts/2017-05/Enet1.png" alt="img" /></p>
<p>也就是说前端使用FCN使用特征粗提取,后端cascade一个color based segmentation或conditional random fields来优化输出,最后得到分割图。</p>
<hr />
<p>reference materials:
<a href="http://yangmingwen.com/deep%20learning/FCN/">FCN-Fully Convolutional Networks for Semantic Segmentation</a></p>
<hr />
<h3 id="2network-architecture">2.Network architecture:</h3>
<p>image进来先用了一个initial的block,然后就是接带1x1卷积核进行升降维的bottleneck进行3个encoder循环(stage1包含5个bottleneck blocks,stage2/3和stage1一样的结构但是在输入开始部分没有downsamping)和2个decoder(stage4/stage5)设计,最后接一个C(object number)类的fullconv。</p>
<p>整个网络框架如下:<br />
<img src="/assets/posts/2017-05/Enet7.png" alt="img" /> <img src="/assets/posts/2017-05/Enet8.png" alt="img" /></p>
<p>submodule reference:<br />
<img src="/assets/posts/2017-05/Enet9.png" alt="img" />
<img src="/assets/posts/2017-05/Enet10.png" alt="img" /><br />
<img src="/assets/posts/2017-05/Enet11.png" alt="img" />
<img src="/assets/posts/2017-05/Enet12.png" alt="img" /> <br />
<img src="/assets/posts/2017-05/Enet13.png" alt="img" /></p>
<p>值得提到的一点是:作者在实际当中为了减少对kernal呼叫的次数,比如在cudnn中就对卷积和bias使用分离的卷积,和减少全局memory的操作,并未在projections中使用bias。
这样在实测中,并不影响结果的准确度,后续可以借鉴下这个方式来节省一些手机端上的操作。</p>
<p><img src="/assets/posts/2017-05/Enet14.png" alt="img" /></p>
<h3 id="3design-choices">3.Design Choices:</h3>
<p>这部分是论文最精华的部分,作者做了大量的实验来证明为什么最终这样设计出ENet,其中的一些点在相似的task设计中具有很大的参考价值。</p>
<h3 id="drawbacks-and-solutions">Drawbacks And Solutions:</h3>
<h3 id="1-feature-map-resolution">1) Feature map resolution</h3>
<p>在语义分割中的downsampling有两个很明显的缺点:</p>
<blockquote>
<p>1.首先,downsapling其实会造成对空间上边缘形状的一些丢失<br />
2.其次,全pixel级的分割要求最终的输出和输入是一样的分辨率,这样就会导致说,如果我们downsampling过重,就需要相应消耗更多的运算量在upsampling上。<br />
<img src="/assets/posts/2017-05/Enet15.png" alt="img" /></p>
</blockquote>
<p>但是在实际中,对downsmpled后的图像做filters operating的好处是会有更大的receptive field来获得更多的context。
这个对于只需要分辨物体是否属于不同类而言,是比较重要的。比如只需要区分在马路上的行人或者骑手,而不要求看清他们的脸这样的task。
因此,为了达到这样的效果,作者使用了<strong><em>dilated convolutions</em></strong>,这样就在保证网络的感受野的前提下,确保了图像语义分割的精度。</p>
<h3 id="reference-materials-of-dilated-convolutions-">Reference Materials of Dilated Convolutions :</h3>
<p><img src="/assets/posts/2017-05/Enet16.png" alt="img" /></p>
<p>以<code class="language-plaintext highlighter-rouge">3x3</code>的卷积核为例,传统卷积核在做卷积操作时,是将卷积核与输入张量中“连续”的<code class="language-plaintext highlighter-rouge">3x3</code>的patch逐点相乘再求和(如上图a,红色圆点为卷积核对应的输入“像素”,绿色为其在原输入中的感知野)。而dilated convolution中的卷积核则是将输入张量<code class="language-plaintext highlighter-rouge">3x3</code>的patch隔一定的像素进行卷积运算。如上图b所示,在去掉一层池化层后,需要在去掉的池化层后将传统卷积层换做一个“dilation=2”的dilated convolution层,此时卷积核将输入张量每隔一个“像素”的位置作为输入patch进行卷积计算,可以发现这时对应到原输入的感知野已经扩大(dilate)为<code class="language-plaintext highlighter-rouge">7x7</code>;同理,如果再去掉一个池化层,就要将其之后的卷积层换成“dilation=4”的dilated convolution层,如图c所示。</p>
<h3 id="2-early-downsampling">2) Early downsampling</h3>
<p>为了达到一个比较real-time的效果,实际上很明显,就是要减少一开始大图的运算量,然而大部分目前的框架都对这个不够重视。
而且,实际上这时候的视觉信息也是高度冗余的,因此作者提出了在最初的两个block中,大幅度的减少了input image size来压榨出最有效的表征部分。</p>
<h3 id="3-decoder-size">3) Decoder size</h3>
<p>不像segnet这样非常对称的结构,作者在网络设计时,使用更多的encoder,更少的decoder,因为作者认为实际上decoder的作用只是在对encoder的结果学习如何进行upsample,only fine-tuning the details。</p>
<h3 id="4-nonlinear-operations">4) Nonlinear operations</h3>
<p>作者惊讶的发现移除掉网络一开始的layers的ReLUs可以优化结果,因为作者观察到在最初layers上的weights建立了比较大的variance并且对真实的values只有较轻微的biased波动。
(不太理解此部分= =..)</p>
<p><img src="/assets/posts/2017-05/Enet17.png" alt="img" /></p>
<h3 id="5information-preserving-dimensionality-changes">5)Information-preserving dimensionality changes</h3>
<p>实际上,和之前说的早期对输入进行downsample是很有效的,但实际上直接这样激进地做会对信息有影响,所以作者替代了一般卷积后pooling,改为卷积操作的时候将stride设为2,再concate结果的feature map,达到了加速初始<code class="language-plaintext highlighter-rouge">block 10倍</code>的效果。</p>
<p>同时作者还发现了在原始ResNet框架上的一个问题:
就是当downsampling的时候,在卷积上第一个1x1 projection在dimensions上以2x2的stride可以有效的抛弃掉75%的输入。
如果增加filter的size到<code class="language-plaintext highlighter-rouge">2x2</code>,我们就能够将所有的输入考虑进来,以此来改善information flow和准确率。</p>
<p><img src="/assets/posts/2017-05/Enet18.png" alt="img" /></p>
<h3 id="6factorizing-filters">6)Factorizing filters</h3>
<p>作者在这边选择用了factorizing filters的方式,来尽量降低不同卷积之间weights冗余性。而且同时,bottleneck module的结构 (projection, convolution, projection),实际上也是在对一个大的卷积层进行一个分解。所以,可以理解为这样的一个结构实际上最大化了模型的能力。</p>
<h3 id="performance-analysis">Performance Analysis:</h3>
<p>最终ENet达到了<strong><em>18x的加速,79x less参数</em></strong>`,并且达到了和现在模型相似或更好的结果。</p>
<p><img src="/assets/posts/2017-05/Enet19.png" alt="img" /> <br />
<img src="/assets/posts/2017-05/Enet20.png" alt="img" /></p>
<p>最终,设计出来的ENet基本可以达到接近于real time..真是又好又快又小阿.. :)))</p>Yangming Wenymnwen@ucdavis.eduFCN: Fully Convolutional Networks for Semantic Segmentation2017-03-31T00:00:00-07:002017-03-31T00:00:00-07:00https://alanyannick.github.io/deep%20learning/FCN<p><img src="/assets/posts/2017-05/Enet6.png" alt="img" /></p>
<h3 id="reference-materials-of-fully-convolutional-networks"><strong><em>Reference Materials of Fully Convolutional Networks:</em></strong></h3>
<p>这里简略地对fcn这篇文章的keypoint做个快速的总结,加深对fcn的一个理解:</p>
<p><img src="/assets/posts/2017-05/ENet2.png" alt="img" /></p>
<p>一、简单的介绍一下上图的实际含义,我们已经有一个CNN模型,首先要把CNN的全连接层看成是卷积层,卷积模板大小就是输入的特征map的大小,也就是说把全连接网络看成是对整张输入map做卷积,全连接层分别有4096个<code class="language-plaintext highlighter-rouge">6*6</code>的卷积核,4096个<code class="language-plaintext highlighter-rouge">1*1</code>的卷积核,1000个<code class="language-plaintext highlighter-rouge">1*1</code>的卷积核,接下来就要对这1000个<code class="language-plaintext highlighter-rouge">1*1</code>的输出,做<code class="language-plaintext highlighter-rouge">upsampling</code>,得到1000个原图大小(如32*32)的输出,这些输出合并后,得到上图所示的<code class="language-plaintext highlighter-rouge">heatmap</code>。</p>
<p>二、那么如何通过upsampling得到dense prediction呢,在Fully Convolutional Networks for Semantic Segmentation这篇论文中,提到了大概三种方案。</p>
<h3 id="1shift-and-stitch">1)Shift-and-Stitch:</h3>
<p>设原图与FCN所得输出图之间的降采样因子是f,那么对于原图的每个f<em>f的区域(不重叠)</em><strong>“shift the input x pixels to the right and y pixels down for every (x,y) ,0 < x,y < f.”</strong>*
把这个<code class="language-plaintext highlighter-rouge">f*f</code>区域对应的output作为此时区域中心点像素对应的output,这样就对每个<code class="language-plaintext highlighter-rouge">f*f</code>的区域得到了<code class="language-plaintext highlighter-rouge">f^2个output</code>,也就是每个像素都能对应一个output,所以成为了<code class="language-plaintext highlighter-rouge">dense prediction</code>。</p>
<h3 id="2filter-rarefaction">2)Filter rarefaction:</h3>
<p><strong><em>就是放大CNN网络中的subsampling层的filter的尺寸,得到新的filter</em></strong></p>
<p><img src="/assets/posts/2017-05/Enet3.png" alt="img" /></p>
<p>其中s是subsampling的滑动步长,这个新filter的滑动步长要设为1,这样的话,subsampling就没有缩小图像尺寸,最后可以得到dense prediction。</p>
<p>以上两种方法作者都没有采用,主要是因为这两种方法都是trad-off的,原因是:</p>
<blockquote>
<p>1.对于第一种方法,虽然receptive fileds没有变小,但是由于原图被划分成f*f的区域输入网络,使得filters无法感受更精细的信息。<br />
2.对于第二种方法, 下采样的功能被减弱,使得更细节的信息能被filter看到,但是receptive fileds会相对变小,可能会损失全局信息,且会对卷积层引入更多运算。<br />
3.实现反卷积层:其实就是upsamping,只不过其中卷积运算的参数和CNN的参数一样是在训练FCN模型的过程中通过bp算法学习得到。</p>
<p><img src="/assets/posts/2017-05/Enet4.png" alt="img" /></p>
</blockquote>
<h3 id="3实现反卷积层其实就是upsamping只不过其中卷积运算的参数和cnn的参数一样是在训练fcn模型的过程中通过bp算法学习得到">3)实现反卷积层:其实就是upsamping,只不过其中卷积运算的参数和CNN的参数一样是在训练FCN模型的过程中通过bp算法学习得到。</h3>
<p><img src="/assets/posts/2017-05/fcn.png" alt="img" /></p>
<p><strong><em>tricks:</em></strong></p>
<p><img src="/assets/posts/2017-05/Enet5.png" alt="img" /></p>
<p>以上是对CNN的结果做处理,得到了dense prediction,而作者在试验中发现,得到的分割结果比较粗糙,所以考虑加入更多前层的细节信息,也就是把倒数第几层的输出和最后的输出做一个fusion,实际上也就是加和。这个trick实际上在很多task都可以参考, 分割任务上CVPR去年排名最好的<code class="language-plaintext highlighter-rouge">PSPNet</code>和<code class="language-plaintext highlighter-rouge">ICNNet</code>等分割网络就是延续并拓展了类似的思想。</p>
<p>这样就得到第二行和第三行的结果,实验表明,这样的分割结果更细致更准确。在逐层fusion的过程中,做到第三行再往下,结果又会变差,所以作者做到这里就停了。可以看到如上三行的对应的结果:</p>
<p><img src="/assets/posts/2017-05/Enet6.png" alt="img" /></p>
<p>最后顺带提一下发展,从FCN之后,依次发展出了segnet/deconvnet的对称结构,以及deeplab通过设计atrous convolution来提高感受野。
这篇文章,就是在这些发展基础上,提出了称之为enet的一个快速,紧凑的模型,请看我下一篇的解析~
<a href="http://yangmingwen.com/deep%20learning/E-net/">E-net:A Deep Neural Network Architecture for Real-Time Semantic Segmentation</a></p>
<hr />
<p><em>reference material: http://blog.csdn.net/tangwei2014/article/details/46882257</em></p>
<hr />Yangming Wenymnwen@ucdavis.eduDeep Learning for Beginners2016-03-19T06:20:55-07:002016-03-19T06:20:55-07:00https://alanyannick.github.io/posts/2016/03/deep-learning-for-beginners<figure>
<img src="/assets/posts/2016-03-01-deep-learning-for-beginners/artificialintelligence-1200x673.jpg" height="120" />
<figcaption>AI Time.</figcaption>
</figure>
<h1 id="introduction">Introduction</h1>
<p><em>Deep learning</em>(deep structured learning, hierarchical learning or deep machine learning) is a
branch of machine learning based on a set of algorithms that attempt to model high-level abst
-ractions in data by using multiple processing layers, with complex structures or otherwise,
composed of multiple non-linear transformations.</p>
<p>Here are some references about learning procedures <em>from the perspective of beginners</em> and sharing
some resoures with deep learning about how beginners learned step by step.</p>
<hr />
<p><em>*If there are some more better suggestions,please add following and help make it better :)</em></p>
<hr />
<h2 id="table-of-contents">Table of Contents</h2>
<ul>
<li><a href="## Step-One:Mainly-build-up-the-basic-sense of-deep-learning">Step one: Mainly build up the basic sense of deep learning</a></li>
<li><a href="## Step two: Notes of Basic Reference Paper for the beginners">Step two: Notes of Basic Reference Paper for the beginners</a></li>
<li><a href="## Step three :Install caffe and train your own model">Step three : Install caffe and train your own model</a></li>
</ul>
<hr />
<h2 id="step-one-mainly-build-up-the-basic-sense-of-deep-learning">Step one: Mainly build up the basic sense of deep learning</h2>
<p><strong>[1].<a href="http://deeplearning.net/tutorial/">Deep Learning Notes</a></strong>
<em>you can learn some basic senses about the deep learning</em></p>
<blockquote>
<p><em>Including:</em></p>
<ul>
<li>AutoEncoder</li>
<li>Sparse Coding</li>
<li>Restricted Boltzmann Machine(RBM)</li>
<li>Deep BeliefNetworks</li>
<li>Convolutional Neural Networks</li>
</ul>
</blockquote>
<hr />
<p><strong>[2].<a href="http://handong1587.github.io/deep_learning/2015/10/09/dl-resources.html">Beginner Reference Papers and Books</a></strong></p>
<blockquote>
<p><em>Including:</em></p>
<ul>
<li>AlexNet</li>
<li>GoogLeNet</li>
<li>VGGNet</li>
<li>Inception-v3</li>
<li>ResNet</li>
<li>Tensor</li>
<li>Inception-v4</li>
</ul>
</blockquote>
<hr />
<p><strong>[3].<a href="https://medium.com/@jiefeng/deep-learning-playbook-c5ebe34f8a1a#.de7sdog46">The Deep Learning Playbook</a></strong></p>
<blockquote>
<p><em>Including:</em></p>
<ul>
<li>Libraries:
<ul>
<li>Theano (Python)</li>
<li>Libraries based on Theano: Lasagne, Keras, Pylearn2</li>
<li>Caffe (C++, with Python wrapper)</li>
<li>TensorFlow (Python, C++)</li>
<li>Torch (Lua)</li>
<li>ConvNetJS (Javascript)</li>
<li>Deeplearning4j (Java)</li>
<li>MatConvNet (Matlab)</li>
</ul>
</li>
<li>Projects / Demos:
<ul>
<li>All the tutorials of your favorite library above</li>
<li>Facial Keypoint Detection</li>
<li>Deep Dream</li>
<li>Eyescream</li>
<li>Deep Q-network (Atari game player)</li>
<li>Caffe to Theano Model Conversion (use Caffe pretrained model in Lasagne)</li>
<li>R-CNN</li>
<li>Fast R-CNN</li>
<li>Plankton Classification (winning solution of National Data Science Bowl on Kaggle)</li>
<li>Galaxy Classification (winning solution of Kaggle competition)</li>
<li>University of Toronto Demos</li>
</ul>
</li>
</ul>
</blockquote>
<hr />
<p><strong>[4].<a href="">Recommandated Coures</a></strong></p>
<ul>
<li><a href="http://ufldl.stanford.edu/wiki/index.php/UFLDL%E6%95%99%E7%A8%8B">UFLDL Tutorial</a></li>
<li><a href="https://www.udacity.com/course/deep-learning--ud730">Deep Learning</a> Google,<em>2016</em></li>
<li>More mathematics theory
<ul>
<li><a href="http://open.163.com/special/opencourse/machinelearning.html">Machine Learning</a> -Andrew Ng(Stanford University) <em>2009</em></li>
</ul>
</li>
<li>More exact examples
<ul>
<li><a href="https://www.coursera.org/learn/machine-learning">Machine Learning</a> -Andrew Ng(Stanford University) <em>2013</em></li>
</ul>
</li>
<li><a href="http://www.holehouse.org/mlclass/index.html#rd?sukey=a76cdd086edb4fceeba6855d8cdc98e809b8e2de04f94287cd100e38c8613eeea53e85523426c14a2317157c43f93878">Good Notes of Standford Machine Learning</a></li>
<li><a href="http://cs231n.stanford.edu/">CS231n: Convolutional Neural Networks for Visual Recognition</a> - Fei-Fei Li and Andrej Karpathy (Stanford University) <em>2016</em></li>
<li><strong>If you wanna learn more deeply reference coureses,please refer to the Coureses of WIKI PAGE <a href="http://techgit.meitu.com/TechArchive/MTKG/wikis/awesomecvresources">awesomecvresources</a></strong></li>
</ul>
<hr />
<p><strong>[5].<a href="http://deeplearning.net/">Deep Learning Reference Website</a></strong></p>
<p>As comparing to the traditional feature extraction,here are some basic and useful papers on computer vision:</p>
<blockquote>
<p><em>Including:</em></p>
<ul>
<li>SIFT <a href="http://www.cs.ubc.ca/~lowe/papers/iccv99.pdf">Lowe ‘99</a></li>
<li>Spin Images <a href="https://www.ri.cmu.edu/pub_files/pub2/johnson_andrew_1997_3/johnson_andrew_1997_3.pdf">Johnson & Herbert ‘99</a></li>
<li>Textons <a href="http://www.cs.berkeley.edu/~malik/papers/LM-3dtexton.pdf">Malik et al. ‘99</a></li>
<li>RIFT <a href="https://hal.inria.fr/inria-00548530/document">Lazebnik ‘04</a></li>
<li>GLOH <a href="http://lear.inrialpes.fr/pubs/2005/MS05/mikolajczyk_pami05.pdf">Mikolajczyk & Schmid ‘05</a></li>
<li>HoG <a href="http://lear.inrialpes.fr/people/triggs/pubs/Dalal-cvpr05.pdf">Dalal & Triggs ‘05</a></li>
<li>SURF <a href="http://www.vision.ee.ethz.ch/~surf/eccv06.pdf">Bay et al. ‘06</a></li>
<li>ImageNet <a href="http://www.cs.toronto.edu/~fritz/absps/imagenet.pdf">Krizhevsky ‘12</a></li>
</ul>
</blockquote>
<hr />
<h1 id="step-two-notes-of-basic-reference-paper-for-the-beginners">Step two: Notes of Basic Reference Paper for the beginners</h1>
<hr />
<p><strong><a href="http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf">AlexNet:ImageNet Classification with Deep Convolutional Neural Networks</a></strong></p>
<p><strong>1.Testing dataset of this paper</strong> -> 1.2 million training images, 50,000 validation images, and
150,000 testing images(ILSVRC-2010)</p>
<p><em>results:</em></p>
<p>ILSVRC-2010
<img src="http://upload-images.jianshu.io/upload_images/1792431-b181a2b0a51e0ff4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="Paste_Image.png" />
ILSVRC-2012
<img src="http://upload-images.jianshu.io/upload_images/1792431-1084dbfa99832500.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="Paste_Image.png" /></p>
<p><strong>2.architectecture</strong></p>
<p><img src="http://upload-images.jianshu.io/upload_images/1792431-4a7faf189aa2e4c0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="Paste_Image.png" /></p>
<p><strong>3.ReLU Nonlinearity</strong></p>
<p>Following Nair and Hinton [20],this paper refers to neurons with this nonlinearity as Rectified Linear Units (ReLUs). Deep convolutional neural networks with ReLUs train several times faster than their equivalents with tanh units.</p>
<p><img src="http://upload-images.jianshu.io/upload_images/1792431-1992c2ec0fd2bbf2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="Paste_Image.png" /></p>
<p>(On this dataset the primary concern is preventing overfitting, so the effect they are observing is different from the accelerated ability to fit the training set which we report when using ReLUs)</p>
<p><em>[20] V. Nair and G. E. Hinton. Rectified linear units improve restricted boltzmann machines. In Proc. 27th
International Conference on Machine Learning, 2010</em></p>
<p><strong>4.Local Response Normalization</strong></p>
<p>ReLUs have the desirable property that they do not require input normalization to prevent them from saturating.Response normalization reduces our top-1 and top-5 error rates by 1.4% and 1.2%,respectively</p>
<p><strong>5.Overlapping Pooling</strong></p>
<p>This scheme reduces the top-1 and top-5 error rates by 0.4% and 0.3%, respectively, as compared with the non-overlapping scheme s = 2, z = 2, which produces output of equivalent dimensions</p>
<p><strong>6.two primary ways for combating overfitting</strong></p>
<p>This neural network architecture has 60 million parameters,therefore,combat overfitting is a important problem</p>
<ul>
<li>
<p><em>Data Augmentation:</em></p>
</li>
<li>
<p>The first form of data augmentation consists of generating image translations and horizontal reflections</p>
</li>
<li>The second form of data augmentation consists of altering the intensities of the RGB channels in training images</li>
<li><em>Dropout</em></li>
<li>consists of setting to zero the output of each hidden neuron with probability 0.5,The neurons which are “dropped out” in this way do not contribute to the forward pass and do not participate in backpropagation.So every time an input is presented, the neural network samples a different architecture,but all these architectures share weights. This technique reduces complex co-adaptations of neurons,since a neuron cannot rely on the presence of particular other neurons.</li>
<li><em>note:this paper recommand to use dropout in the first two fully-connected layers of figure architecture</em></li>
</ul>
<p>more basic papers are waiting for adding…</p>
<hr />
<h2 id="step-three---install-caffe-and-train-your-own-model">Step three : Install caffe and train your own model</h2>
<hr />
<p>How to install caffe on winodws:<a href="/uploads/4c01fb55d8d532b386cadfd4a8202a1b/Window下安装caffe在vs2013条件下.pdf">Windows install caffe on VS2013.pdf</a></p>
<p>Recommend example:<a href="http://caffe.berkeleyvision.org/gathered/examples/cifar10.html">Alex’s CIFAR-10 tutorial, Caffe style</a></p>
<p>If you wanna try more examples,please refer to the example page of <a href="http://caffe.berkeleyvision.org/">caffe</a></p>
<p>Step by step:</p>
<blockquote>
<p><em>Including:</em></p>
<ul>
<li>1.preparing your dataset</li>
<li>2.writing the solver file</li>
<li>3.defining your own model network</li>
<li>4.Training and Testing the Model</li>
<li>5.Observing the results.</li>
</ul>
</blockquote>Yangming Wenymnwen@ucdavis.eduAI Time.Nice Tool for Caffe Framework Visualizatrion2016-03-01T08:22:08-08:002016-03-01T08:22:08-08:00https://alanyannick.github.io/tools%20of%20deep%20learning/Nice-Tool-for-Caffe-Framework-Visualizatrion<p>[ToolsVisualization]http://ethereon.github.io/netscope/#/editor</p>
<h5 id="if-you-put-the-caffe-prototxt-into-thisafter-pushing-shiftenteryou-can-get-the-following-picture">if you put the caffe prototxt into this,after pushing “shift+enter”,you can get the following picture.</h5>
<ol>
<li>Input Caffe Net</li>
<li>Press shift+enter and get the result</li>
</ol>
<p>Example in the hello world, copy and paste :)</p>
<hr />Yangming Wenymnwen@ucdavis.edu[ToolsVisualization]http://ethereon.github.io/netscope/#/editor if you put the caffe prototxt into this,after pushing “shift+enter”,you can get the following picture.