Convolutional Neural Networks(CNNs)
CNNs的结构
Convolution (卷积)
卷积的数学理解
1、卷积的定义
我们称 $(f*g)(n)$ 为 $f,g$ 的卷积
其连续的定义为:
其离散的定义为:
这两个式子有一个共同特征:都类似于$n = t + n - t$
我们令$x = r, y = n - r$,那么$x + y = n$ 就是下面这些直线
2、离散卷积的例子:丢骰子
将两枚🎲抛出去,两枚🎲点数加起来为4的概率是多少?
我们把🎲各个点数出现的概率表示出来:
相加点数4出现概率为:$f(1)g(3)$ $f(2)g(2)$ $f(3)g(1)$
因此,两枚🎲点数加起来为4的概率为:$f(1)g(3) + f(2)g(2) + f(3)g(1)$
符合卷积的定义,把它写成标准的形式就是:
3、连续卷积的例子:做馒头
假设我们拥有一台可以一天不断生产馒头的机器
假设馒头的生产速度为$f(t)$,那么一天后生产出的馒头总量为:
馒头生产出来后会慢慢腐败,假设腐败函数为$g(t)$,比如,10个馒头,24小时会腐败 $10*g(t)$
如此,我们可以知道,一天后,馒头总共腐败了:
卷积的实际运用
基础CNN所用的卷积是一种2D卷积。Kernel只能在x,y上滑动位移,不能进行深度(跨通道)位移。
对于RGB图像,采用了三个独立的2D kernel,如黄色部分,这个kernel的维度是$X*Y*3$。再基础CNN的不同stage中,kernel的深度都应当一致,等于输入图像的通道数。
卷积需要输入两个参数,实质是二维空间滤波,滤波的性质与kernel选择有关,CNN的卷积是在一个2-D kernel 和输入的 2-D input map 之间,RGB中各图像通道分别完成。
我们假设单一通道输入图像的空间坐标为$(x,y)$ ,卷积核大小是$p * q$ ,kernel权重为$w$ ,图像亮度值是$v$ ,卷积过程就是kernel 所有权重与其在输入图像上对应元素亮度之和,可以表示为:
并将kernel随(x,y)平移扫描,可以得到输出空间,这时假设输入图像大小是$512*512$,卷积核是$3*3$,在不考虑零填充(zero padding)的情况,输出是(512 - 3 + 1) = 510 *510
卷积层的kernel可能不止一个,扫描步长,方向也有不同,这些进阶方式可以归纳一下:
- 可以采用多个卷积核,设为n同时扫描,得到的feature map会增加n个维度,通常认为是多抓取n个特征
- 可以采取不同扫描步长,比如上例子中采用步长为n,输出是(510/n,510/n)
- padding,上例中,卷积过后的图像维度是缩减的,可以在图像周围填充0来保证feature map与原始图像大小不变
- 深度升降,例如采用增加一个1*1 kernel来增加深度,相当于复制一层前通道作为feature map
- 跨层传递feature map,不再局限于输入即输出,例如ResNet跨层传递特征,Faster RCNN 的POI pooling
Activation(激活)
卷积之后,通常会加入偏置(bias), 并引入非线性激活函数(activation function),这里定义bias为b,activation function 是h(),经过激活函数后,得到的结果是,
bias不与元素位置相关,只与层有关
主流的activation function 有:
例如采用$277*277$的RGB图像, 采用96个$11*11*3$的kernels同时扫描,很容易得到输出的feature maps是96个$267*267$的二维 feature map, $267*267$是单个图像feature map的x,y轴大小,96是卷积核个数,原本的3通道在积分的时候会被作为一个元素加起来。 如上图,这些feature map可视化之后,可以看到4和35表示边缘特征,23是模糊化的输入,10和16在强调灰度变化,39强调眼睛,45强调红色通道的表现。
Pooling (池化)
池化(pooling),是一种降采样操作(subsampling),主要目标是降低feature maps的特征空间,或者可以认为是降低feature maps的分辨率。因为feature map参数太多,而图像细节不利于高层特征的抽取。
目前主要的pooling操作有:
- 最大值池化 Max pooling: $2*2$的max pooling就是取4个像素点中最大值保留
- 平均值池化 Average pooling, $2*2$的average pooling就是取4个像素点中平均值保留
- L2池化 L2 pooling: 即取均方值保留
Pooling操作会降低参数,降低feature maps的分辨率,但是这种暴力降低在计算力足够的情况下是不是必须的,并不确定。目前一些大的CNNs网络只是偶尔使用pooling.
该CNN stage的基本结构是可变的,目前大部分网络都是根据基本结构堆叠调整参数,或跳层连接而成