导航:首页 > 网络问题 > 卷积网络怎么设置

卷积网络怎么设置

发布时间:2022-11-20 18:03:18

❶ GCN图卷积网络入门详解

在这篇文章中,我们将仔细研究一个名为GCN的着名图神经网络。首先,我们先直观的了解一下它的工作原理,然后再深入了解它背后的数学原理。

字幕组双语原文: 【GCN】图卷积网络(GCN)入门详解
英语原文: Graph Convolutional Networks (GCN)
翻译: 听风1996 、 大表哥

许多问题的本质上都是图。在我们的世界里,我们看到很多数据都是图,比如分子、社交网络、论文引用网络。

图的例子。(图片来自[1])

在图中,我们有节点特征(代表节点的数据)和图的结构(表示节点如何连接)。

对于节点来说,我们可以很容易地得到每个节点的数据。但是当涉及到图的结构时,要从中提取有用的信息就不是一件容易的事情了。例如,如果2个节点彼此距离很近,我们是否应该将它们与其他对节点区别对待呢?高低度节点又该如何处理呢?其实,对于每一项具体的工作,仅仅是特征工程,即把图结构转换为我们的特征,就会消耗大量的时间和精力。

图上的特征工程。(图片来自[1])

如果能以某种方式同时得到图的节点特征和结构信息作为输入,让机器自己去判断哪些信息是有用的,那就更好了。

这也是为什么我们需要图表示学习的原因。

我们希望图能够自己学习 "特征工程"。(图片来自[1])

论文 :基于图神经网络的半监督分类 (2017)[3]

GCN是一种卷积神经网络,它可以直接在图上工作,并利用图的结构信息。

它解决的是对图(如引文网络)中的节点(如文档)进行分类的问题,其中仅有一小部分节点有标签(半监督学习)。

在Graphs上进行半监督学习的例子。有些节点没有标签(未知节点)。

就像"卷积"这个名字所指代的那样,这个想法来自于图像,之后引进到图(Graphs)中。然而,当图像有固定的结构时,图(Graphs)就复杂得多。

从图像到图形的卷积思想。 (图片来自[1])

GCN的基本思路:对于每个节点,我们从它的所有邻居节点处获取其特征信息,当然也包括它自身的特征。假设我们使用average()函数。我们将对所有的节点进行同样的操作。最后,我们将这些计算得到的平均值输入到神经网络中。

在下图中,我们有一个引文网络的简单实例。其中每个节点代表一篇研究论文,同时边代表的是引文。我们在这里有一个预处理步骤。在这里我们不使用原始论文作为特征,而是将论文转换成向量(通过使用NLP嵌入,例如tf-idf)。NLP嵌入,例如TF-IDF)。

让我们考虑下绿色节点。首先,我们得到它的所有邻居的特征值,包括自身节点,接着取平均值。最后通过神经网络返回一个结果向量并将此作为最终结果。

GCN的主要思想。我们以绿色节点为例。首先,我们取其所有邻居节点的平均值,包括自身节点。然后,将平均值通过神经网络。请注意,在GCN中,我们仅仅使用一个全连接层。在这个例子中,我们得到2维向量作为输出(全连接层的2个节点)。

在实际操作中,我们可以使用比average函数更复杂的聚合函数。我们还可以将更多的层叠加在一起,以获得更深的GCN。其中每一层的输出会被视为下一层的输入。

2层GCN的例子:第一层的输出是第二层的输入。同样,注意GCN中的神经网络仅仅是一个全连接层(图片来自[2])。

让我们认真从数学角度看看它到底是如何起作用的。

首先,我们需要一些注解

我们考虑图G,如下图所示。

从图G中,我们有一个邻接矩阵A和一个度矩阵D。同时我们也有特征矩阵X。

那么我们怎样才能从邻居节点处得到每一个节点的特征值呢?解决方法就在于A和X的相乘。

看看邻接矩阵的第一行,我们看到节点A与节点E之间有连接,得到的矩阵第一行就是与A相连接的E节点的特征向量(如下图)。同理,得到的矩阵的第二行是D和E的特征向量之和,通过这个方法,我们可以得到所有邻居节点的向量之和。

计算 "和向量矩阵 "AX的第一行。

在问题(1)中,我们可以通过在A中增加一个单位矩阵I来解决,得到一个新的邻接矩阵Ã。

取lambda=1(使得节点本身的特征和邻居一样重要),我们就有Ã=A+I,注意,我们可以把lambda当做一个可训练的参数,但现在只要把lambda赋值为1就可以了,即使在论文中,lambda也只是简单的赋值为1。

通过给每个节点增加一个自循环,我们得到新的邻接矩阵

对于问题(2): 对于矩阵缩放,我们通常将矩阵乘以对角线矩阵。在当前的情况下,我们要取聚合特征的平均值,或者从数学角度上说,要根据节点度数对聚合向量矩阵ÃX进行缩放。直觉告诉我们这里用来缩放的对角矩阵是和度矩阵D̃有关的东西(为什么是D̃,而不是D?因为我们考虑的是新邻接矩阵Ã 的度矩阵D̃,而不再是A了)。

现在的问题变成了我们要如何对和向量进行缩放/归一化?换句话说:

我们如何将邻居的信息传递给特定节点?我们从我们的老朋友average开始。在这种情况下,D̃的逆矩阵(即,D̃^{-1})就会用起作用。基本上,D̃的逆矩阵中的每个元素都是对角矩阵D中相应项的倒数。

例如,节点A的度数为2,所以我们将节点A的聚合向量乘以1/2,而节点E的度数为5,我们应该将E的聚合向量乘以1/5,以此类推。

因此,通过D̃取反和X的乘法,我们可以取所有邻居节点的特征向量(包括自身节点)的平均值。

到目前为止一切都很好。但是你可能会问加权平均()怎么样?直觉上,如果我们对高低度的节点区别对待,应该会更好。

但我们只是按行缩放,但忽略了对应的列(虚线框)。

为列增加一个新的缩放器。

新的缩放方法给我们提供了 "加权 "的平均值。我们在这里做的是给低度的节点加更多的权重,以减少高度节点的影响。这个加权平均的想法是,我们假设低度节点会对邻居节点产生更大的影响,而高度节点则会产生较低的影响,因为它们的影响力分散在太多的邻居节点上。

在节点B处聚合邻接节点特征时,我们为节点B本身分配最大的权重(度数为3),为节点E分配最小的权重(度数为5)。

因为我们归一化了两次,所以将"-1 "改为"-1/2"

例如,我们有一个多分类问题,有10个类,F 被设置为10。在第2层有了10个维度的向量后,我们将这些向量通过一个softmax函数进行预测。

Loss函数的计算方法很简单,就是通过对所有有标签的例子的交叉熵误差来计算,其中Y_{l}是有标签的节点的集合。

层数是指节点特征能够传输的最远距离。例如,在1层的GCN中,每个节点只能从其邻居那里获得信息。每个节点收集信息的过程是独立进行的,对所有节点来说都是在同一时间进行的。

当在第一层的基础上再叠加一层时,我们重复收集信息的过程,但这一次,邻居节点已经有了自己的邻居的信息(来自上一步)。这使得层数成为每个节点可以走的最大跳步。所以,这取决于我们认为一个节点应该从网络中获取多远的信息,我们可以为#layers设置一个合适的数字。但同样,在图中,通常我们不希望走得太远。设置为6-7跳,我们就几乎可以得到整个图,但是这就使得聚合的意义不大。

例: 收集目标节点 i 的两层信息的过程

在论文中,作者还分别对浅层和深层的GCN进行了一些实验。在下图中,我们可以看到,使用2层或3层的模型可以得到最好的结果。此外,对于深层的GCN(超过7层),反而往往得到不好的性能(虚线蓝色)。一种解决方案是借助隐藏层之间的残余连接(紫色线)。

不同层数#的性能。图片来自论文[3]

论文作者的说明

该框架目前仅限于无向图(加权或不加权)。但是,可以通过将原始有向图表示为一个无向的两端图,并增加代表原始图中边的节点,来处理有向边和边特征。

对于GCN,我们似乎可以同时利用节点特征和图的结构。然而,如果图中的边有不同的类型呢?我们是否应该对每种关系进行不同的处理?在这种情况下如何聚合邻居节点?最近有哪些先进的方法?

在图专题的下一篇文章中,我们将研究一些更复杂的方法。

如何处理边的不同关系(兄弟、朋友、......)?

[1] Excellent slides on Graph Representation Learning by Jure Leskovec (Stanford): https://drive.google.com/file/d//view?usp=sharing

[2] Video Graph Convolutional Networks (GCNs) made simple: https://www.youtube.com/watch?v=2KRAOZIULzw

[3] Paper Semi-supervised Classification with Graph Convolutional Networks (2017): https://arxiv.org/pdf/1609.02907.pdf

[4] GCN source code: https://github.com/tkipf/gcn

[5] Demo with StellarGraph library: https://stellargraph.readthedocs.io/en/stable/demos/node-classification/gcn-node-classification.html

雷锋字幕组是一个由AI爱好者组成的翻译团队,汇聚五五多位志愿者的力量,分享最新的海外AI资讯,交流关于人工智能技术领域的行业转变与技术创新的见解。

团队成员有大数据专家,算法工程师,图像处理工程师,产品经理,产品运营,IT咨询人,在校师生;志愿者们来自IBM,AVL,Adobe,阿里,网络等知名企业,北大,清华,港大,中科院,南卡罗莱纳大学,早稻田大学等海内外高校研究所。

