卷积神经网络CNN理论到实践(3)

来源:互联网 发布:长期避孕药 知乎 编辑:程序博客网 时间:2024/06/05 06:05

  • 导读
  • 各种类型的卷积神经网络
    • 1 convolution in neural network
    • 2 zero padding
    • 3 unshared convolution
    • 4 tiled convolution
  • 总结
  • welcome

写这篇博文用了很多时间和精力,如果这篇博文对你有帮助,希望您可以打赏给博主相国大人。哪怕只捐1毛钱,也是一种心意。通过这样的方式,也可以培养整个行业的知识产权意识。我可以和您建立更多的联系,并且在相关领域提供给您更多的资料和技术支持。

赏金将用于拉萨儿童图书公益募捐

手机扫一扫,即可:

附:《春天里,我们的拉萨儿童图书馆,需要大家的帮助


1. 导读

上一节《卷积神经网络CNN理论到实践(2)》主要介绍了池化的相关概念。接下来的博客中,我们会介绍
1. 各种类型的卷积神经网络
2. 如何在数据集上使用不同维度的卷积
3. 使得卷积操作更高效的方式
4. 使用tensorflow进行CNN的实现
5. 讨论如何使用CNN做中文文本分类。


2.各种类型的卷积神经网络

在这一节中我们将会介绍CNN的各种类型,主要有:
2.1节:最基本的CNN
2.2节:valid convolution, same convolution和full convolution
2.3节:unshared convolution
2.4节:tiled convolution

2.1 convolution in neural network

在deeplearning中我们说的卷积,其实通常情况下并不是数学意义上的标准的离散卷积定义。实际使用的函数也有些许不同。本节的核心内容就是探讨这些差异的细节,并且给出一些神经网络中使用的卷积函数所具有的性质。

首先,当我们谈到神经网络中的卷积时,其实指的是一组并行的卷积操作。因为一个kernel的卷积,只能得到一种特征。通常情况下,我们希望可以在每一层中得到很多特征。
我们举一个之前提到过的例子:
这里写图片描述

图2.1

在这个例子中,我们的kernel(在这里又称为filter)有两个。因此分别得到了对应的两个输出。其中一个输出也许表达的是图像的边缘特征,另一个输出也许表达的是图像的角点特征。
除此之外,输入很多时候不仅仅是实数,也有可能是观测向量。例如,一张彩色图像像素有红绿蓝三个分量。在多层卷积网络中,第二层的输入是第一层的输出,并且在每个位置上,都会包括不同的卷积输出。在处理图像时,我们往往把输入当做一个3维张量,其中一个维度表示不同的通道,另外两个维度表示每一个通道的坐标。当然在实际使用时,因为有很多张图像样本,因此我们也可以把输出当做4维张量,另外一个维度表示不同的样本。

本文之后,将采用第一种表示(3-D)来进行说明。

下面让我们通过一个事例来讲解:


(图2.2:博主画这个图用了半个小时,你要是觉得好看,别忘了给博主打赏。
另外需要说明一点:儿子可有可无,但是女儿必须要有一个:))

假定我们有一个4-D的kernel张量K,如图所示,Ki,j,k,l的下标依次表示输入层通道i,输出层通道j,像素坐标(k,l).对应到图中俩说,就是这些边的权值。
假定我们的输入为V,其中Vi,j,k的下标依次表示通道i,像素坐标(j,k)
假定我们的输出为Z,其中Zi,j,k的的下标依次表示通道i,像素坐标(j,k)
如果Z是通过未翻转的kernel卷积得到,那么就有:
Zi,j,k=l,m,mVl,j+m1,k+n1Ki,l,m,n(2.1)

对图像中所有的像素都做卷积,或许代价会有点大,如果我们可以容忍特征提取的一些偏差,那么或许我们可以对图像中一部分点进行卷积,也就是降采样。例如,我们可以在图像的两个方向上,每个s个像素做一次卷积,这样就可以得到降采样卷积:
Zi,j,k=c(K,V,s)i,j,k=l,m,mVl,(j1)×s+m,(k1)×s+nKi,l,m,n(2.2)

