01 计算机视觉
即使你在计算机视觉方面没有做出成果,希望你可以将所学的知识应用到其他算法和结构
- 计算机视觉的一些例子:图片识别(给出一张图片让计算机去分辨出这是一只猫)、目标检测(首先算出有哪些物体,然后用一些技术识别出他们在图片的位置)、图片风格迁移(就是你有一张满意的图片和一张风格图,你可以用神经网络将他们融合在一起,描绘出一张新的图片,整体轮廓来自左边,风格却是右边的)。
- 在应用计算机视觉还有一个很大的挑战就是数据的输入可能会非常大,例如像素是1000×1000的,那么输入的数据就是三百万的数据量,你也许会有1000个隐藏单元,而所有的权值W,如果你使用的是标准的全连接网络,矩阵的大小也是(1000,三百万)也就是会有三十亿个参数。在参数量如此之大的情况下难以获取足够的数据来防止过拟合。如果想要也能计算大型图片就可以使用卷积运算。
02 边缘检测示例
卷积运算是卷积神经网络最基本的组成部分
- 给一张图片让电脑检测是什么物体,可能做的第一件事是检测图片中的垂直边缘,也可能想检测水平边缘。
- 那么如何在图像中检测这些边缘呢?下面是一个6×6的灰度图像,为了检测一个图像的垂直边缘可以构造一个3×3的矩阵(过滤器),卷积运算用*表示,该例中用3×3的过滤器对其进行卷积,输出4×4的矩阵(另一张图片)。4×4的矩阵的元素是将3×3的过滤器覆盖到6×6的灰度图像中,不断地平移得到。不同的语言使用不同的函数代表卷积。
- 在下面例子中输出图像中间区域的亮处,表示在图像中间有一个很明显的垂直边缘。
03 更多边缘检测内容
- 通过不同的过滤器可以找出垂直或者水平的边缘。之前的图里面30是由10过渡到0得到的,所以就是由亮转暗;之前的 30 翻转成了-30,表明是由暗向亮过渡, 而不是由亮向暗过渡,因为看原图是从0到10,所以是从暗到亮的转化。
- 有多种过滤器:Sobel过滤器(增加了中间一行元素的权重)、Scharr过滤器、还有一种将九个数字都当成参数的思想(已经成为计算机视觉最为有效的思想之一)。
04 Padding
为了构建深度神经网络,需要学会使用卷积的基本操作Padding
- 可以用公式计算为什么输出是4×4,公式为(n-f+1)×(n-f+1),其中n×n代表原图大小,f×f代表过滤器大小。这样的话会有两个缺点:一是每次做卷积操作,你的图像就会缩小,二是那些在角落或者边缘区域的像素点在输出中采用较少,意味着丢掉了图像边缘位置的许多信息。为了解决这些问题,可以在卷积操作之前填充这幅画(沿着图像边缘再填充一层像素),习惯上可以用0来填充,如果p是填充的数量(该例中p=1,因为周围都填充了一个像素点),输出就变成了(n+2p-f+1)×(n+2p-f+1)。
- 填充多少像素通常有两个选择:分别叫Valid卷积(不填充)和Same卷积(填充后你的输出大小和输入大小是一样的)。在计算机视觉中过滤器一般都是奇数维,因为如果f为偶数,那么你只能使用一些不对称填充,只有f为奇数时才会有自然填充;还有就是在奇数维中会有一个中心像素点,便于指出过滤器的位置。
05 卷积步长
- 步长为2,说明过滤器执行完一次后,平移两个格。输出格子公式:[(n+2p-f)/s]+1 × [(n+2p-f)/s]+1,如果不是一个整数的话就向下取整。按照惯例,过滤器必须完全处于图像中或者填充之后的图像区域内,才输出相应结果。
- 在有些定义中还有镜像翻转,对着对角线翻转,咱们这不用奥。
06 卷积为何有效
- 假设我们想检测彩色图像的特征,那么对应的过滤器也应该有三层,对应红绿蓝三个通道。定义一下6×6×3这个形式:分别代表高、宽和通道数,并且图像的通道数必须和过滤器的通道数相等。
- 下面来看下计算立体图像的细节:首先我们的过滤器画成一个三维的立方体,然后把这个过滤器放到最左上角的位置,最后把27个对应数相乘相加就得到了输出的第一个数。依次平移得到剩下的数字。通过设置过滤器每层不同的参数,就可以检测不同颜色通道里的边界(右下角那两个例子)。
- 我们想同时检测垂直和水平边缘还有45度倾斜的边缘还有70度倾斜的边缘该怎么做?(换句话说就是想同时用多个过滤器怎么办)就是用两个不同的过滤器,然后得到的结果依次进行叠加,得到一个立方体。
07 单层卷积网络
- 通过不同的过滤器得到不同的输出后,通过python的广播机制给第一个矩阵这些元素都加上同一偏差,然后应用一个非线性激活函数ReLU;然后给第二个输出矩阵加上不同的偏差,同样也使用非线性激活函数ReLU,最后得到另一个4×4的矩阵,然后将两个矩阵叠加起来,就得到一个4×4×2的矩阵。
- a[0]到a[1]的演变过程:首先执行线性函数,然后将所有元素相乘做卷积,再加上偏差,然后应用激活函数ReLU,最后通过神经网络的一层,将6×6×3的维度a[0]演化为一个4×4×2维度的a[1],这就是卷积神经网络的一层。
- 举个例子,有十个过滤器,每个过滤器是3×3×3的,问这一层有多少参数?因为过滤器是3×3×3的,所以有27个参数,然后加一个偏差就是28个,然后是10个过滤器也就是一共280个参数。无论输入的图片有多大,参数始终是280个,这是卷积神经网络的一个特征叫做“避免过拟合”。
08 简单卷积网络示例
- 想做一个图像识别,输入x,然后判别图片中有没有猫(0/1表示)。通过下面的不同卷积不断地进行,最终为图片提取出7×7×40个特征,然后对该卷积层进行处理处理,可以将其平滑或展开成1960个单元,平滑处理后输出一个向量,其填充内容是逻辑回归单元还是softmax回归单元完全取决于我们是想识别图片上有没有猫还是想识别K种不同对象中的一种用y^表示最终神经网络的预测输出。
- 随着神经网络计算深度不断加深,通常开始时的图像也要更大一些,高度和宽度会在一段时间内保持一致,然后随着深度的加深而逐渐减小,而信道数量在增加。
- 一个典型的卷积神经网络通常有三层:卷积层(CONV)、池化层(POOL)、全连接层(FC)
09 池化层
使用池化层来缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性
- 在此用到的池化类型是最大池化,下面的例子相当于我们选用了一个规模为2、步幅为2的过滤器,然后选择其中最大值。最大化操作的功能就是只要在任何一个象限内提取到某个特征,他都会保留在最大池化的输出中,最大池化的实际作用就是在过滤器中提取某个特征,然后保留其最大值。
- 再看一个有若干超级参数的例子,每个信道都独立执行最大池化计算。
- 总结:池化的超级参数包括过滤器大小f和步幅s,大部分情况下p=0
10 卷积神经网络示例
- 在卷积文献中,卷积有两种分类,一类卷积是一个卷积层和一个池化层一起作为一层(人们在计算神经网络有多少层时,通常只是统计具有权重和参数的层,因为池化层没有权重和参数,只有一些超参数,所以将两者当着一层Layer1);另一类卷积是把卷积层作为一层,池化层单独作为一层。
- 我们针对识别数字例子,首先输入一个数字图片,通过两个神经网络的组合(卷积层+池化层),然后得到一个输出,将输出水平展开成向量,通过两个全连接层,最后用FC4的单元填充一个softmax单元,softmax会有十个输出。关于如何选定超级参数,常规做法是尽量不要自己设置,而是参考别人的文献采用了哪些超级参数,选择一个效果好的框架。在神经网络中另一种常见的模式是一个或多个卷积层后跟随一个池化层,然后一个或多个卷积层后再跟随一个池化层,然后是几个全连接层,最后是一个softmax。
- 神经网络激活值形状、激活值大小和参数数量。有几点注意:第一池化层和最大池化层没有参数;第二卷积层的参数相对较少,许多参数都存在于神经网络中的全连接层;第三随着神经网络的加深,激活值会逐渐减小(如果下降太快也会有所影响)。
11为什么使用卷积?
- 和只用全连接层相比卷积层的两个主要优势在于参数共享和稀疏连接。两个神经元相连会得到一个非常多的参数数量3072×4704,而使用卷积的话,一共才156个参数。
- 卷积网络映射这么少参数有两个原因:一是参数共享,一个特征检测器如垂直边缘检测器,用于检测图片左上角区域的特征,这个特征很可能也适用于右下角区域,因此在计算图片的左上和右下角区域时,不需要添加其他的特征检测器,假如有一个左上角和右下角可能有不同分布,但也可能很相似的数据集,整张图片共享特征检测器,提取效果也很好;二是稀疏连接,右图的输出单元仅与36个输入特征中的9个相连接,而其他像素值都不会对输出产生任何影响。神经网络通过这两种机制减少参数,以便我们用更小的训练集训练它,从而防止过拟合。
- 要训练神经网络要做的就是使用梯度下降法,来优化神经网络中的所有参数,以及减小代价函数J的值。
|