如果,你也是位热爱分享的AI爱好者。欢迎与雷锋字幕组一起,学习新知,分享成长。

❷ PART 4 W1 卷积神经网络介绍

一个是图像分类:如猫脸识别等;一个是目标检测:如无人驾驶技术中的各种交通信号检测技术

1. 卷积操作及过滤器/卷积核的概念

如上图所示:最左侧矩阵是一个灰度图像,中间是一个3*3的小矩阵,称为“卷积核”或“过滤器”。

卷积:先把卷积核放到灰度图像左上角(绿色框),盖住灰度图像上一个3*3的矩阵区域,然后9对对应的元素相乘,然后求和(得到0),然后把卷积核逐渐移动一行一行的“扫描”,最终得到最右侧矩阵。上述操作叫做“卷积”,最右侧矩阵是卷积的输出。

2. 垂直边缘检测

仍以上图为例,可以看到3*3的卷积核具体的数值构成为“左边一列1,中间一列0,右边一列-1”,这种卷积核在“扫描”灰度图像时,可以检测到灰度图像的垂直边缘。分析如下:

1)假设正在扫描的灰度区域没有垂直边缘,意味着区域内的值在左右方向上分布差不多,与卷积核做完运算后,左边的乘1,右边的乘-1,相加正好有一定的抵消作用,其实计算出来的结果会接近0。即:卷积结果接近0代表没有边缘。

2)有垂直边缘分为两种情况:目标区域“左边值较大,右边值较小” 或“左边值较小,右边值较大”。前一种情况在卷积操作后会得到一个较大的正值,后一种情况卷积操作后会得到一个较大的负值。

可以看出,较大的正值代表着目标区域的变化趋势与卷积核相同,即检测到的是与卷积核相同的边缘,而较大的负值代表目标区域的变化趋势与卷积核相反,即检测到的是与卷积核相反的边缘。

3. 卷积应用在卷积神经网络中

卷积操作如何应用于神经网络中?简言之,卷积核本身就是网络要学习的参数。如上图所示,我们并不是事先设定好要检测垂直边缘或水平边缘或其它什么边缘,而是要网络去学习要检测什么东西。

1. padding的原因

在上节展示的卷积操作中,可以看出,假设输入图像的大小为n*n,而卷积核的大小为f*f,那么卷积核从输入图像的左上角扫描到右下角,最终得到的结果大小为(n-f+1)*(n-f+1),意味着如果一次次进行卷积,那么结果的尺寸会越来越小

另外,显然输入图像边缘的像素被使用的较少(最边缘的像素仅被使用一次),这显然会造成信息的丢失。

2. 如何进行padding

非常简单:把输入图像的四周补充p = (f-1)/2 圈的0,这样输入的图像尺寸变成了(n+2p)*(n+2p),因此卷积后的大小变成了(n+2p -f + 1)*(n+2p -f + 1)=n*n,即与原始的图像有了相同的大小,且原始图像边缘的像素也被较多的利用到。

3. 几点补充

(1)卷积核的尺寸设置为 奇数 :因为① 这样(f-1)/2就恰好是整数了,方便进行padding,② 有中心像素,便于表征卷积核的位置,等。

(2)根据是否进行padding,分为 普通卷积(valid) 和 同尺寸卷积(same)

1. 步长概念

在上文中讲到卷积,即使用一个卷积核对输入图像进行“扫描”并进行相应计算时,提到这个“扫描”是逐个像素逐个像素的迈进的。但是,并不一定非得这样,也可以每次跨越两个或更多个像素,这就是“步长”的概念,一般用s表示

2. 卷积结果尺寸与步长的关系

前文提到,若输入图像尺寸为n*n,卷积核尺寸为f*f,则卷积结果尺寸为(n+f-1)*(n+f-1),若算上padding操作,则结果为(n+2p -f + 1)*(n+2p -f + 1)。这是在步长s=1的前提下成立。若步长不为1,则结果为floor((n+2p-f)/s+1)**2

3. 其它:数学中的卷积和神经网络中的卷积

需要说明的是,神经网络中所说的卷积和数学中说的卷积不是一回事,但数学中的卷积是啥就不追究了。

神经网络中的卷积操作,在数学的描述上,更像是一种“交叉相关性”的计算,可以看出,若目标区域与卷积核有类似的分布,则会计算出较大的正值(正相关),若有相反的分布,则会计算出较大的负值(负相关),若没什么关系,则会计算出接近0的值(不相关)。卷积操作的确很像一种相关性的计算。

1. RGB图像的数学构成

灰度图像是一个n*n的二维矩阵,彩色图像则是n*n*3 的三维矩阵,最外围的三个维度分别代表了RGB三原色的值,其中数字“3”在卷积神经网络中被称为通道数或信道数

2. 对RGB图像进行卷积

在对灰度图像进行卷积时,使用的是f*f的二维卷积核。在对RGB图像进行卷积时,则卷积核的维度也+1,变成了f*f*3。一次卷积的结果仍然是把所有的值加起来输出一个值。即: 一个三维的图像,和一个三维的卷积核,在进行完卷积操作后,输出的是一个二维的矩阵(如上图) 。

3. 当使用多个卷积核时的输出

如上图所示,可以使用多个卷积核(一个亮黄色,一个屎黄色)。根据前文描述,一个立体的卷积核在一个立体的矩阵上扫描完,结果是一个二维的。但当使用多个卷积核时,则输出了多个二维矩阵,这些二维矩阵沿着第三个维度排列到一起,使得结果重新变成了三维。此时,第三个维度的尺寸,反应的是卷积核数,也就是说 卷积核数就是信道数 。直观理解,每一个卷积核代表着检测了某一种特征,多个卷积核就是同时检测了多种特征,传递了多种信息。

1. 一个卷积层的数据的基本流

如上图所示,由于卷积核本身就是一堆待学参数w,所以卷积操作本质还是“加权求和”,之后会加入偏置值,然后进行非线性变换,然后输出(到下一层),可见还是那一套。

需要提一下的是,卷积的输入不一定是原始图像构成的矩阵,还有可能是上一个卷积的结果。原始图像是彩色的,有多个通道。卷积时可以用多个卷积核,最终产生的结果也是立体的。因此原始的输入与中间卷积层的输出,在数学形式上是统一的。因此可以“输入->卷积层->卷积层->...”这样操作。

2. 卷积层的参数规模

一个卷积层总的参数规模(包括w,不包括b)为: ,即:卷积核的大小的平方*上层输出的通道数)*本层所用的卷积核数。与上层输入的大小无关(但与通道数有关)

3. 一个卷积层涉及到的超参

卷积核的大小、是否padding、步长、卷积核数。

1. 一个示例

上图为一个简单的卷积神经网络示例: 一层一层的卷积,最后把所有的元素展开成一个一维向量,然后加一个全连接层。

2. 注意以下几点:

1⃣️ 实际上CNN会有卷积层、池化层、全连接层,而非仅有卷积和全连接;

2⃣️ 从数据的构成形式上看,按照网络从前往后的顺序,图片尺寸不断减小,信道数量不断增加。一般遵从这个趋势。

1. 池化

如上图所示,假设输入是一个4*4的矩阵,现在我们把它分割成2*2四个子矩阵(或者说使用一个2*2的核以2为步长扫描矩阵),对四个子区域分别求最大值,最终得到一个值为9、2、6、3的2*2的矩阵输出。这种操作就叫池化,具体为最大值池化。

2. 池化的作用

1⃣️ 一般来说,较大的值往往代表学到了一个重要或典型的特征,把原始输入以某种方式滤除掉一些不重要的值,只保留一些较大的值,相当于 强化了一些重要信息的表达 。2⃣️ 降低图片的尺寸,可以节省空间、加速运算等。

3. 池化的特点

并没有需要学习的参数(w、b之类的),也因此“池化层”一般并不被称为单独的一层。在卷积神经网络中,通常把一个卷积层+一个池化层的组合叫一层。

4. 池化的超参数及经验值

池化层没有要学习的参数,只有核心的两个超参:池化核的大小、池化步长。此外还有池化所用的rece操作:最大或者平均(没有其它选项)。

一般把池化核的大小设置为3或2,步长为2。注意:步长为2意味着把图片减小到原来的一半。

rece操作最常用最大池化,偶尔用平均池化,不会用其它操作。

上图为一个典型的卷积神经网络示例,描述如下:

输入层 :彩色的手写数字图片,数学构成为32*32*3的矩阵,其中3为通道数。

Layer 1-卷积层 :1)使用6个5*5*3的卷积核,以步长为1对输入层进行卷积,输出28*28*6的矩阵,2)然后使用2*2的最大池化,步长为2,最终输出14*14*6的矩阵。其中14为图片尺寸,6为信道数。

Layer2-卷积层 :1)使用16个5*5*3的卷积核以步长1对上层输出进行卷积,输出10*10*16的矩阵,2)然后使用2*2的最大池化,步长为2,最终输出5*5*16的矩阵。

Layer3-全连接层: 把上层输出的5*5*16矩阵展开成1*400的一维向量,以120*400的权重矩阵送入本层120个神经元,激活后输出。

Layer4-全连接层: 120->84,激活后输出

输出层 :84 -> 10,然后softmax后输出。

1. 参数少

假如原始图片尺寸为100*100*3,假设使用全连接,即使第二层仅用100个神经元,那也已经产生了100*100*3*100 = 300w个参数,难以想象。