其中,s叫做降采样卷积的步长(stride).不同方向的步长也可以不同。

接下来,我们再来看一下,在这张图中,参数共享是什么意思:

这里写图片描述

(图2.3:画这张图,同样用了很长时间,你再不打赏,宝宝都要哭了。)

对于数据边缘的处理,我们常常采用的是0值填充,并且这种策略是十分必要的。如下图:

这里写图片描述
图2.4

这里假设kernel宽度为6。上面的卷积网络中我们没有采用0值填充(zero padding),这使得每一个卷积层都缩水了5个像素。到最后我们只能构造出3个卷积层,最后一个卷积层只有一个节点,做不了卷积,这样就是有2个kernel。也许我们可以采用宽度更小一点的kernel,但这样意味着表达性降低并且无论如何缩水还是不可避免的。
下面的卷积网络中,我们在边缘的缺失处添加0。这样有效的阻止了卷积随层数的加深而缩水。我们也因此可以增加任意多层的卷积层。


2.2 zero padding

现在的问题是,对于补0而言,具体补几行呢?这里对应着三种策略,分别对应三种卷积操作:
valid convolution, same convolution和full convolution

首先我们先定义几个参数:
• 2-D discrete convolutions (N=2),
• square inputs (i1=i2=i),
• square kernel size (k1=k2=k),
• same strides along both axes (s1=s2=s),
• same zero padding along both axes (p1=p2=p).
这样一来,我们可以得到输出的规模o:

o=ik+1(2.3)

第一种情况(No padding)
我们不去填充0。例如:

这里写图片描述
(图2.5:No padding, no strides) Convolving a 3×3 kernel over a 4×4 input
using unit strides (i.e., i=4,k=3,s=1 and p=0).

对于这种情况,我们认为p=0.
用这种方式做卷积,叫做valid convolution
并且输出的规模由(2.1)可以计算。例如上面的图o=2


第二种情况(half padding)
我们会填充“一半”的0,如下图:

这里写图片描述
(图2.6: Half padding, no strides) Convolving a 3×3 kernel over a 5×5 input
using half padding and unit strides (i.e., i=5,k=3,s=1 and p=1).

之所以叫做“一半”,是因为对于这种情况而言,我们可以认为:p=k/2,此时输出规模o=i+2k/2(k1)=i,可见输出规模与输入规模相等,因此我们也把half padding 叫做same padding,以这种方式做卷积,叫做same convolution


第三种情况(full padding):

这里写图片描述
(图2.7: Full padding, no strides) Convolving a 3×3 kernel over a 5×5 input
using full padding and unit strides (i.e., i=5,k=3,s=1 and p=2).

尽管大多数情况下,kernel与输入做卷积后,输出的规模o要比输入规模小,但有时候我们也许希望得到输出规模比输入规模大的情况。这个时候可以采用full padding。即此时p=k1.输出规模:
o=i+2(k1)(k1)=i+(k1)

之所以叫做full padding是因为在这种情况下,kernel的任何局部或全部覆盖都被考虑了进来。以这种方式做卷积,叫做full convolution.


2.3 unshared convolution

之前的讨论中,我们知道卷积网络是一个局部连接网络,不仅仅是局部连接,而且还参数共享,而对于一般的全连接网络,参数往往是不同享的。如下图所示的是卷积网络(kernel size=2)和全连接网络的示意图:

这里写图片描述
图2.8

现在我们想问的是:有没有这样的网络,它既满足局部连接(类似于卷积网络),又满足参数不共享(类似于全连接网络)?答案是有的。
对于式子(2.1),我们只需要对K做一些改变就可以。
我们再看一下图2.3,不难发现,参数共享是因为,K是四个维度,其中的坐标(m,n)是输入和输出共享的坐标。因此实现非参数共享,就需要将K扩增到六个维度,使得输出和输入的坐标可以不同,即:
Zi,j,k=l,m,n[Vl,j+m1,k+n1Wi,j,k,l,m,n](2.4)

