深度学习之---卷积神经网络中各中操作的作用
【前馈神经网络】
- 前馈神经网络也叫做全连接网络。不过多介绍
- 缺点:
- 在图像识别中会将多维向量平铺成一维向量,会丢失像素点之间的距离关系。
- 无法将局部的权重应用到其他位置,带来的后果就是,如果在一个图像的右上角有一只猫,可以正确分类;当这只猫出现在左下角时,无法正确识别。
【局部连接】
- 所谓局部连接就是卷积神经网络。
- 卷积神经网络就是让权重在不同位置共享的神经网络。
- 如上图就是卷积运算,可以表示如下(两种不同的表达方式):
- 这是单通道、单卷积核下的计算方式。
- 每一次卷积运算,其实就是一次局部区域的线性组合,加上一个偏置后,得到下一层网络的一个神经元的输出。
【空间共享】
- 当卷积核扫到其他位置计算输出节点时,比如,是共用的。
- 要注意这里的空间共享是指的在高和宽方向上的共享,在通道数上并不共享。
- 空间共享也就是卷积神经网络所引入的先验知识。
【输出表达】
- 在前面说,前馈神经网络时说到,如果将图片向量表示,就失去了平面结构信息,因此在输出时,卷积神经网络依然保留了矩阵的排列方式。如下图:
- 其实,经过一个卷积计算后得到一个神经元,比如上面蓝色的0,这个神经元叫做“Convolved Feature”或“Activation Map”或“Feature Map”
【通道维的处理】
- 前面所说的通道都是1,也就是灰度图。其实,在应用中大多数是彩色图。也就是有RGB三个颜色通道。
问题:
- 卷积核的尺寸如果是2 x 2,那么一个2表示的高维度上的局部连接数,另一个2表示的宽维度上的局部连接数。在通道维上的局部连接数并没有给出表示。
解答:
- 在通道维上并不是局部连接,是全部连接,因此不需要指定。
注意:
- 假如有三个通道,那么在进行卷积运算时,会有三个完全独立的kernel,也就是卷积核都是独立的,分别在三个不同的通道进行计算,然后将计算后的结果进行加和,然后加上偏置项,得到最终的输出。
- 下面是计算的两种表达:
- 这样每个卷积核都在width维度、height维度上以局部连接和空间共享,并贯穿整个depth维度的方式得到一个Feature Map。
【padding】
- 大多时候是使用的zero-padding。也就是在输入数据的每个通道一周用0填充。如下图:
- 这样做的好处就是可以控制输出的形状,比如,4 x 4的图片被2 x 2的卷积核运算后,输出形状就变成了3 x 3的图片了(假设步幅为1)。每次卷积后都会小一圈,如果想控制图片的形状不变,那么就可以使用填充。
- 另一个好处就是避免图片的边缘信息被一步步舍弃的问题。
尺寸计算:
- 输出尺寸 = (input_size + 2* padding_size - filter_size)/stride + 1
- padding_size 表示的是单边补零的个数,比如,(4 + 2 * 1- 3 )/ 1 + 1 = 4
【多个卷积核】
- 卷积核在很多地方也叫做滤波器,filter。
- 同一个图片,不同的滤波器得到的结果也是不一样的,比如对太阳光的折射,红色的镜片滤过之后是红光;绿色的镜片滤过之后是绿光。如下图也是同样的道理,不同的kernel,会探测到不同的概念。
- 每个filter可以抓取探测特定概念的存在,那么这样输入是一个长方体,输出也是一个长方体了,不同的filter不能够在像上面那种运算一样,全部贯穿到一个神经元上,而是层叠输出,如下图:
- 上面是输入,下面是输出。
【**函数】
- 和前馈神经网络一样,卷积是局部线性组合和偏置的线性组合,经过非线性**函数增强模型的拟合能力。
- 如下图,将卷积后的Feature Map经过ReLU变换后得到的输出就如下图。
【输出形状和参数个数】
- 现在知道了输入是一个长方体,也就是有width、height、depth,那么输出的长方体是由哪些因素决定的?
- 因素:
- filter个数:影响depth
- filter_size :影响width、height
- stride:影响width、height
- zero padding:影响width、height
- 下面给出具体的计算规则:
【矩阵乘法执行卷积】
- 常规的扫描计算方式,效率低下,且无法用GPU进行并行计算。
- 高效的运算方式是矢量计算。
- 矩阵乘法的意义,可以理解为批量的线性组合按顺序排列。
- 这样的逻辑就可应用在卷积运算,因为卷积计算就是一种线性组合;这样就需要两个大矩阵,一个是权重矩阵,一个是输入的矩阵。这样的话,按照业界的习惯可以写成:,一般大写字母表示矩阵,小写表示元素。
- 探讨一下两个矩阵的形状:
-
:
- 每一行表示每一个filter的权重,长度为
- 一共有K行
-
:
- 每一列是所有需要进行组合的节点,必须按顺序排列,通道之间是打通的。长度为
- 一共有行,表示每个filter要滑动多少次才能把这个图片扫描完。
-
:
- 最后得到的:
【pooling】
- 池化,一般卷积后会有**,还会有一个池化。
- 池化有多种,Maxpooling、averagepooling等。
- pooling的操作比较简单,不要参数控制,也就是说池化层不会有新的参数被学习。
- 如下maxpooling
- maxpooling的作用,先看下图的一个对比。
- maxpooling的主要功能是downsampling,下采样。但是这么做却不会损坏识别结果,这意味着卷积后的Feature Map中有对于识别物体不必要的冗余信息。
- 这样下采样的作用就是去除局部敏感性。只是保留区域内最大的像素点。
- maxpooling也有缺点,有些周边有用的信息会被丢弃掉。
【全连接层】
- 当有了足够多的特征了,就可以用这些特征进行图片的分类了。全连接层也叫做前馈层,就是可以用来将最后的输出映射到线性可分的空间。
- 通常卷积网络的最后会将末端得到的长方体平摊(flatten)成一个长长的向量,并送入全连接层配合输出层进行分类。
【机器学习简史】
【结构变迁】
- LeNet:第一个成功的卷积神经网络。
- AlexNet:类似LeNet,层次更深更大。使用了层叠的卷积来抓取特征(通常是一个卷积层马上一个maxpooling层)。
- ZF Net:增加了中间卷积层的尺寸,让第一层stride和filter size更小。
- VGG:只使用filter size = 3和pooling size = 2 从头到尾堆叠。
- GoogLeNet:较少参数数量,最后一层用局部平均代替了全连接。
- ResNet:引入了跨层连接和batch normalization
- DenseNet:将跨层连接从头进行到尾
【变迁的点】
- 使用small filter size的卷积层和pooling
- 去掉parameters过多的全连接层
- Inception的使用
- 跳层连接
【1 x 1卷积核】
- 如果卷积的输入输出都是一个平面,那么size = 1的filter没有太大的作用,因为只是进行了一个线性变换,并且完全不考虑像素与周边其他像素的关系。
- 但是如果卷积的输出输入是长方体,所以1 x 1 卷积实际上是对每个像素点,在不同的channels上进行线性组合(信息整合),且保留了图片的原有平面结构。
- 根据卷积核的个数K可以控制depth,从而完成升维或者降维的功能。
- 如下图,3维降到2维;3维升到4维。
- 所以总结来说1 x 1卷积核的作用有两个:
- 不同channels上的像素点进行线性组合;
- 在不改变平面结构的情况下(shape不变),实现升维或者降维。
【跨层连接】
- 前馈深网络、卷积神经网络,都是一层层逐步变换,不允许跨层组合,但现实中是否有跨层组合的现象?
- 答案是肯定的。比如,在判断一个人是小明的时候,很多时候没有办法直接看到他的全部,或者给的图片信息本身就是残缺的。这时候我们会靠其他的组合信息来判断,比如身形、眼睛、穿着等。如下图所示:
- 残差网络就是拥有这样的结构。
- 其实,简单来说这就是将前面层次学到的东西在次与当前层学到的东西进行组合,如果不做跨层连接也是可以做到的,只不过花费的代价比较大。就是在每次传递到下一层都需要学习那个用于保持前一层图像概念的filter的权重。但是随着层数的加深,会越来越难以保存,加之maxpooling将冗余信息去除,会变得更加困难。
- 而跨层连接,就成为了一种合理的做法。直接将上一层学到的概念传递到下一层,不用让它每次都重新学习。就好比在编程时构建了不同规模的functions。每个function都保留,而不是重新再写一遍。提高了重用性。
- 如ResNet中的跨层连接
- DenseNet中的跨层连接