假设使用卷积层,使用10个10*10*3的卷积核,那就是只有3000个参数,而能输出的矩阵规模是91*91*10=81000

2. 参数少的原因

1)稀疏连接:卷积核扫描矩阵产生输出,这个过程就从“神经元连接”的角度看,输入的左上角只连着输出的左上角,右上角只连右上角,而非“全连接”,参数就会少很多。2)参数共享:这么稀疏的连接,还是使用了同一套参数,进一步减少了参数的量。

3. 参数共享的其它好处

如果图片上有一只猫,那么不管这个猫在图片的什么位置,都不改变“这是一张猫的照片”。使用参数共享时,相当于用同样的特征提取作用到整个图片的各个区域,适应平移不变性,增强鲁棒性。

❸ 卷积神经网络的结构、尺寸

(摘录源于: CS231n课程笔记 )

最常见的形式就是将一些卷积层和ReLU层放在一起,其后紧跟池化层,然后重复如此直到图像在空间上被缩小到一个足够小的尺寸,在某个地方过渡成全连接层也较为常见。最后的全连接层得到输出,比如分类评分等。
换句话说,最常见的卷积神经网络结构如下:
INPUT -> [[CONV -> RELU]*N -> POOL?]*M -> [FC -> RELU]*K -> FC
其中*指的是重复次数,POOL?指的是一个可选的汇聚层。其中N >=0,通常N<=3,M>=0,K>=0,通常K<3。例如,下面是一些常见的网络结构规律:

输入层(包含图像的)应该能被2整除很多次。常用数字包括32(比如CIFAR-10),64,96(比如STL-10)或224(比如ImageNet卷积神经网络),384和512。

最常用的设置是用用2x2感受野,步长为1。

———·———·———·———·———·———·———·———·———·———·——
(以下)直接全复制,供查阅参考。
———·———·———·———·———·———·———·———·———·———·——

下面是卷积神经网络领域中比较有名的几种结构:

VGGNet的细节: 我们进一步对 VGGNet 的细节进行分析学习。整个VGGNet中的卷积层都是以步长为1进行3x3的卷积,使用了1的零填充,汇聚层都是以步长为2进行了2x2的最大值汇聚。可以写出处理过程中每一步数据体尺寸的变化,然后对数据尺寸和整体权重的数量进行查看:

注意,大部分的内存和计算时间都被前面的卷积层占用,大部分的参数都用在后面的全连接层,这在卷积神经网络中是比较常见的。在这个例子中,全部参数有140M,但第一个全连接层就包含了100M的参数。

一旦对于所有这些数值的数量有了一个大略估计(包含激活数据,梯度和各种杂项),数量应该转化为以GB为计量单位。把这个值乘以4,得到原始的字节数(因为每个浮点数占用4个字节,如果是双精度浮点数那就是占用8个字节),然后多次除以1024分别得到占用内存的KB,MB,最后是GB计量。如果你的网络工作得不好,一个常用的方法是降低批尺寸(batch size),因为绝大多数的内存都是被激活数据消耗掉了。

❹ 卷积神经网络CNN(Convolutional Neural Network)

上图计算过程为,首先我们可以将右边进行卷积的可以称为过滤器也可以叫做核,覆盖到左边第一个区域,然后分别按照对应位置相乘再相加,3*1+1*1+2*1+0*0+0*0+0*0+1*(-1)+8*(-1)+2*(-1)=-5;
按照上述的计算方法逐步按右移一个步长(步长可以设定为1,2,...等),然后按往下移,逐渐计算相应的值,得出最终的值。

如上图显示,对于第一个图像矩阵对应的图,一边是白色,一边是黑色,那么中间就会存在一个垂直的边缘,我们可以选择一个垂直边缘检测过滤器,如乘法右边的矩阵,那么两者做卷积后得出的图会显示如等号右边的结果矩阵对应的灰度图中间会有一个白色的中间带,也就是检测出来的边缘,那为什么感觉中间边缘带会比较宽呢?而不是很细的一个局域呢?原因是我们输入的图像只有6*6,过于小了,如果我们选择输出更大的尺寸的图,那么结果来说就是相对的一个细的边缘检测带,也就将我们的垂直边缘特征提取出来了。
上述都是人工选择过滤器的参数,随着神经网络的发展我们可以利用反向传播算法来学习过滤器的参数

我们可以将卷积的顾虑器的数值变成一个参数,通过反向传播算法去学习,这样学到的过滤器或者说卷积核就能够识别到很多的特征,而不是依靠手工选择过滤器。

- padding 操作,卷积经常会出现两个问题:
1.每经过一次卷积图像都会缩小,如果卷积层很多的话,后面的图像就缩的很小了;
2.边缘像素利用次数只有一次,很明显少于位于中间的像素,因此会损失边缘图像信息。
为了解决上述的问题,我们可以在图像边缘填充像素,也就是 padding 操作了。

如果我们设置在图像边缘填充的像素数为p,那么经过卷积后的图像是:(n+2p-f+1)x(n+2p-f+1).
如何去选择p呢
通常有两种选择:
-Valid:也就是说不填充操作(no padding),因此如果我们有nxn的图像,fxf的过滤器,那么我们进行卷积nxn fxf=(n-f+1)x(n-f+1)的输出图像;
-Same:也就是填充后是输出图像的大小的与输入相同,同样就有(n+2p)x(n+2p)
fxf=nxn,那么可以算,n+2p-f+1=n,得到p=(f-1)/2。
通常对于过滤器的选择有一个默认的准则就是选择过滤器的尺寸是奇数的过滤器。
- 卷积步长设置(Strided COnvolution)
卷积步长也就是我们进行卷积操作时,过滤器每次移动的步长,上面我们介绍的卷积操作步长默认都是1,也就是说每次移动过滤器时我们是向右移动一格,或者向下移动一格。
但是我们可以对卷积进行步长的设置,也就是我们能够对卷积移动的格数进行设置。同样假如我们的图像是nxn,过滤器是fxf,padding设置是p,步长strided设置为s,那么我们进行卷积操作后输出的图像为((n+2p-f)/s+1)x((n+2p-f)/s+1),那么这样就会出现一个问题,如果计算结果不是整数怎么办?

一般是选择向下取整,也就是说明,只有当我们的过滤器完全在图像上能够覆盖时才对它进行计算,这是一个惯例。
实际上上述所述的操作在严格数学角度来说不是卷积的定义,卷积的定义上我们计算的时候在移动步长之前也就是对应元素相乘之前是需要对卷积核或者说我们的过滤器进行镜像操作的,经过镜像操作后再把对应元素进行相乘这才是严格意义上的卷积操作,在数学角度上来说这个操作不算严格的卷积操作应该是属于互相关操作,但是在深度学习领域中,大家按照惯例都省略了反转操作,也把这个操作叫做卷积操作

我们知道彩色图像有RGB三个通道,因此对于输入来说是一个三维的输入,那么对三维输入的图像如何进行卷积操作呢?

例子,如上图我们输入图像假设为6×6×3,3代表有RGB三个通道channel,或者可以叫depth深度,过滤器的选择为3×3×3,其中需要规定的是,顾虑器的channel必须与输入图像的channel相同,长宽没有限制,那么计算过程是,我们将过滤器的立体覆盖在输入,这样对应的27个数对应相乘后相加得到一个数,对应到我们的输出,因此这样的方式进行卷积后我们得出的输出层为4×4×1。如果我们有多个过滤器,比如我们分别用两个过滤器一个提取垂直特征,一个提取水平特征,那么输出图4×4×2 。也就是代表我们输出的深度或者说通道与过滤器的个数是相等的。

第l层的卷积标记如下:

加入我们的过滤器是3×3×3规格的,如果我们设定10个过滤器,那么需要学习的参数总数为每个过滤器为27个参数然后加上一个偏差bias那么每个过滤器的参数为28个,所以十个过滤器的参数为280个。从这里也就可以看出,不管我们输入的图片大小是多大,我们都只需要计算这些参数,因此参数共享也就很容易理解了。

为了缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性,我们经常会使用池化层。池化层的计算方式与卷积类似,只是我们需要对每一个通道都进行池化操作。
池化的方式一般有两种:Max Pooling和Average Pooling。

上面为Max Pooling,那么计算方法与卷积类似,首先设定超参数比如过滤器的大小与步长,然后覆盖到对应格子上面,用最大值取代其值作为输出的结果,例如上图为过滤器选择2×2,步长选择为2,因此输出就是2×2的维度,每个输出格子都是过滤器对应维度上输入的最大值。如果为平均池化,那么就是选择其间的平均值作为输出的值。
因此从上面的过程我们看到,通过池化操作能够缩小模型,同时能让特征值更加明显,也就提高了提取特征的鲁棒性。

❺ 深度卷积网络

LeNet网络的结构如下图所示,可以看出,LeNet网络并没有使用padding,每进行一次卷积,图像的高度和宽度都会缩小,而通道数会一直增加。在全连接层中有400个节点,每个极点都有120个神经元,有时还会从这400个节点抽取一部分节点构建一个全连接层,即有两个全连接层。在该网络中,最后一步就是利用84个特征得到最后的输出,该网络刚开始使用的是 sigmoid 函数 tanh 函数,而现在常常倾向于使用 softmax 函数。需要注意的是,LeNet-5网络进行图像分类时,输入的图像是单通道的灰度图像。

