卷积神经网络
1 介绍
1 图像分类
给定一张照片,识别图片中物品的类别
2 目标检测
一张图片中有多个物体,不仅是它们是什么,还有它们所在的位置
3 图像风格的变迁
在计算机视觉中,神经网络在处理图像时有很多参数
1000*1000的图形如果有第一个隐藏层有1000个神经元,如果是全连接的情况下就会有的数据量,
也就是30亿个参数,如此多的参数有可能会过拟合,而且巨大的内存需求让人无法接受。因此需要进行卷积操作
2 卷积运算
让我们从边缘检测开始
给一张图片,让电脑弄清楚里面有什么,首先要做的是检测垂直边缘
如何在图中检测到这些单元格?
先看下面的例子,左侧是一张图像,与右侧的(3,3)的卷积核(过滤器)进行卷积运算后就得到了另一张图片
卷积的操作过程如下。将卷积核与图片左上角的九个数逐位相乘,相加得到第一个数。
然后卷积核向右移动一位
继续向右
继续向右
接下来,为了得到第二行的数据,卷积核向下移动
就这样一直运算出(4,4)矩阵的所有的数
为什么这个(3,3)矩阵可以进行垂直检测?
我们来看一个简单的例子
左边都是像素值10比较亮,右边都是0比较暗,也就是下图,在图形中间有一个特别明显的垂直分布,从白到黑的过度线
当你用一个3乘3的卷积核进行运算,卷积核可以看作如下
把最右边的矩形当作一个图形,检测中间的白色部分,左边图片的垂直边缘(黑白边界)
此处检测到的边缘太厚,因为图像太小。卷积操作提供了一种简单的方法来检测图像中的垂直边缘
3 其他的边缘检测
之前的30变成-30,中间的过度部分被翻转了,这表示从暗到亮。这样可以区分从暗到亮和从亮到暗两种不同的变化。
再来看看水平边缘检测
左侧的绿框,从上到下颜色由亮到暗,对应30是一条正边,而紫色框中的颜色从暗到亮,对于-30是一条负边。
黄色的框左边两列都是正边,右侧一列是负边,最后结果是10。这里的图片尺寸很小(6,6)如果是(1000,1000)就不会出现10这样的值了,因为图片尺寸很大,值会变的很小
为什么卷积核是上面的而不是其他的?事实上,在计算机视觉中已经提出了不同的卷积核。
左侧卷积核的叫Sabel,增加了中间一行元素的权重,也就是图形中间的像素点,是结果的鲁棒性更强
右侧的卷积核叫Scharr,也是一种垂直边缘检测,翻转90°就是水平检测
其实你在进行边缘检测的时候并不一定要采取学者们的这几种数字设置,你可以把它们当成参数进行训练,通过反向传播,让网络自己去学习,这样训练出的卷积核不仅可以进行垂直的边缘检测还可以适用于,45°,75°等各种边缘的检测
4 padding
之前做卷积操作
这有一个缺点。每进行一次卷积图像,图像都会缩小,经过几次卷积后图像可能会变得非常小。
另一个缺点是边缘信息丢失,左上角只参与一次卷积操作,中间的红色参与了多次卷积操作
为了解决这些问题可以在卷积前对图形进行填充,比如在周围填充1个像素点
那么最终的output就和input一样都是(6,6),并且绿色的单元被运算了四次
Valid卷积,Same卷积
Valid卷积p(padding)=0不进行填充,
Same卷积 使输出尺寸和输入相同
所以上图中f=3,为了输出尺寸和输入相同,p设为3-1/2=1
5 卷积步长
之前的卷积运算卷积核一次移动一位也就是步长为1,下面看一下步长为2的情况
第二次手术
可以看到直接跳了两个空格,最后得到了
计算输出图形大小的公式为
如果结果不是整数,则向下取整。也就是说,如果将蓝色框移到外面,则不会进行任何操作。
补充(可选):互相关、卷积
其实上面进行的操作叫做对信号的互相关,卷积操作也应该有镜像操作。
但这并不影响神经网络的运行,并且简化了计算。在大部分文献中,早上提到的互相关也称为卷积。这部分只需要了解即可。
6 三维卷积
我们不仅要对二维(灰度图像处理)和三通道彩色图像进行卷积,那么对应的红绿蓝三通道需要三个卷积核。
卷积核的channel和input的channel必须相同,output的size是(4,4,1)
这三个卷积核与input的红绿蓝通道分别相乘,得到第一个数,计算下一位就将立方体移动一位,计算27个数相乘的结果
可以如下设置三个卷积核
然后会检测红色通道中的边缘分布,或者你不关心边缘分布是在哪个通道中检测到的
如果我们不仅想要垂直边缘检测,还想要水平边缘检测,怎么做?
可以增加卷积核的数量,一个卷积核用于检测垂直边缘分布,一个用于检测水平边缘分布
这样就得到了一个(4,4,2)的output,你可以检测2个特征比如垂直边缘分布和水平边缘分布或者10,100个并且输出通道等于你检测的特征数目
7 单层卷积网络
上面得到的输出加上偏差b(python的广播机制16个元素都加上同一偏差)然后应用非线性函数ReLu,输出一个(4,4)的矩阵
将两个矩阵堆叠起来,就得到了一个(4,4,2)的矩阵
通过计算,从一个(6,6,3)的矩阵得到一个(4,4,2)的矩阵,这就是卷积神经网络的一层。在神经网络的前向传播中
a0就是(6,6,3)的矩阵,w就是卷积核,a1就是(4,4,2)的矩阵.
假设你有10个卷积核(3,3,3),那么这一层又多少个参数呢?
每个卷积核又27个参数+1个b=28,28*10=280个
注意:无论图片的尺寸又多大1000*1000,
5000*5000,参数都是280个
总结一层网络中的各种标记,当前l层的标记如左下
在前面的学习中我们知道,输出size
那n么新的计算公式就是
这样我们就能通过l-1层的输出,退出l层测输出。其实在实际项目中,我们往往是根据输入和输出的size调节p,s,f的值
输出图像中的通道数量就是这一层使用的卷积核(过滤器)的数量,通过前面的学习,我们知道卷积核的channel和input的channel必须相同。卷积核的大小就是
这里有一个计算,w,b先放在这
8 简单的卷积网络示例
经过几层卷积,最后为妥提取了7×7×40个特征也急速1960个特征,将其展平,平滑处理后,输出一个向量
其填充内容是logistic回归单元还是softmax,取决我们图像上有没有猫,还是想识别k中不同图像中的一种
卷积的过程中size不断地减小,channel不断增大。大部分的卷积神经网络由三部分构成
Convolution Conv 卷积层
Pooling pool 池化层
Fully connected 全连接层
9 池化层
如果是最大池化,输出的每个元素都是对于颜色区域中的最大值。f=2,s=2
数字大意味着可能提取了某些特定特征,比如左上的9,左上有这个特征可能是垂直边缘,或一只眼睛,CAP特征等,而右上象限显然没有这个特征,最大化运算的实际作用如果在过滤器中提取到某个特征保留它的最大值,如果没有提取到这个特征,肯右上象限没有这个特征,那么最大值还是很小。
最大池化虽然有一组超参数,却没有参数需要学习,梯度下降没什么需要学习的,一旦固定了f,s,它就是一个固定的运算
看下面的例子
继续
下面的计算都是一样的,最后
如果是3 channel,那么输出也是3 channel,每个通道都单独执行最大池化操作
还有一个平均池化,不常用。顾名思义就是取平均值
平均池化的使用很少,在层数很深的网络中会使用,可以用来分解一个7×7×1000的
最大池化的常用参数f=2,s=2;f=3,s=2 。最大池化很少用到p,但是也有例外
请注意,输入和输出具有相同数量的通道,因为对每一层都进行了池化
10 卷积神经网络示例
手写识别
Conv1使用6个卷积核
有文献把一层卷积核一层池化合起来叫做一层神经网络(因为pool没有参数),也有文献把卷积和池化分别记作一层,这里把一层卷积和一层pool记作一层网络
Conv2使用10个卷积核。现将pool2展平后全连接
再经过一个全连接,通过softmax输出10个值(识别0-9)
这里有很多超参数。通常的做法是不要自己设置它们,看看别人的文献中使用了哪些超参数,然后选择在别人的任务中运行良好的架构。
神经网络激活值的形状、激活值的大小、参数个数
11 为什么使用卷积
与单纯使用全连接相比,卷积层的两个优点是:参数共享和稀疏连接
卷积网络参数少的原因
Parameter sharing: A feature detector (such as a vertical edge detector) that’s useful in one part of the image is probably useful in another part of the image.
Sparsity of connections: In each layer, each output value depends only on a small number of inputs
参数共享,比如如果垂直边缘检测如果适用于图片的某个区域,那么它也可能适用于图片的其他区域。也就是说你用一个3×3的过滤器(卷积核)检测垂直边缘,图片的左上角以及旁边的各个区域都可以使用这个3×3的过滤器,即可以在输入图片的不同区域使用同样的参数
稀疏连接:
上图output里绿框中的数据只与input里绿框的九个数据有关,而与其他数据无关。也就是说仅与36个输入特征里的9个特征相连接,再举个例子
右边的红色框中的数据只与左侧红色框中的9个数据有关,其它像素对输出没有任何影响
最后把这些层放在一起,看看如何训练这些网络,比如训练一个猫检测器
定义一个损失函数,随机初始化参数w,b,通过梯度下降法来优化网络中的所有参数
文章出处登录后可见!