1 图像分类
给一张照片,识别图中物品的类别
2 目标检测
一张图中有多个物体,不仅要识别出是什么,还要识别出它们所在的位置
3 图像风格的变迁
计算机视觉,神经网络处理图像时参数会非常的多
1000*1000的图形如果有第一个隐藏层有1000个神经元,如果是全连接的情况下就会有的数据量,
W 1 = 1000 ∗ 3 m W_1=1000*3m W1=1000∗3m
也就是30亿个参数,如此多的参数有可能会过拟合,而且巨大的内存需求让人无法接受。因此需要进行卷积操作
首先介绍一下边缘检测
给一张图片,让电脑搞清楚里面有什么,首先要做的就是检测垂直边缘
如何在图形中检测这些单元?
先看下面的例子,左侧是一张图像,与右侧的(3,3)的卷积核(过滤器)进行卷积运算后就得到了另一张图片
卷积的运算过程如下,拿卷积核与图片左上角的九个数逐位相乘再相加,得到第一个数
接着卷积核向右移动一位
继续向右
继续向右
接下来为了得到第二行的数据、卷积核向下运动
就这样一直运算出(4,4)矩阵的所有的数
为什么这个(3,3)矩阵可以进行垂直检测?
下面看一个简单的例子
左边都是像素值10比较亮,右边都是0比较暗,也就是下图,在图形中间有一个特别明显的垂直分布,从白到黑的过度线
当你用一个3乘3的卷积核进行运算,卷积核可以看作如下
把最右的矩形当作图形,中间的白色部分就检测出了,左侧图片的垂直边缘(黑白分界处)
这里检测到的边缘太粗了是因为图像太小了。卷积运算提供了一种简单的方法检测图片中的垂直边缘
之前的30变成-30,中间的过度部分被翻转了,这表示从暗到亮。这样可以区分从暗到亮和从亮到暗两种不同的变化。
下面再看一下水平边缘检测
左侧的绿框,从上到下颜色由亮到暗,对应30是一条正边,而紫色框中的颜色从暗到亮,对于-30是一条负边。
黄色的框左边两列都是正边,右侧一列是负边,最后结果是10。这里的图片尺寸很小(6,6)如果是(1000,1000)就不会出现10这样的值了,因为图片尺寸很大,值会变的很小
为什么卷积核是上面的样子而不是其他,其实在计算机视觉上也曾经提出过不同的卷积核
左侧卷积核的叫Sabel,增加了中间一行元素的权重,也就是图形中间的像素点,是结果的鲁棒性更强
右侧的卷积核叫Scharr,也是一种垂直边缘检测,翻转90°就是水平检测
其实你在进行边缘检测的时候并不一定要采取学者们的这几种数字设置,你可以把它们当成参数进行训练,通过反向传播,让网络自己去学习,这样训练出的卷积核不仅可以进行垂直的边缘检测还可以适用于,45°,75°等各种边缘的检测
之前做卷积操作
这样由一个缺点,每做一次卷积图片就会缩小,可能几次卷积图片就变得非常小了
还有一个缺点就是边缘信息丢失了,左上角只参与了一次的卷积运算,而中间的红色参与了多次卷积运算
为了解决这些问题可以在卷积前对图形进行填充,比如在周围填充1个像素点
那么最终的output就和input一样都是(6,6),并且绿色的单元被运算了四次
Valid卷积,Same卷积
Valid卷积p(padding)=0不进行填充,
Same卷积 使输出尺寸和输入相同
n ∗ n ∗ f ∗ f − > ( n − f + 1 ) ∗ ( n − f + 1 ) 为 了 使 i n p u t = o u t p u t n + 2 p − f + 1 = n 即 p = f − 1 2 n*n \qquad * \qquad f*f \qquad -> (n-f+1) * (n-f+1)\\ 为了使input=output \\ n+2p-f+1=n\\ 即 p=\frac{f-1}{2} n∗n∗f∗f−>(n−f+1)∗(n−f+1)为了使input=outputn+2p−f+1=n即p=2f−1
所以上图中f=3,为了输出尺寸和输入相同,p设为3-1/2=1
之前的卷积运算卷积核一次移动一位也就是步长为1,下面看一下步长为2的情况
第二次运算
可以看出直接跳了两格,最终得到
输出图形的尺寸计算公式就是
n + 2 p − f s + 1 ∗ n + 2 p − f s + 1 n : i n p u t s i z e f : 卷 积 核 s i z e p : p a d d i n g s : s t r i d e 步 长 \frac{n+2p-f}{s}+1 \space *\space \frac{n+2p-f}{s}+1 \\ n \space: \space input size\\ f \space :\space卷积核 size\\ p \space :\space padding\\ s \space :\space stride 步长\\ sn+2p−f+1 ∗ sn+2p−f+1n : inputsizef : 卷积核sizep : paddings : stride步长
如果结果不是整数,向下取整。也就是说蓝框如果移动到外部就不进行运算
补充(选):互相关,卷积
其实上面进行的操作在信号上称为互相关,卷积运算应该还有一部镜像的操作
但是这并不影响神经网络的运算,而且简化了计算。大部分的文献中也把上午讲的互相关叫做卷积,这部分只需要了解即可
我们不仅想对二维(灰色图片处理),相对三通道的彩色图片进行卷积,那么对应就需要三个卷积核,对于红绿蓝三个通道
卷积核的channel和input的channel必须相同,output的size是(4,4,1)
这三个卷积核与input的红绿蓝通道分别相乘,得到第一个数,计算下一位就将立方体移动一位,计算27个数相乘的结果
你可以把三个卷积核设置成如下情况
那么将检测红色通道中的边缘分布,又或者你并不关心检测哪个通道里的边缘分布
如果我们不仅想要垂直边缘检测,还想要水平边缘检测,怎么实现?
可以增加卷积核 的数量,一个卷积核用来检测垂直边缘分布,一个检测水平边缘分布
这样就得到了一个(4,4,2)的output,你可以检测2个特征比如垂直边缘分布和水平边缘分布或者10,100个并且输出通道等于你检测的特征数目
上面得到的输出加上偏差b(python的广播机制16个元素都加上同一偏差)然后应用非线性函数ReLu,输出一个(4,4)的矩阵
将两个矩阵堆叠起来,就得到了一个(4,4,2)的矩阵
通过计算,从一个(6,6,3)的矩阵得到一个(4,4,2)的矩阵,这就是卷积神经网络的一层。在神经网络的前向传播中
Z [ 1 ] = W [ 1 ] a [ 0 ] + b [ 1 ] a [ 1 ] = g ( Z [ 1 ] ) Z^{[1]}=W^{[1]}a^{[0]}+b^{[1]}\\ a^{[1]}=g(Z^{[1]}) Z[1]=W[1]a[0]+b[1]a[1]=g(Z[1])
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 + 2 p − f s + 1 ⌋ \lfloor \frac{n+2p-f}{s}+1 \space \rfloor \\ ⌊sn+2p−f+1 ⌋
那n么新的计算公式就是
n H [ l ] = ⌊ n H [ l − 1 ] + 2 p [ l ] − f [ l ] s [ l ] + 1 ⌋ n W [ l ] = ⌊ n W [ l − 1 ] + 2 p [ l ] − f [ l ] s [ l ] + 1 ⌋ n^{[l]}_H=\lfloor \frac{n^{[l-1]}_H+2p^{[l]}-f^{[l]}}{s^{[l]}}+1 \space \rfloor \\ n^{[l]}_W=\lfloor \frac{n^{[l-1]}_W+2p^{[l]}-f^{[l]}}{s^{[l]}}+1 \space \rfloor \\ nH[l]=⌊s[l]nH[l−1]+2p[l]−f[l]+1 ⌋nW[l]=⌊s[l]nW[l−1]+2p[l]−f[l]+1 ⌋
这样我们就能通过l-1层的输出,退出l层测输出。其实在实际项目中,我们往往是根据输入和输出的size调节p,s,f的值
输出图像中的通道数量就是这一层使用的卷积核(过滤器)的数量,通过前面的学习,我们知道卷积核的channel和input的channel必须相同。卷积核的大小就是
f [ i ] × f [ i ] × n c [ l − 1 ] 这 一 层 的 输 出 等 于 激 活 值 a [ l ] a [ l ] → n H [ l ] × n W [ l ] × n c [ l ] f^{[i]}×f^{[i]}×n^{[l-1]}_c\\ 这一层的输出等于激活值a^{[l]}\\ a^{[l]}\to n^{[l]}_H×n^{[l]}_W×n^{[l]}_c f[i]×f[i]×nc[l−1]这一层的输出等于激活值a[l]a[l]→nH[l]×nW[l]×nc[l]
这里有一个计算,w,b先放在这
经过几层卷积,最后为妥提取了7×7×40个特征也急速1960个特征,将其展平,平滑处理后,输出一个向量
其填充内容是logistic回归单元还是softmax,取决我们图像上有没有猫,还是想识别k中不同图像中的一种
卷积的过程中size不断地减小,channel不断增大。大部分的卷积神经网络由三部分构成
Convolution Conv 卷积层
Pooling pool 池化层
Fully connected 全连接层
如果是最大池化,输出的每个元素都是对于颜色区域中的最大值。f=2,s=2
数字大意味着可能提取了某些特定特征,比如左上的9,左上有这个特征可能是垂直边缘,或一只眼睛,CAP特征等,而右上象限显然没有这个特征,最大化运算的实际作用如果在过滤器中提取到某个特征保留它的最大值,如果没有提取到这个特征,肯右上象限没有这个特征,那么最大值还是很小。
最大池化虽然有一组超参数,却没有参数需要学习,梯度下降没什么需要学习的,一旦固定了f,s,它就是一个固定的运算
下面看一个示例
继续
后面的计算都一样,最后
如果是3 channel,那么输出也是3 channel,每个通道都单独执行最大池化操作
5 × 5 × n c → 3 × 3 × n c 5×5×n_c \to 3×3×n_c 5×5×nc→3×3×nc
还有一种平均池化,不太常用,顾名思义就是取平均值
平均池化的使用很少,在层数很深的网络中会使用,可以用来分解一个7×7×1000的
7 × 7 × 1000 → 1 × 1 × 1000 7×7×1000 \to 1×1×1000 7×7×1000→1×1×1000
最大池化的常用参数f=2,s=2;f=3,s=2 。最大池化很少用到p,但是也有例外
注意输入和输出的通道数相同,因为对每层都做了池化操作
手写体识别
Conv1使用6个卷积核
有文献把一层卷积核一层池化合起来叫做一层神经网络(因为pool没有参数),也有文献把卷积和池化分别记作一层,这里把一层卷积和一层pool记作一层网络
Conv2使用10个卷积核。现将pool2展平后全连接
再经过一个全连接,通过softmax输出10个值(识别0-9)
这里有很多的超参数,常规做法是不要自己设置,看别人的文献中采用了哪些超参数,选一个在别人的任务中很好的架构
神经网络的激活值形状,激活值大小,参数数量
和单纯使用全连接相比,卷积层的两个优势是:参数共享和稀疏连接
卷积网络参数少的原因
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,通过梯度下降法来优化网络中的所有参数