AlexNet是以论文第一作者的名字命名的,该网络的结构,如下图所示,该网络的输出层使用了 softmax 函数。AlexNet网络比LeNet网络规模更大,大约有6000万个参数,用于训练图像和数据集时,能够处理非常相似的基本构造模块,这些模块中包含着大量的隐藏单元,并且与LeNet网络不同的是,该网络使用了ReLu的激活函数。

VGG-16网络没有太多的超参数,这是一种专注于构建卷积层的简单网络。如下图所示,该网络首先利用64个过滤器进行了两次卷积,接着在池化层将输入图像压缩,接着又是128个过滤器进行两次卷积,接着载池化。继续用256个过滤器进行3次卷积,再池化,接着再利用512个过滤器卷积3次,再池化,将稍后得到的特征图进行全连接操作,再进 softmax 激活。

由于存在梯度消失和梯度爆炸的原因,深层次的神经网络是很难训练的,如果采用一种跳跃连接的方式,即从某一层网络层获取激活,然后迅速反馈给另外一层,甚至是神经网络的更深层。这种利用跳跃连接构建的深度神经网络ResNets,深度能够超过100层

一个简单的两层神经网络示例,如下图所示:

常规的输出和输出之间的关系可以用如下的公式表示:

如上公式所述,这是一条神经网络的主路径。如果将 的输入直接到深层的激活函数之前,此时,神经网络有了一条副路径,其对应输出将有公式(5)变成如下所示的公式(6)

此时的输入除了原先的输入 外,多了一个 项,即由于 产生了一个残差块。

构建一个ResNet网络就是将很多这样的残差块堆积在一起,形成一个深度神经网络,如下所示:

使用传统的标准优化算法训练一个网络,随着网络深度的增加,训练误差会先减小再增加,随着网络层数的增加,优化算法会越难以训练,训练误差也会越来越多。但是,使用ResNet网络,能够有效地避免这种情况。

如上所述,加入残差网络之后,其输出计算公式如公式(6)所示,展开这个公式,则有:

如果使用L2正则化或者权重衰减,则会压缩权重参数 的值,如果参数 和参数 等于0,其输出将由公式(7)变成 ,假定使用ReLU激活函数,则有:

由于残差网络存在的这种跳跃连接,很容易得出以上等式,这意味着,即使给神经网络增加两层,但是其效率并不逊色与更简单的神经网络。并且由于存在以上恒等式,使得网络学习隐藏层的单元的信息更加容易。而普通网络,随着网络层数的增加,学习参数会变得很困难。

此外,关于残差网络,如公式(6)所示,假设 与 具有相同的维度,由于ResNets使用了许多same卷积, 的维度等于输出层的维度。如果输入和输出具有不同的维度,可以再增加一个矩阵 ,使得 和 具有相同的维度。而 的维度可以通过0值填充调节。

在卷积网络的架构设计中,一种有趣的想法是会使用到1×1的过滤矩阵,实际上,对于单通道的图像而言,1×1的过滤矩阵,意义不大,但是,对于多通道的图像而言,1×1的过滤矩阵能够有效减少图像卷积之后的通道数量。

根据卷积和池化的基本知识,随着神经网络层数的增加,图像的通道数量会逐渐增加,采用1×1的过滤矩阵卷积之后,可以有效减少图像的通道数量,一个简单的示例,如下所示:

假设有一个6×6×32的图片,使用1×1×32的过滤矩阵进行卷积运算,整个运算过程将会遍历36个单元格,并计算过滤矩阵所覆盖区域的元素积之和,将其应用到ReLu非线性函数,会得到一个输出值。此计算过程中,可能会用到多个1×1×32的过滤器,那么,通过以上计算会得到一个 6×6×过滤器数量 的矩阵。

构建卷积神经网络时,有时会很难决定过滤器的大小,而Inception网络的引入,却能很好的解决这个问题。

Inception网络的作用就是代替人工确定选择卷积层的过滤器类型。如下图所示,对于一个多通道图像,可以使用不同的过滤矩阵或者池化层,得到不同的输出,将这些输出堆积起来。

有了如上图所示的Inception块,最终输出为32+32+64+128=256,而Inception模块的输入为28×28×192,其整个计算成本,以5×5的过滤矩阵为例,其乘法的计算次数为:28×28×32×5×5×192,整个计算次数超过了1.2亿次。而如果使用如下所示的优化计算方法,则可以有效减少计算量。

如果利用1×1的过滤器,将输入矩阵的通道减少至16,则可以有效减少计算量,如下所示:

如上图所示的价格中,整个网络的运算次数为:28×28×192×16+28×28×32×5×5×16=1240万,整个计算成本降低至原来的十分之一。而,通过1×1×192过滤器卷积得到的这个网络层被称之为瓶颈层。

如上,所示,可以给每一个非1×1的卷积层之前,加入一个1×1的瓶颈层,就可以构建一个基本的inception模块了,如下图所示:

而一个inception网络就是多个Inception模块连接起来,如下图所示:

事实上,以上网络中,还存在一些分支,如编号1所示,这些分支就是全连接层,而全连接层之后就是一个softmax层用于预测。又如分支2所示,包含一些隐藏层(编号3),通过全连接层和softmax进行预测。这些分支结构能够确保,即使是隐藏层和中间层也参与了特征计算,并且也能够预测图片的分类。这种做法能够有效避免网络过拟合。

对于计算机视觉领域而言,神经网络的训练可能需要大量的数据,但是当数据量有限时,可以通过数据增强来实现数据量的扩充,以提高系统的鲁棒性,具体的数据增强方法如下所示:

除了以上三种数据增强的方法外,更多的数据增强方法和实现可以参考 图像数据增强

数据增强可以利用计算机多线程实现,一个线程用来实现加载数据,实现数据增强,其他线程可以训练这些数据以加快整体的运算速度。

❻ 卷积神经网络(CNN)基础

在七月初七情人节,牛郎织女相见的一天,我终于学习了CNN(来自CS231n),感觉感触良多,所以赶快记下来,别忘了,最后祝大家情人节快乐5555555.正题开始!

CNN一共有卷积层(CONV)、ReLU层(ReLU)、池化层(Pooling)、全连接层(FC(Full Connection))下面是各个层的详细解释。

卷积,尤其是图像的卷积,需要一个滤波器,用滤波器对整个图像进行遍历,我们假设有一个32*32*3的原始图像A,滤波器的尺寸为5*5*3,用w表示,滤波器中的数据就是CNN的参数的一部分,那么在使用滤波器w对A进行滤波的话,可以用下面的式子表示:

其中x为原始图像的5*5*3的一部分,b是偏置项置为1。在对A进行滤波之后,产生的是一个28*28*1的数据。那么假设我们存在6个滤波器,这六个滤波器之间彼此是独立的,也就是他们内部的数据是不同的且没有相关性的。可以理解为一个滤波器查找整幅图像的垂直边缘,一个查找水平边缘,一个查找红色,一个查找黑色这样。那么我就可以产生6个28*28*1的数据,将它们组合到一起就可以产生28*28*6的数据,这就是卷积层主要做的工作。

CNN可以看作一系列的卷积层和ReLU层对原始数据结构进行处理的神经网络,处理的过程可以用下面这幅图表示

特别要注意的是滤波器的深度一定要与上一层传来的数据的深度相同,就像上图的第二个卷积层在处理传来的28*28*6的数据时要使用5*5*6的滤波器.

滤波器在图像上不断移动对图像滤波,自然存在步长的问题,在上面我们举的例子都是步长为1的情况,如果步长为3的话,32*32*3的图像经过5*5*3的滤波器卷积得到的大小是(32-5)/3+1=10, 注:步长不能为2因为(32-5)/2+1=14.5是小数。

所以当图像大小是N,滤波器尺寸为F时,步长S,那么卷积后大小为(N-F)/S+1

我们从上面的图中可以看到图像的长和宽在逐渐的减小,在经过超过5层之后极可能只剩下1*1的空间尺度,这样是十分不好的,而且也不利于我们接下来的计算,所以我们想让卷积层处理完之后图像在空间尺度上大小不变,所以我们引入了pad the border的操作。pad其实就是在图像周围补0,扩大图像的尺寸,使得卷积后图像大小不变。在CNN中,主要存在4个超参数,滤波器个数K,滤波器大小F,pad大小P和步长S,其中P是整数,当P=1时,对原始数据的操作如图所示:

那么在pad操作后卷积后的图像大小为:(N-F+2*P)/S+1
而要想让卷积层处理后图像空间尺度不变,P的值可以设为P=(F-1)/2

卷积层输入W 1 *H 1 *D 1 大小的数据,输出W 2 *H 2 *D 2 的数据,此时的卷积层共有4个超参数:
K:滤波器个数
P:pad属性值
S:滤波器每次移动的步长
F:滤波器尺寸
此时输出的大小可以用输入和超参计算得到:
W 2 =(W 1 -F+2P)/S+1
H 2 =(H 1 -F+2P)/S+1
D 2 =D 1

1*1的滤波器也是有意义的,它在深度方向做卷积,例如1*1*64的滤波器对56*56*64的数据卷积得到56*56的数据

F通常是奇数,这样可以综合考虑上下左右四个方向的数据。

卷积层从神经元的角度看待可以有两个性质: 参数共享和局域连接 。对待一个滤波器,例如5*5*3的一个滤波器,对32*32*3的数据卷积得到28*28的数据,可以看作存在28*28个神经元,每个对原图像5*5*3的区域进行计算,这28*28个神经元由于使用同一个滤波器,所以参数相同,我们称这一特性为 参数共享

