二维卷积
1、基础定义
图像的大小可以表示为64*64*3 其中3是表示通道数,卷积核可以理解成filter,使用卷积可以检测垂直边缘和水平边缘,垂直边缘和水平边缘检测器由卷积核构成。
卷积运算在代码中可分别表示为函数:
python:conv-forward
tensorflow:tf.nn.con2d
keras:Conv2D
提出的垂直边缘检测器如下图所示
像素值越大,代表图像中这一块越亮(如白色),如果原图明亮变化与检测器相同,得到的结果边缘处应当是亮的,像素值为正;反之为负,所以为了省去麻烦,最开始的时候就可以将结果设为求绝对值。得到的结果中边缘很宽是因为原图很小,才6*6,如果是1000*1000,效果很会明显。
下图中右下角4*4的图表示既捕捉到了左边正边界的一部分,也捕捉到了右边负边界的一部分,主要的边界还是看绝对值大的像素值。同样过渡区很明显是因为原图很小。
6*6的原图卷积3*3的filter得到4*4的矩阵是因为:原图中可以放置过滤器的位置只有4*4个
除了上面简单的两种边缘检测器外,还有很多其他的检测器,如下图所示
为了适用于自己图像处理的情况,使用反向计算,利用参数可以得到各个角度下的边缘检测器。
2、填充(padding)
为了解决两个问题:
--输出逐渐变小:当卷积层数很多时,输出的图像会越来越小
--边缘的图像特征只被利用一次:丢失了许多图片边界上的信息
为了保持原始图片的大小,在外围填充一层(具体几层计算方法如下图),填充的像素为0
卷积方式有两种,第二种就是先填充再卷积
在计算机视觉中,f一般都是奇数,原因有两点:
其一:如果是偶数的话,左右两边就是不对称的填充,也就不是same卷积
其二:如果是奇数的话,过滤器最中间有一个特殊点,中间那个特殊的像素就是一般的过滤器需要的
3、步幅卷积(stride)
设置的是卷积的时的步长,之前的例子默认的都是1(设置步长s之后,计算的方式如下图所示)
如果式子中不能整除的话,要向下取整
准确的来讲,以上的求卷积的方法应该称为交叉相关,在数学上卷积的准确定义还需要将filter进行一次翻转,只不过在深度学习的相关文献里,我们忽略了翻转。
三维卷积
RGB图象(红黄蓝)三维
如 6*6*3 其中第一个6代表height 第二个代表width 3代表channels
三维filter的3*3*3中各个数字的含义与上面一致
可以设置filter的色素值,检测垂直边缘或者水平边缘,设置方式如下图所示
上面那一行可以用来检测红色通道的边缘特征;下面一行可以检测所有通道的边缘特征
在一个模型中,可以应用很多的过滤器(为了得到输入的不同特征,如45°分界线上的特征等),高度和宽度可以不同,但是通道数必须和输入相同
当使用很多个过滤器时,输出需要将这些得到的结果叠加,所以输出会变成4*4*2、4*4*3等等
单层卷积神经网络的计算过程
输入A*filter = 预输出B
预输出B(每个像素值)+偏差C = 预输出D
Relu [ D ] = 输出E
一个三层卷积网络的例子
最终的输出是为了将结果分类
4、池化采样(pooling)
求到的是每四个方块中的最大值,这相当于f=2,s=2,而且一旦max pooling中的这两个参数确定之后,也不再需要线性回归等
除了Max pooling还有average pooling,通常情况下进行pooling时不会进行padding
在采样这个过程中,只是一个简单的函数,进行计算即可,不需要进行学习
一个完整且复杂的卷积过程
FC层是全连接层,pool2得到的结果转化成400*1的矩阵。FC3层输入为400*1的元素,输出为120*1的元素,400个输入和120个输出都相连,所以为全连接层。
最终输出为softmax层,输出为10个结果,分别是从0到9.
随着神经网络的输入,height和width会逐渐减小,但是channels会逐渐增加
上图是这个卷积网络的一些参数,可以看到Activation Size逐渐减小,但是减小的幅度不能太大,否则不利于网络的性能,全连接层的参数最多,卷积层的参数好像是(f*f+偏置参数)*channels
为什么在神经网络中加入卷积
加入之后比完全链接的神经层多了两个优点,参数共享和连接的稀疏性
如上图所示,如果一个输入为32*32*3的图象,第一步先转换成28*28*6的图象,根据两个图像分别有的参数,如果使用完全链接的神经层进行训练,则需要14万左右个参数。但是如果使用卷积层,则(5*5+1)*6个参数,参数的量会少很多