吴恩达深度学习 course4 卷积神经网络
1.computer vision
cv是深度学习的一个重要方向,cv一般而言包括:图像识别,目标检测,神经风格转换
传统的神经网络所存在的问题:图片的输入维度比较大,具体如下图所示,这就造成了权重w的维度比较大,那么他所占用的内存也会比较大,计算w的计算量也会很大
所以我们会引入卷积神经网络
2.Edge detection example
神经网络由浅层到深层可以检测图片的边缘特征,局部特征,整体特征
边缘特征以垂直边缘检测为例.如下图所示,将一个6X6的灰度图片卷积一个filter,得到一个新的图片即是对该图进行了垂直边缘检测,其中,∗ 表示卷积操作。python中,卷积用conv_forward()表示;tensorflow中,卷积用tf.nn.conv2d()表示;keras中,卷积用Conv2D()表示。
3.More edge detection
图片边缘检测有两种渐变方式,一种由明边暗,一种由暗变明,具体如下所示
实际应用中,对输出图片取绝对值,则渐变方式不同也不会影响什么
水平边缘检测例子:
除了上图的filter,其他常见的filter还有Sobel filter和Scharr filter,如下:
实际应用中,我们会检测边缘的更多特征,而不只是垂直特征与水平特征,filter的参数是通过训练得到的,类似于标准神经网络中的权重W一样由梯度下降算法反复迭代求得,确定边缘特征后,CNN就可以对所有的边缘特征进行一个检测
4.Padding
按照之前所讲的,如果一张nxn的图片,filter为fxf,那么卷积后所得到的图片大小为 n-f+1,卷积后会出现两个问题:
图片变得更小;图片自身的边缘信息丢失
解决这两个问题,我们可以对图像就行一个填充,如下: 填充的部分像素都为0
假设填充了p个宽度,那么填充之后进行卷积所得到的图片为 (n+2p-f)+1 X (n+2p-f)+1
valid convolutions:不对图片进行填充
same convolutions:即是 令(n+2p-f)+1=n ==> p=(f-1)/2,使得填充后进行卷积所得到的图片与原图片的大小相同,f通常为奇数(odd),原因也许可能是:
使得p为整数,填充为对称的填充
为奇数的时候filter有一个中心位置
5.Strided convolutions
步长即是只每一次卷积的时候,步进的长度:如下
步长为s时,卷积后所得到的图片大小为 (n+2p-f)/s +1 X (n+2p-f)/s +1,如果结果不为整数,则向下取整,会把卷积时超出图片的部分给舍去,如上图中的画X部分
我们所说的卷积实际上计算的是一个相关系数,与数学意义上的卷积并不相同,数学意义上的卷积会对filter进行一个旋转,而我们的操作过程并不会这样,在深度学习中,对filter旋转这并不重要
6.Convolutions over volumes
对于有R,G,B三个颜色通道的图片来说,对其进行一个卷积时,filter中的最后一个参数 应该与颜色通道的个数保持一致
3通道图片的卷积运算与单通道图片的卷积运算基本一致。过程是将每个单通道(R,G,B)与对应的filter进行卷积运算求和,然后再将3通道的和相加,得到输出图片的一个像素值。
不同通道的滤波算子可以不相同。例如R通道filter实现垂直边缘检测,G和B通道不进行边缘检测,全部置零,或者将R,G,B三通道filter全部设置为水平边缘检测。
上图指的是是只有一个filter的情况,为了进行多个卷积运算,实现更多边缘检测,可以增加更多的滤波器组。例如设置第一个滤波器组实现垂直边缘检测,第二个滤波器组实现水平边缘检测。这样,不同滤波器组卷积得到不同的输出,个数由滤波器组决定。,则结果应该如下所示
假设图片的颜色通道为nc,n x n x nc, 与f x f x nc,所得到的图片为(n -f +1) x (n -f +1) x n'c n'c为过滤器个数
7.One layer of a convolutional network
卷积神经网络的单层结构如下:
上图中的参数一共有 (3x3x3+1)x2个,参数的数目与图片的大小无关,只与filter有关
总结一下CNN单层结构的所有标记符号,设层数为l 。
-
f [l] = filter size
-
p [l] = padding
-
s [l] = stride
-
n [l] c = number of filters
8.A Simple Convolution network example
一个简单的CNN例子如下:
前几层都是在进行卷积操作,n[H]与n[W]逐渐减下,而n[c]逐渐增加,最后一层,将图片化为一个向量(7x7x40,1)的向量,与最后一层的输出层相连接
CNN有三种类型的layers:
9.Pooling layers
池化层是用来减小尺寸,提高运算速度,减少噪音,使模型更加健壮的
Pooling layers的做法比convolution layers简单许多,没有卷积运算,仅仅是在滤波器算子滑动区域内取最大值,即max pooling,这是最常用的做法。注意,超参数p很少在pooling layers中使用。
pooling layers只有filter的两个参数f和s,而且都是固定的,不需要经过训练得到的所以计算量很少
max pooling:即在filter的滑动范围取最大值,优势:忽略其他特征,只保留那个最大值的特征,降低模型的noise,使其比较健壮
average pooling:即在filter的滑动区域进行一个求平均的操作
max pooling用的比average pooling 用的多
10.Convolutional nerual network example
CNN例子:
以一个数字识别为例 第一层由一个conv 和一个pool组成 ,第二层也是 ,第三层和第四层是一个全连接,最后输出层的激活函数是一个softmax activation
每一层的参数情况如下:
11.why convolutions
为什么使用CNN
参数共享:一个特征检测器(例如:垂直特征检测器)适用于一个图片的一部分,也可能会适应图片的另外一个部分
稀疏连接:每一层的输出只与输入部分区域内有关
除此之外,CNN的参数比较少,这就要求所需要的样本可以少一些,从而一定程度上不易发生过拟合现象
而且,CNN擅长捕捉区域的位置偏移,不太易受物体的位置影响,增强了网络的准确性和系统的健壮性