针对不同的滤波器,我们可以看到他们会看到同一区域的图像,相当于在深度方向存在多个神经元,他们看着相同区域叫做 局域连接

参数共享减少了参数的数量,防止了过拟合
局域连接为查找不同特征更丰富的表现图像提供了可能。
卷积就像是对原图像的另一种表达。

激活函数,对于每一个维度经过ReLU函数输出即可。不改变数据的空间尺度。

通过pad操作,输出图像在控件上并没有变化,但是深度发生了变化,越来越庞大的数据给计算带来了困难,也出现了冗余的特征,所以需要进行池化操作,池化不改变深度,只改变长宽,主要有最大值和均值两种方法,一般的池化滤波器大小F为2步长为2,对于最大值池化可以用下面的图像清晰的表示:

卷积层输入W 1 *H 1 *D 1 大小的数据,输出W 2 *H 2 *D 2 的数据,此时的卷积层共有2个超参数:
S:滤波器每次移动的步长
F:滤波器尺寸
此时输出的大小可以用输入和超参计算得到:
W 2 =(W 1 -F)/S+1
H 2 =(H 1 -F)/S+1
D 2 =D 1

将最后一层(CONV、ReLU或Pool)处理后的数据输入全连接层,对于W 2 *H 2 *D 2 数据,我们将其展成1*1*W 2 *H 2 *D 2 大小的数据,输入层共有W 2 *H 2 *D 2 个神经元,最后根据问题确定输出层的规模,输出层可以用softmax表示。也就是说,全连接层就是一个常见的BP神经网络。而这个网络也是参数最多的部分,是接下来想要去掉的部分。完整的神经网络可以用下面的图表示:

[(CONV-ReLU)*N-POOL?]*M-(FC-RELU)*K,SoftMax

1.更小的滤波器与更深的网络
2.只有CONV层而去掉池化与全链接

最早的CNN,用于识别邮编,结构为:
CONV-POOL-CONV-POOL-CONV-FC
滤波器大小5*5,步长为1,池化层2*2,步长为2

2012年由于GPU技术所限,原始AlexNet为两个GPU分开计算,这里介绍合起来的结构。

输入图像为227*227*3

1.首次使用ReLU
2.使用Norm layers,现在已经抛弃,因为效果不大
3.数据经过预处理(例如大小变化,颜色变化等)
4.失活比率0.5
5.batch size 128
6.SGD Momentum 参数0.9(SGD和Momentum见我的其他文章)
7.学习速率 0.01,准确率不在提升时减少10倍,1-2次后达到收敛
8.L2权重减少0.0005
9.错误率15.4%

改进自AlexNet,主要改变:
1.CONV1的滤波器从11*11步长S=4改为7*7步长为2.
2.CONV3,4,5滤波器数量有384,384,256改为512,1024,512(滤波器数量为2的n次幂有利于计算机计算可以提高效率)
错误率:14.8%后继续改进至11.2%

当前最好的最易用的CNN网络,所有卷积层滤波器的大小均为3*3,步长为1,pad=1,池化层为2*2的最大值池化,S=2。

主要参数来自全连接层,这也是想要去掉FC的原因。

具有高度的统一性和线性的组合,易于理解,十分方便有VGG-16,VGG-19等多种结构。
错误率7.3%

完全移除FC层,参数只有500万,使用Inception模块(不太理解,有时间继续看)
准确率6.67%

准确率3.6%
拥有极深的网络结构,且越深准确率越高。是传统CNN不具备的特点,传统CNN并非越深越准确。需要训练时间较长但是快于VGG

1.每个卷积层使用Batch Normalization
2.Xavier/2初始化
3.SGD+Momentum(0.9)
4.Learning rate:0.1,准确率不变减小10倍(因为Batch Normalization所以比AlexNet大)
5.mini-batch size 256
6.Weight decay of 0.00001
7.不适用失活(因为Batch Normalization)

具体的梯度过程学完ResNet再说吧。

❼ 卷积神经网络

1、二维互相关运算

二维互相关(cross-correlation)运算的输入是一个二维输入数组和一个二维核(kernel)数组,输出也是一个二维数组,其中核数组通常称为卷积核或过滤器(filter)。卷积核的尺寸通常小于输入数组,卷积核在输入数组上滑动,在每个位置上,卷积核与该位置处的输入子数组按元素相乘并求和,得到输出数组中相应位置的元素。图1展示了一个互相关运算的例子,阴影部分分别是输入的第一个计算区域、核数组以及对应的输出。

2、二维卷积层

卷积层得名于卷积运算,但卷积层中用到的并非卷积运算而是互相关运算。我们将核数组上下翻转、左右翻转,再与输入数组做互相关运算,这一过程就是卷积运算。由于卷积层的核数组是可学习的,所以使用互相关运算与使用卷积运算并无本质区别。

二维卷积层将输入和卷积核做互相关运算,并加上一个标量偏置来得到输出。卷积层的模型参数包括卷积核和标量偏置。

3、特征图与感受野

二维卷积层输出的二维数组可以看作是输入在空间维度(宽和高)上某一级的表征,也叫特征图(feature map)。影响元素x的前向计算的所有可能输入区域(可能大于输入的实际尺寸)叫做x的感受野(receptive field)。

以图1为例,输入中阴影部分的四个元素是输出中阴影部分元素的感受野。我们将图中形状为2×2的输出记为Y,将Y与另一个形状为2×2的核数组做互相关运算,输出单个元素z。那么,z在Y上的感受野包括Y的全部四个元素,在输入上的感受野包括其中全部9个元素。可见,我们可以通过更深的卷积神经网络使特征图中单个元素的感受野变得更加广阔,从而捕捉输入上更大尺寸的特征。

4、填充和步幅

我们介绍卷积层的两个超参数,即填充和步幅,它们可以对给定形状的输入和卷积核改变输出形状。

4.1 填充(padding)

是指在输入高和宽的两侧填充元素(通常是0元素),图2里我们在原输入高和宽的两侧分别添加了值为0的元素。

如果原输入的高和宽是 和 ,卷积核的高和宽是 和 ,在高的两侧一共填充 行,在宽的两侧一共填充 列,则输出形状为:

                                                               )

我们在卷积神经网络中使用奇数高宽的核,比如3×3,5×5的卷积核,对于高度(或宽度)为大小为2k+1的核,令步幅为1,在高(或宽)两侧选择大小为k的填充,便可保持输入与输出尺寸相同。

4.2 步幅(stride)

在互相关运算中,卷积核在输入数组上滑动,每次滑动的行数与列数即是步幅(stride)。此前我们使用的步幅都是1,图3展示了在高上步幅为3、在宽上步幅为2的二维互相关运算。

一般来说,当高上步幅为 ,宽上步幅为 时,输出形状为:

                                         

如果  ,那么输出形状将简化为:

                                                          

更进一步,如果输入的高和宽能分别被高和宽上的步幅整除,那么输出形状将是:(nh/sh)×(nw/sw)

                                                                              

当 时,我们称填充为p;当 时,我们称步幅为s。

5、多输入通道和多输出通道

之前的输入和输出都是二维数组,但真实数据的维度经常更高。例如,彩色图像在高和宽2个维度外还有RGB(红、绿、蓝)3个颜色通道。假设彩色图像的高和宽分别是h和w(像素),那么它可以表示为一个3×h×w的多维数组,我们将大小为3的这一维称为通道(channel)维。

5.1 多输入通道

卷积层的输入可以包含多个通道,图4展示了一个含2个输入通道的二维互相关计算的例子。

5.2 多输出通道

卷积层的输出也可以包含多个通道,设卷积核输入通道数和输出通道数分别为ci和co,高和宽分别为kh和kw。如果希望得到含多个通道的输出,我们可以为每个输出通道分别创建形状为ci×kh×kw的核数组,将它们在输出通道维上连结,卷积核的形状即co×ci×kh×kw。

对于输出通道的卷积核,我们提供这样一种理解,一个ci×kh×kw的核数组可以提取某种局部特征,但是输入可能具有相当丰富的特征,我们需要有多个这样的ci×kh×kw的核数组,不同的核数组提取的是不同的特征。

5.3 1x1卷积层

最后讨论形状为1×1的卷积核,我们通常称这样的卷积运算为1×1卷积,称包含这种卷积核的卷积层为1×1卷积层。图5展示了使用输入通道数为3、输出通道数为2的1×1卷积核的互相关计算。

1×1卷积核可在不改变高宽的情况下,调整通道数。1×1卷积核不识别高和宽维度上相邻元素构成的模式,其主要计算发生在通道维上。假设我们将通道维当作特征维,将高和宽维度上的元素当成数据样本,那么1×1卷积层的作用与全连接层等价。

6、卷积层与全连接层的对比

二维卷积层经常用于处理图像,与此前的全连接层相比,它主要有两个优势:

一是全连接层把图像展平成一个向量,在输入图像上相邻的元素可能因为展平操作不再相邻,网络难以捕捉局部信息。而卷积层的设计,天然地具有提取局部信息的能力。

二是卷积层的参数量更少。不考虑偏置的情况下,一个形状为(ci,co,h,w)的卷积核的参数量是ci×co×h×w,与输入图像的宽高无关。假如一个卷积层的输入和输出形状分别是(c1,h1,w1)和(c2,h2,w2),如果要用全连接层进行连接,参数数量就是c1×c2×h1×w1×h2×w2。使用卷积层可以以较少的参数数量来处理更大的图像。