其中W的下标i,j,k,l,m,n依次表示:输入层的通道分量i,输出层的坐标(j,k),输入层的通道分量l,输入层的坐标(m,n).
我们把这样的类似于卷积的操作,叫做unshared convolution,又叫做local connections.

unshared convolution,convolution, and full connections的示意图如下图2.9:

这里写图片描述
图2.9

局部连接有什么作用呢?事实上,有时候,有一些特征可能只对图像中的某一个局部范围内有价值,而对于图像全局则没什么用处。这个时候,用全局的参数共享显然是不合理的。而采用locally connected
layers就比较妥当。例如,如果我们想要判断一张图片上是否存在一张脸,我们仅仅需要在图片的下半部找到嘴就可以了。因此嘴独有的特征,并不需要在整张图片上共享。
除此之外,我们还可以综合这些方法,来对连接做进一步的限定。例如,加入一幅图像有N个通道(你也许以为图像只有R,G,B三个通道,事实上,通道个数不是固定的,例如CMYK模式下图像有五个通道),那么我们可以让前m个输出通道只跟前n个输入通道做连接,后m个输出通道跟后n个输入通道做连接,以此类推。这样可以进一步的降低参数的个数,提高效率。如图2.10所示:

这里写图片描述
图2.10: 这是一个卷积网络。
其中the first two input channels和the first two output channels做连接。
the second two input channels和the seonde two output channels做连接。


2.4 tiled convolution

在2.3节中,我们知道unshared convolutional layers是full connected layers和convolutional layers的折中,主要体现在既满足参数不共享,又满足局部连接。接下来,我们在想,在unshared convolutional layers和convolutional layers之间是否可以再做一个折中,即满足局部连接,同时参数可以实现部分共享。

这里写图片描述
图2.11

Ngiam, Jiquan, et al. “Tiled convolutional neural networks.” Advances in neural information processing systems. 2010.

除此之外,我们在之前的博文提到了平移不变性,并且介绍了用多通道的方式来处理旋转不变性。那么有没有这样的卷积网络,使得它天然的,对旋转,缩放等操作也具有不变性呢?

结合上面这两个问题,我们引出另外一种卷积神经网络——tiled convolution

这里写图片描述
图2.12:tiled CNNs

在这个图中,单词maps就是我们前面博文说的feature map,即输出。由于卷积是一个求和的操作,对于图2.12而言,其实是3个输入值与kernel的求和,这个求和式子中的每一项,在图中用一个map表示(也就是中间那一层的一个圆。)因为是三项求和,所以每一个卷积操作得到了3个maps,实际的输出是这3个maps的和。
与普通卷积不同的是,这里我们用了两个kernel,选kernel1做一次卷积,然后向右移动一个像素,选kernel2做卷积,循环往复。这样在中间这一层(卷积输出层)就有了两套参数(分别有不同的纹理表示)。以前因为是一个kernel做完全部的卷积,我们把输出叫做feature maps,现在是多个kernel依次轮转做卷积,因此我们这个输出叫做multiple feature maps.
另一个简化示意图可以参考下图2.13:

这里写图片描述
图2.13:A comparison of locally connected layers(unshared convolution),
tiled convolution, and standard convolution.