X=torch.rand(4,2,3,5)

print(X.shape)

conv2d=nn.Conv2d(in_channels=2,out_channels=3,kernel_size=(3,5),stride=1,padding=(1,2))

Y=conv2d(X)

print('Y.shape: ',Y.shape)

print('weight.shape: ',conv2d.weight.shape)

print('bias.shape: ',conv2d.bias.shape)

输出:

torch.Size([4, 2, 3, 5])

Y.shape:  torch.Size([4, 3, 3, 5])

weight.shape:  torch.Size([3, 2, 3, 5])

bias.shape:  torch.Size([3])

7、池化

7.1 二维池化层

池化层主要用于缓解卷积层对位置的过度敏感性。同卷积层一样,池化层每次对输入数据的一个固定形状窗口(又称池化窗口)中的元素计算输出,池化层直接计算池化窗口内元素的最大值或者平均值,该运算也分别叫做最大池化或平均池化。图6展示了池化窗口形状为2×2的最大池化。

二维平均池化的工作原理与二维最大池化类似,但将最大运算符替换成平均运算符。池化窗口形状为p×q的池化层称为p×q池化层,其中的池化运算叫作p×q池化。

池化层也可以在输入的高和宽两侧填充并调整窗口的移动步幅来改变输出形状。池化层填充和步幅与卷积层填充和步幅的工作机制一样。

在处理多通道输入数据时,池化层对每个输入通道分别池化,但不会像卷积层那样将各通道的结果按通道相加。这意味着池化层的输出通道数与输入通道数相等。

CNN网络中另外一个不可导的环节就是Pooling池化操作,因为Pooling操作使得feature map的尺寸变化,假如做2×2的池化,假设那么第l+1层的feature map有16个梯度,那么第l层就会有64个梯度,这使得梯度无法对位的进行传播下去。其实解决这个问题的思想也很简单,就是把1个像素的梯度传递给4个像素,但是需要保证传递的loss(或者梯度)总和不变。根据这条原则,mean pooling和max pooling的反向传播也是不同的。

7.2 mean pooling

mean pooling的前向传播就是把一个patch中的值求取平均来做pooling,那么反向传播的过程也就是把某个元素的梯度等分为n份分配给前一层,这样就保证池化前后的梯度(残差)之和保持不变,还是比较理解的,图示如下:

mean pooling比较容易让人理解错的地方就是会简单的认为直接把梯度复制N遍之后直接反向传播回去,但是这样会造成loss之和变为原来的N倍,网络是会产生梯度爆炸的。

7.3 max pooling

max pooling也要满足梯度之和不变的原则,max pooling的前向传播是把patch中最大的值传递给后一层,而其他像素的值直接被舍弃掉。那么反向传播也就是把梯度直接传给前一层某一个像素,而其他像素不接受梯度,也就是为0。所以max pooling操作和mean pooling操作不同点在于需要记录下池化操作时到底哪个像素的值是最大,也就是max id。

源码中有一个max_idx_的变量,这个变量就是记录最大值所在位置的,因为在反向传播中要用到,那么假设前向传播和反向传播的过程就如下图所示。

7.4 Pytorch 实现池化层

我们使用Pytorch中的nn.MaxPool2d实现最大池化层,关注以下构造函数参数:

kernel_size – the size of the window to take a max over

stride – the stride of the window. Default value is kernel_size

padding – implicit zero padding to be added on both sides

forward函数的参数为一个四维张量,形状为 ,返回值也是一个四维张量,形状为 ,其中N是批量大小,C,H,W分别表示通道数、高度、宽度。

X=torch.arange(32,dtype=torch.float32).view(1,2,4,4)

pool2d=nn.MaxPool2d(kernel_size=3,padding=1,stride=(2,1))

Y=pool2d(X)

print(X)

print(Y)

练习

1、假如你用全连接层处理一张256 \times 256256×256的彩色(RGB)图像,输出包含1000个神经元,在使用偏置的情况下,参数数量是:

     答:图像展平后长度为3×256×256,权重参数和偏置参数的数量是3× 256× 256 × 1000 + 1000 =196609000。

2、假如你用全连接层处理一张256×256的彩色(RGB)图像,卷积核的高宽是3×3,输出包含10个通道,在使用偏置的情况下,这个卷积层共有多少个参数:

    答:输入通道数是3,输出通道数是10,所以参数数量是10×3×3×3+10=280。

3、conv2d = nn.Conv2d(in_channels=3, out_channels=4, kernel_size=3, padding=2),输入一张形状为3×100×100的图像,输出的形状为:

    答:输出通道数是4,上下两侧总共填充4行,卷积核高度是3,所以输出的高度是104 - 3 + 1=102104−3+1=102,宽度同理可得。

4、关于卷积层,以下哪种说法是错误的:

A.1×1卷积可以看作是通道维上的全连接

B.某个二维卷积层用于处理形状为3×100×100的输入,则该卷积层无法处理形状为3×256×256的输入

C.卷积层通过填充、步幅、输入通道数、输出通道数等调节输出的形状

D .两个连续的3×3卷积核的感受野与一个5×5卷积核的感受野相同

答:选B,对于高宽维度,只要输入的高宽(填充后的)大于或等于卷积核的高宽即可进行计算。

the first layer is a 3 × 3 convolution, the second is a fully connected layer on top of the 3 × 3 output grid of the first layer (see Figure 1). Sliding this small network over the input activation grid boils down to replacing the 5 × 5 convolution with two layers of 3 × 3 convolution.

我们假设图片是5*5的

我们使用5*5的卷积核对其卷积,步长为1,得到的结果是:(5-5)/1+1=1

然后我们使用2个卷积核为3*3的,这里的两个是指2层:

第一层3*3:

得到的结果是(5-3)/1+1=3

第二层3*3:

得到的结果是(3-3)/1+1=1

所以我们的最终得到结果感受野大小和用5*5的卷积核得到的结果大小是一样的!!!

5、关于池化层,以下哪种说法是错误的:

A.池化层不参与反向传播

B.池化层没有模型参数

C.池化层通常会减小特征图的高和宽

D.池化层的输入和输出具有相同的通道数

答:A

选项1:错误,池化层有参与模型的正向计算,同样也会参与反向传播

选项2:正确,池化层直接对窗口内的元素求最大值或平均值,并没有模型参数参与计算

选项3:正确

选项4:正确

参考文献:

https://www.boyuai.com/

https://blog.csdn.net/qq_21578849/article/details/94667699

https://www.hu.com/question/265791259/answer/298610437

https://blog.csdn.net/zouxiaolv/article/details/97366681

❽ 卷积神经网络——卷积层、池化层和激活函数

2018年11月20日,在看tensorflow的时候发现还是有很多概念没有理解透彻,发现一个很赞的资源(估计大家都知道的,只有我现在才发现),吴恩达老师在网易云课堂上开的深度学习的 课程 ,感觉很赞.本文实际上是吴恩达卷积神经网络视频学习笔记。

2019年2月14日,再次温故这部分的内容,添加了1.1章节的自问自答,添加了对池化层实现反向传播的方式,添加了激活函数relu和sigmoid的对比。

通过一个3 * 3的每列值相同、第一列为1,第二列为0,第三列为-1的过滤器可以检测垂直的边沿。注意到1表示亮,-1表示暗。这样可以发现正负值的边沿。
对于垂直边缘过滤器而言,重要的是中间一列为0,左右两列的值可以相差尽可能的大。
这个过滤器的数值也是可以通过反向传播算法学习的,不一定需要在算法开始之前就决定。
深度学习甚至可以去学习其他的边沿,无论是45度、73度乃至是其他的角度,虽然比手工要复杂一些,但是确实具有这样的能力。

为什么需要填充?大家都知道,卷积就是用过滤器(f x f)从左到右、从上到下的扫描一个矩阵(n x n)。有两种卷积操作,一种称为valid-conv,一种称为same-conv。每次卷积的时候,过滤器右侧碰到矩阵右边界就结束当前行的扫描,下侧碰到矩阵下边界就结束扫描,因此通过过滤器的图像都会缩小,变为(n-f+1) * (n-f+1)。valid-conv就是这样的卷积操作,而same-conv会在卷积之前填充原始图,使得卷积之后的大小不变。

一般来说,若原图像大小为n * n,过滤器大小为f * f,那么需要padding的大小为p=(f-1)/2。一般来说我们会设置f为奇数,很少看见偶数的过滤器。其中的原因之一就是为了对称填充。另一个原因可能是一般需要将过滤器的中间点用于定位卷积的位置,而偶数过滤器没有中间点。

上面的提到的卷积过程每次只移动一步。实际上过滤器可以移动不止一步,用s表示步长。那么n x n的矩阵输入, f x f的过滤器, p填充padding,以及s步长的情况下,输出的矩阵大小为 (n+2p-f)/2+1 x (n+2p-f)/2+1 ,这里是向下取整的,这意味过滤器只能在输入图像内部移动,不可以移动出边缘。

注意 在tensorflow中,有两种填充方式,一种是same,一种是valid。same是填充,而valid是不填充。如果遇到valid,那么实际计算矩阵大小的时候,是向上取整,而不是这里提到的向下取整。如果是same模式,那么最后的矩阵形状是n/s,也是向上取整

上面提到的卷积的输入是n x n的,这一般是灰度图像。对应彩色图像则存在RGB三个颜色channel,这样的图片是n x n x 3。此时的过滤器也必须存在第三个维度,即channel维度,且一个过滤器的channel维度必须和输入的channel维度一致。这样的卷积结果就是三个维度上,过滤器和输入的重叠位置乘积之和。最后的输出是(n - f + 1) x ( n - f +1)的。 注意,输出是二维的

我们可以使用N个不同的过滤器得到不同的N个二维输出,按照输入的格式将其叠起来,这样输出就是 (n - f + 1) x ( n - f +1) x N了。

在上面一节中已经讲了如何得到输入和一个过滤器卷积之后的结果。通常会给卷积的结果添加一个偏执,然后使用非线性的函数进行处理,得到的就是这层网络的输出。将过滤器的参数标记为W,偏置为 b(一个channel的输出矩阵Wa的偏置是一个实数,而非一个矩阵。一个layer的偏置b的维度和通道数channel一致) , 输入数据为上层的激活值。这样每个过滤器处理之后的结果就可以看成是经过了该layer一个节点之后的输出。

下面是每层的符号标记,以及根据上一层计算下一层输入大小的公式,右下角是使用BP学习更新的时候参数更新的次数。可以看到每层的参数的个数只和这层的filter的大小、数目有关,而和输入的规模无关。这样就可以通过控制参数的数量避免过拟合了。

可以从下面的课件中看到,卷积神经网络的趋势是长度和高度逐渐减少,而channel逐渐加深。最后一层会将卷积层平铺开来,形成一个全连接。全连接层会连接到最后一个判别函数上,判别函数可以是logistic或者softmax层,用于输出类别或者概率。

一般情况下,卷积网络除了卷积层之外,还会有池化层和全连接层,这些层可以提供更好的学习。

池化层一般在卷积层之后,可以也可以看成一个过滤器,实际上实现的一个采样的功能,其主要的思想是,着重提取具有某种倾向的特征,比如最大池化对应的是更显着的特征;平均池化对应的是更加平滑的特征。过滤器有几点不同

一般常用的池化层有max_pooling和average_pooling.max_pooling更加常用。 ,最大池化层意味着检测某个特征,并始终将这个特征留在池化层的输出中

池化层的输入n x n x nc,过滤器 f x f,步长s,输出 ((n-f)/s+1) x ((n-f)/s+1) * nc。
一般取s=2,这意味着输入的长宽减小一半。

比较好奇的一个问题是,池化层的存在对反向传播有什么影响?我们都知道在传统的神经网络中,反向传播算法实际上就是利用函数的梯度进行反向传播的,那么池化层这种既改变了矩阵大小又不好求导的情况,怎么处理呢?
(下面的内容来自 迷川浩浩_ZJU 的博客 )

mean pooling的前向传播就是把一个patch中的值求取平均来做pooling,那么反向传播的过程也就是把某个元素的梯度等分为n份分配给前一层,这样就保证池化前后的梯度(残差)之和保持不变,还是比较理解的。mean pooling比较容易让人理解错的地方就是会简单的认为直接把梯度复制N遍之后直接反向传播回去,但是这样会造成loss之和变为原来的N倍,网络是会产生梯度爆炸的。

2、max pooling

max pooling也要满足梯度之和不变的原则,max pooling的前向传播是把patch中最大的值传递给后一层,而其他像素的值直接被舍弃掉。那么反向传播也就是把梯度直接传给前一层某一个像素,而其他像素不接受梯度,也就是为0。所以max pooling操作和mean pooling操作不同点在于需要记录下池化操作时到底哪个像素的值是最大,也就是max id

一般概念上的一层包括卷积层和池化层,之所以不把池化层当做新的一层是因为池化层没有需要学习的参数,一般意义上的layer是有权重和参数需要学习的。

尽量不要自己设置超参数,而是尽量参考别人论文里面使用的超参数,选择一个在别人任务中效果很好的超参数。

下面的表中列举了上面的网络每一层的数据规模a^(l)以及参数数量。可以发现数据的规模逐渐减小。主卷积层的参数比较少,而进入全连接层之后参数数量很大。(表格中最后三列的参数数量可能存在错误,应该是48000 + 120, 120 * 84 + 84, 84 * 10 + 10)

以上的两个特征可以明显的减少参数。减少过拟合

(内容来自 迷川浩浩_ZJU 的博客 )
常用的激活函数有sigmoid函数和relu函数.
Relu(x)={if x>0 then x;else 0}为了在反向传播算法中可以正常使用,将其在x=0x=0处的导数置为1,所以它的导数也就变为了 δRelu(x)={if x>0 then 1 else 0}
Relu是一个非常优秀的激活哈数,相比较于传统的Sigmoid函数,有三个作用

❾ 构建ResNet卷积神经网络

2015年,微软亚洲研究院的何凯明团队发布了一种特殊的卷积神经网络——残差神经网络(ResNet)。在残差神经网络出现之前,最深的深度神经网络只有二三十层左右,这该神经网络却可以在实验中轻松达到上百层甚至上千层,另外不会占用过多训练时间,也正因如此,图像识别准确率有了显着增强。此模型更是在同年的ImageNet大赛中,获得图像分类、定位、检测三个项目的冠军。在国际大赛上取得如此优异的成绩,证明了残差神经网络是个实用性强且优异的模型。在本研究中的猫狗二分类的实验中,也是基于残差神经网络来构建分类模型的。
在本文中我们将把kaggle猫狗数据集应用于ResNet-18和ResNet-50网络模型。使用Resnet来探究当前使用卷积神经网络的准确率。如图4-1为ResNet的经典网络结构图——ResNet-18。

ResNet-18都是由BasicBlock组成,从图4-2也可得知50层及以上的ResNet网络模型由BottleBlock组成。在我们就需要将我们预处理过的数据集放入现有的Resnet-18和ResNet-50模型中去训练,首先我们通过前面提到的图像预处理把训练图像裁剪成一个96x96的正方形尺寸,然后输入到我们的模型中,这里就介绍一下ResNet-18的网络模型的结构,因为ResNet50与第五章的ResNet-34模型结构相仿。
ResNet-18的模型结构为:首先第一层是一个7×7的卷积核,输入特征矩阵为[112,112,64],经过卷积核64,stride为2得到出入特征矩阵[56,56,64]。第二层一开始是由一个3×3的池化层组成的,接着是2个残差结构,一开始的输入的特征矩阵为[56,56,64],需要输出的特征矩阵shape为[28,28,128], 然而主分支与shortcut的输出特征矩阵shape必须相同,所以[56,56,64]这个特征矩阵的高和宽从56通过主分支的stride为2来缩减为原来的一半即为28,再通过128个卷积核来改变特征矩阵的深度。然而这里的shortcut加上了一个1x1的卷积核,stride也为2,通过这个stride,输入的特征矩阵的宽和高也缩减为原有的一半,同时通过128个卷积核将输入的特征矩阵的深度也变为了128。第三层,有2个残差结构,输入的特征矩阵shape是[28,28,128],输出特征矩阵shape是[14,14,256], 然而主分支与shortcut的输出特征矩阵shape必须相同,所以[14,14,256]这个特征矩阵的高和宽从14通过主分支的stride为2来缩减为原来的一半即为7,再通过128个卷积核来改变特征矩阵的深度。然而这里的shortcut加上了一个1×1的卷积核,stride也为2,通过这个stride,输入的特征矩阵的宽和高也缩减为原有的一半,同时通过256个卷积核将输入的特征矩阵的深度也变为了256。第四层,有2个残差结构,经过上述的相同的变化过程得到输出的特征矩阵为[7,7,512]。第五层,有2个残差结构, 经过上述的相同的变化过程得到输出的特征矩阵为[1,1,512]。接着是平均池化和全连接层。

❿ 卷积神经网络

关于花书中卷积网络的笔记记录于 https://www.jianshu.com/p/5a3c90ea0807 。

卷积神经网络(Convolutional Neural Network,CNN或ConvNet)是一种具有 局部连接、权重共享 等特性的深层前馈神经网络。卷积神经网络是受生物学上感受野的机制而提出。 感受野(Receptive Field) 主要是指听觉、视觉等神经系统中一些神经元的特性,即 神经元只接受其所支配的刺激区域内的信号

卷积神经网络最早是主要用来处理图像信息。如果用全连接前馈网络来处理图像时,会存在以下两个问题:

目前的卷积神经网络一般是由卷积层、汇聚层和全连接层交叉堆叠而成的前馈神经网络,使用反向传播算法进行训练。 卷积神经网络有三个结构上的特性:局部连接,权重共享以及汇聚 。这些特性使卷积神经网络具有一定程度上的平移、缩放和旋转不变性。

卷积(Convolution)是分析数学中一种重要的运算。在信号处理或图像处理中,经常使用一维或二维卷积。

一维卷积经常用在信号处理中,用于计算信号的延迟累积。假设一个信号发生器每个时刻t 产生一个信号 ,其信息的衰减率为 ,即在 个时间步长后,信息为原来的 倍。假设 ,那么在时刻t收到的信号 为当前时刻产生的信息和以前时刻延迟信息的叠加:

我们把 称为 滤波器(Filter)或卷积核(Convolution Kernel) 。假设滤波器长度为 ,它和一个信号序列 的卷积为:

信号序列 和滤波器 的卷积定义为:

一般情况下滤波器的长度 远小于信号序列长度 ,下图给出一个一维卷积示例,滤波器为 :