图2.13中的三个卷积网络从上到下依次为locally connected layers(unshared convolution), tiled convolution, and standard convolution。它们拥有相同的连接结构(即我们假设这些kernel尺寸相同)。其中kernel宽度为2。这三种网络最大的差异就是参数的共享情况。第一个网络(Top)是locally connected layer,它没有参数共享,但是局部连接。中间的那个是tiled convolution它有t=2个不同的kernels. 其中一个kernel对应着边权重为a和b,另一个对应边权重为c和d。我们每一次做完一次卷积后向右移动一个像素。并且每次卷积轮次使用不同的kernel.这样在输出层中我们发现,相邻的节点拥有不同的参数,这类似于第一幅图的unshared convolution(locally connected layer)。
另一方面,在输出中,相隔t个单元的节点则使用的是相同的参数。这就有点类似于下面的traditional convolution.并且下面的traditional convolution也可以看做是tiled convolution网络中t = 1,即只有1个kernel时的特殊情况。

到目前为止,我们都是从直观的认识上来介绍tiled convolution的,对比式子(2.1,2.2),不难得到数学定义:

Zi,j,k=l,m,mVl,j+m1,k+n1Ki,l,m,n,j%t+1,k%t+1(2.5)

在本小节开头,我们说道,这样的卷积网络可以对旋转,缩放等操作也具有不变性。下面我们来简要的解释一下原因:
我们知道,在卷积网络中,一个kernel对某一种特征的提取。多层卷积网络中,不同层中的kernel表示的功能不同,一般而言,深层卷积网络中的kernel是将浅层kernel提取到的特征进行组合,得到了更加高级的特征。而对于同一层而言,如果我们用不同的kernel并行卷积,而不是像tiled convolution这样在同一趟卷积中使用不同kernel.那么相当于我们提取了不同的特征。现在,我们按照tiled convolution的方式进行卷积有相当于什么呢?
这相当于:提取相同特征不同的变化形式。例如特征嘴的变化可能是平移,旋转,缩放等等。我们通过tiled convolution的方式,就可以分别捕获这些变化。这里的kernel越多,我们捕获的变化形式也就越多。这样,我们之后再用max pooling,就可以很好的保持其他形式的不变性,而不仅仅是平移不变性。
之前的博文中,平移不变性的实现是因为标准卷积网络的结构造成的参数共享,而本小节这种不变性是我们通过样本学习出来的。这两种不变性,在有的文献中,分别叫做hard-coded invariantlearned invariant.


3.总结

本节博文主要介绍了六种卷积操作,对应了六种卷积神经网络。

其实,在CNN中,除了卷积操作,还有一些操作也非常重要。比如为了实现学习,必须在给定输出的梯度时能够计算核的梯度。另外,比较卷积与矩阵乘法,我们发现两者很想,基本上可以看做是kernel不断覆盖的去做矩阵乘法。我们首先把输入张量变形为一个扁平的向量。其中包含的矩阵是关于卷积核的函数。这个矩阵是稀疏的并且核的每个元素都复制给矩阵的多个元素。
在下一篇博文中,我们会介绍CNN中的其他操作,例如反卷积等。

请继续阅读:
卷积神经网络CNN理论到实践(4)


welcome!

Xiangguo Sun
sunxiangguodut@qq.com
http://blog.csdn.net/github_36326955

Welcome to my blog column: Dive into ML/DL!

这里写图片描述

I devote myself to dive into typical algorithms on machine learning and deep learning, especially the application in the area of computational personality.

My research interests include computational personality, user portrait, online social network, computational society, and ML/DL. In fact you can find the internal connection between these concepts:

这里写图片描述

In this blog column, I will introduce some typical algorithms about machine learning and deep learning used in OSNs(Online Social Networks), which means we will include NLP, networks community, information diffusion,and individual recommendation system. Apparently, our ultimate target is to dive into user portrait , especially the issues on your personality analysis.


All essays are created by myself, and copyright will be reserved by me. You can use them for non-commercical intention and if you are so kind to donate me, you can scan the QR code below. All donation will be used to the library of charity for children in Lhasa.


赏金将用于拉萨儿童图书公益募捐
社会公益,听IT人的声音

手机扫一扫,即可:

附:《春天里,我们的拉萨儿童图书馆,需要大家的帮助

原创粉丝点击