二维卷积经常用在图像处理中。因为图像为一个两维结构,所以需要将一维卷积进行扩展。给定一个图像 和滤波器 ,其卷积为:

下图给出一个二维卷积示例:

注意这里的卷积运算并不是在图像中框定卷积核大小的方框并将各像素值与卷积核各个元素相乘并加和,而是先把卷积核旋转180度,再做上述运算。

在图像处理中,卷积经常作为特征提取的有效方法。一幅图像在经过卷积操作后得到结果称为 特征映射(Feature Map)

最上面的滤波器是常用的高斯滤波器,可以用来对图像进行 平滑去噪 ;中间和最下面的过滤器可以用来 提取边缘特征

在机器学习和图像处理领域,卷积的主要功能是在一个图像(或某种特征)上滑动一个卷积核(即滤波器),通过卷积操作得到一组新的特征。在计算卷积的过程中,需要进行卷积核翻转(即上文提到的旋转180度)。 在具体实现上,一般会以互相关操作来代替卷积,从而会减少一些不必要的操作或开销。

互相关(Cross-Correlation)是一个衡量两个序列相关性的函数,通常是用滑动窗口的点积计算来实现 。给定一个图像 和卷积核 ,它们的互相关为:

互相关和卷积的区别仅在于卷积核是否进行翻转。因此互相关也可以称为不翻转卷积 。当卷积核是可学习的参数时,卷积和互相关是等价的。因此,为了实现上(或描述上)的方便起见,我们用互相关来代替卷积。事实上,很多深度学习工具中卷积操作其实都是互相关操作。

在卷积的标准定义基础上,还可以引入滤波器的 滑动步长 零填充 来增加卷积多样性,更灵活地进行特征抽取。

滤波器的步长(Stride)是指滤波器在滑动时的时间间隔。

零填充(Zero Padding)是在输入向量两端进行补零。

假设卷积层的输入神经元个数为 ,卷积大小为 ,步长为 ,神经元两端各填补 个零,那么该卷积层的神经元数量为 。

一般常用的卷积有以下三类:

因为卷积网络的训练也是基于反向传播算法,因此我们重点关注卷积的导数性质:

假设 。

, , 。函数 为一个标量函数。

则由 有:

可以看出, 关于 的偏导数为 和 的卷积

同理得到:

当 或 时, ,即相当于对 进行 的零填充。从而 关于 的偏导数为 和 的宽卷积

用互相关的“卷积”表示,即为(注意 宽卷积运算具有交换性性质 ):

在全连接前馈神经网络中,如果第 层有 个神经元,第 层有 个神经元,连接边有 个,也就是权重矩阵有 个参数。当 和 都很大时,权重矩阵的参数非常多,训练的效率会非常低。

如果采用卷积来代替全连接,第 层的净输入 为第 层活性值 和滤波器 的卷积,即:

根据卷积的定义,卷积层有两个很重要的性质:

由于局部连接和权重共享,卷积层的参数只有一个m维的权重 和1维的偏置 ,共 个参数。参数个数和神经元的数量无关。此外,第 层的神经元个数不是任意选择的,而是满足 。

卷积层的作用是提取一个局部区域的特征,不同的卷积核相当于不同的特征提取器。

特征映射(Feature Map)为一幅图像(或其它特征映射)在经过卷积提取到的特征,每个特征映射可以作为一类抽取的图像特征。 为了提高卷积网络的表示能力,可以在每一层使用多个不同的特征映射,以更好地表示图像的特征。

在输入层,特征映射就是图像本身。如果是灰度图像,就是有一个特征映射,深度 ;如果是彩色图像,分别有RGB三个颜色通道的特征映射,深度 。

不失一般性,假设一个卷积层的结构如下:

为了计算输出特征映射 ,用卷积核 分别对输入特征映射 进行卷积,然后将卷积结果相加,并加上一个标量偏置 得到卷积层的净输入 再经过非线性激活函数后得到输出特征映射 。

在输入为 ,输出为 的卷积层中,每个输出特征映射都需要 个滤波器以及一个偏置。假设每个滤波器的大小为 ,那么共需要 个参数。

汇聚层(Pooling Layer)也叫子采样层(Subsampling Layer),其作用是进行特征选择,降低特征数量,并从而减少参数数量。

常用的汇聚函数有两种:

其中 为区域 内每个神经元的激活值。

可以看出,汇聚层不但可以有效地减少神经元的数量,还可以使得网络对一些小的局部形态改变保持不变性,并拥有更大的感受野。

典型的汇聚层是将每个特征映射划分为 大小的不重叠区域,然后使用最大汇聚的方式进行下采样。汇聚层也可以看做是一个特殊的卷积层,卷积核大小为 ,步长为 ,卷积核为 函数或 函数。过大的采样区域会急剧减少神经元的数量,会造成过多的信息损失。

一个典型的卷积网络是由卷积层、汇聚层、全连接层交叉堆叠而成。

目前常用卷积网络结构如图所示,一个卷积块为连续 个卷积层和 个汇聚层( 通常设置为 , 为 或 )。一个卷积网络中可以堆叠 个连续的卷积块,然后在后面接着 个全连接层( 的取值区间比较大,比如 或者更大; 一般为 )。

目前,整个网络结构 趋向于使用更小的卷积核(比如 和 )以及更深的结构(比如层数大于50) 。此外,由于卷积的操作性越来越灵活(比如不同的步长),汇聚层的作用变得也越来越小,因此目前比较流行的卷积网络中, 汇聚层的比例也逐渐降低,趋向于全卷积网络

在全连接前馈神经网络中,梯度主要通过每一层的误差项 进行反向传播,并进一步计算每层参数的梯度。在卷积神经网络中,主要有两种不同功能的神经层:卷积层和汇聚层。而参数为卷积核以及偏置,因此 只需要计算卷积层中参数的梯度。

不失一般性,第 层为卷积层,第 层的输入特征映射为 ,通过卷积计算得到第 层的特征映射净输入 ,第 层的第 个特征映射净输入

由 得:

同理可得,损失函数关于第 层的第 个偏置 的偏导数为:

在卷积网络中,每层参数的梯度依赖其所在层的误差项 。

卷积层和汇聚层中,误差项的计算有所不同,因此我们分别计算其误差项。

第 层的第 个特征映射的误差项 的具体推导过程如下:

其中 为第 层使用的激活函数导数, 为上采样函数(upsampling),与汇聚层中使用的下采样操作刚好相反。如果下采样是最大汇聚(max pooling),误差项 中每个值会直接传递到上一层对应区域中的最大值所对应的神经元,该区域中其它神经元的误差项的都设为0。如果下采样是平均汇聚(meanpooling),误差项 中每个值会被平均分配到上一层对应区域中的所有神经元上。

第 层的第 个特征映射的误差项 的具体推导过程如下:

其中 为宽卷积。

LeNet-5虽然提出的时间比较早,但是是一个非常成功的神经网络模型。基于LeNet-5 的手写数字识别系统在90年代被美国很多银行使用,用来识别支票上面的手写数字。LeNet-5 的网络结构如图:

不计输入层,LeNet-5共有7层,每一层的结构为:

AlexNet是第一个现代深度卷积网络模型,其首次使用了很多现代深度卷积网络的一些技术方法,比如采用了ReLU作为非线性激活函数,使用Dropout防止过拟合,使用数据增强来提高模型准确率等。AlexNet 赢得了2012 年ImageNet 图像分类竞赛的冠军。

AlexNet的结构如图,包括5个卷积层、3个全连接层和1个softmax层。因为网络规模超出了当时的单个GPU的内存限制,AlexNet 将网络拆为两半,分别放在两个GPU上,GPU间只在某些层(比如第3层)进行通讯。

AlexNet的具体结构如下:

在卷积网络中,如何设置卷积层的卷积核大小是一个十分关键的问题。 在Inception网络中,一个卷积层包含多个不同大小的卷积操作,称为Inception模块。Inception网络是由有多个inception模块和少量的汇聚层堆叠而成

v1版本的Inception模块,采用了4组平行的特征抽取方式,分别为1×1、3× 3、5×5的卷积和3×3的最大汇聚。同时,为了提高计算效率,减少参数数量,Inception模块在进行3×3、5×5的卷积之前、3×3的最大汇聚之后,进行一次1×1的卷积来减少特征映射的深度。如果输入特征映射之间存在冗余信息, 1×1的卷积相当于先进行一次特征抽取

阅读全文

与卷积网络怎么设置相关的资料

热点内容
网络共享中心没有网卡 浏览:521
电脑无法检测到网络代理 浏览:1374
笔记本电脑一天会用多少流量 浏览:574
苹果电脑整机转移新机 浏览:1376
突然无法连接工作网络 浏览:1057
联通网络怎么设置才好 浏览:1224
小区网络电脑怎么连接路由器 浏览:1032
p1108打印机网络共享 浏览:1212
怎么调节台式电脑护眼 浏览:694
深圳天虹苹果电脑 浏览:931
网络总是异常断开 浏览:612
中级配置台式电脑 浏览:989
中国网络安全的战士 浏览:630
同志网站在哪里 浏览:1413
版观看完整完结免费手机在线 浏览:1459
怎样切换默认数据网络设置 浏览:1110
肯德基无线网无法访问网络 浏览:1286
光纤猫怎么连接不上网络 浏览:1472
神武3手游网络连接 浏览:965
局网打印机网络共享 浏览:1000