吴恩达深度学习课程笔记(四):卷积神经网络1

吴恩达深度学习课程笔记(四):卷积神经网络1

第一周 卷积神经网络

1.1 计算机视觉

用途:

  • 图像分类;
  • 目标检测;
  • 风格迁移;
  • 。。。。。。

挑战:需要的数据量大:

  • 对一个1000*1000的图片,有1000* 1000*3即3 000 000 个输入特征,如果使用全连接网络,假设第一隐层有1000个单元,那么,光第一隐层就有(1000, 3 000 000)这么大的 w ,即3000 000 000个参数。难以获得足够的数据来防止过拟合。所需要的内存也是无法接受的。

为了能够处理大图,必须使用卷积。

1.2 边缘检测示例

上图中,为3 × 3的过滤器(filter,又叫,kernel);

表示卷积运算(convolution)。

卷积为:用filter和矩阵的第一个3 × 3部分的元素相乘再相加,然后filter右移一列,相乘再相加。。。到矩阵最右端后下移一行,重复上述操作。最后卷积的结果为一个4 × 4的矩阵。

上图所使用的过滤器(卷积核)为垂直边缘检测器。

在tensorflow中,卷积为tf.nn.conv2d

在Keras中,卷积为Conv2D

这就是垂直边缘检测器。通过该卷积核,卷积出图像的垂直边缘轮廓。

如果图像为1000 × 1000的,那么卷积出来的轮廓图像为998 × 998。

1.3 更多边缘检测内容

该卷积核(垂直边缘检测器)可以区分明暗,即图像是由明转暗,还是由暗转明。

上图,垂直边缘检测器翻转,得到水平边缘检测器。

Sobel 边缘检测器,增加了中间一行元素的权重,使得结果鲁棒性更好。

Scharr滤波器。

随着深度学习的发展,当需要坚检测出复杂图像的边缘,不一定非要使用类似上边介绍的这九个数字,但可以从这些前人成果中获益。

即,把9个数字作为参数,使用反向传播算法,让神经网络来理解这九个数字。最后得到一个出色的边缘检测器。

使用神经网络能够学习任何改网络所需要的 3 × 3 滤波器,并在整幅图上使用该滤波器,检测出图像的边缘。

思想:将滤波器的九个数字作为神经网络的参数来训练。

1.4 Padding

一个 n × n 的图像和一个 f × f 的图像卷积后的结果是一个 ( n f + 1 ) × ( n f + 1 ) 的图像。

这样卷积的缺点:

  • 图像会缩小;
    • 尤其是深度网络中,一层一层的卷积下去,图像会大幅缩水。
  • 在角落和边缘区域的像素点在输出中采用较少,即丢弃了图像边缘位置。

解决办法:填充图像(Padding)。

一般用 0 填充。

一个图像的上下左右都填充,每个边填充 p 行(列),那么,最后的卷积结果变成了 ( n + 2 p f + 1 ) × ( n + 2 p f + 1 )

比如,在 6 × 6 的图像周围在加一层像素点,变成 8 × 8 。这样, 3 × 3 卷积核的结果是 6 × 6

现在存在两种卷积:不padding的卷积和padding的卷积:

  • Vaild convolution:
    • 不填充。
  • Same convolution:
    • 填充的效果是,卷积后的图像大小和填充前图像的大小一致。
    • n + 2 p f + 1 = n ,即 p = f 1 2
    • 卷积核的大小 f 一般是奇数。
      • 可以做到对称填充。
      • 有中心点。
    • 四条边都填充。

1.5 卷积步长

卷积的步长不一定是1。
一个步长为 s 的卷积的结果如下:

数学意义上的卷积,需要先进行翻转,之后再互相关。深度学习没有翻转,只有互相关。但深度学习领域,习惯上,将这种互相关称之为卷积。

  • 数学卷积:翻转,互相关;
  • 深度学习卷积:互相关;

使用的都是 符号。

1.6 多维卷积

卷积核的通道数 = 图像的通道数;

卷积的结果为二维矩阵。

卷积核还是在二维平面上按照既定步长移动,只不过变成立方体内部数据相乘再相加。

n × n × n c     f × f × n c > n + 2 p f s + 1 × n + 2 p f s + 1 × n c

其中, n c 为通道数; n c 为卷积核的个数。

图像的通道数(channels)也叫做3维立方体的深度(depth)。

使用不同的卷积核,比如上图使用垂直边缘检测器和水平边缘检测器,识别图像的不同特征。

1.7 卷积层

如何构建神经网络的卷积层?

卷积层的参数 w 是过滤器的参数。那么,卷积层的参数个数仅由过滤器的size和过滤器个数影响。比如,卷积层有10个3 × 3 × 3的过滤器,那么卷积层就是280个参数。不管输入的图像有多大,都是这280个参数。这就是卷积神经网络的一个特征,叫做“避免过拟合”。

注: A [ l ] : m × n H [ l ] × n W [ l ] × n c [ l ] 的顺序仅为吴恩达的顺序,并不是同一标准。也有人喜欢将通道放在最前。

再注:以上标记法也仅为吴恩达标记的方式,在今天,深度学习领域还没有达成一致的标记法。

1.8 小例子:一个简单的卷积网络


卷积结束后展开成一个向量,给到逻辑回归,判断是否为猫。

可以看到,随着一层一层的卷积,输出的数据大小在不断的减小,但是信道数量在不断的增加。

确定超参数 f [ l ] p [ l ] s [ l ] n c [ l ] 是一件费功夫的事情。

一个典型的卷积神经网络有:

  • 卷积层(conv:convolution);
  • 池化层(pool:pooling);
  • 全连接层(FC:fully connected) 。

1.9 池化层

作用:

  • 缩减模型大小,提高运算速度;
  • 提高所提取特征的鲁棒性。

最大池化(max pooling):

输入是某些特征的集合。数字大(9)可能意味着提取了某个特定特征。其他的地方没有这个特征。最大化操作的功能就是只要在任何一个框(图中有四个框)内提取到某个特征。它都会保留到最大池化的输出中。

最大池化作用的一种理解:如果在过滤器中提取到某个特征,那么保留其最大值。如果没有提取到这个特征,那么最大池化保留的结果也很小。

使用最大池化的原因:在很多实验中效果很好。

最大池化的操作是分别对每个信道单独执行的。

比如输入的图像有两个信道,那么分别对两个信道做最大池化。

池化的输出是 n + 2 p f s + 1 × n + 2 p f s + 1 × n c

其中, n c 是输入的信道数。

注意:卷积的输出信道数 n c = 过滤器的个数。池化的输出信道数 = 输入的信道数。

n c 个信道中的每一个信道都是单独地执行最大池化。

平均池化(average pooling):

类似最大池化,最大池化选择最大值,平均池化将窗口内的所有值求平均。

最大池化比平均池更常用。

总结:

超参数:

  • f :过滤器大小;
  • s :步长;

常见的参数为 f =2, s =2,效果是高度和宽度减半。

也有 f =3, s =2。

超参数 p 很少使用,即 p = 0

则:

输入: n H × n W × n c

输出: n H f s + 1 × n W f s + 1 × n c

池化没有需要学习的参数。池化只是静态属性。

1.10 卷积神经网络示例

存在两种计算神经网络层数的方式。

  1. 卷积层 + 池化层 = 一层;
  2. 卷积层 = 一层,池化层 = 一层。

吴恩达采用第一种方式。这种方式,在统计神经网络的层数时,可以只统计具有权重和参数的层(池化层没有权重和参数,只有超参数)。

关于超参数选择的常规做法:

尽量不要知己设置超参数;查看文献,看别人采用了哪些超参数;选择一个在别人的任务中效果很好的架构。那么这个架构也有可能使用与自己的应用程序。

随着神经网络深度的加深,高度 n H 、宽度 n W 通常都会减小,信道数会增加。

神经网络的一种模式:
conv(一层或多层)- pool - conv - pool - FC - FC - FC - Softmax 。


修正:
CONV1的parameters应该为608(5 X 5 X 3 X 8 + 8);
CONV2的parameters应该为3216(5 X 5 X 8 X 16 + 16)。

结论:

  • 池化层无参数;卷积层参数少;绝大部分参数在全连接层;
  • 激活值数量随着网络深度的增加而减小,但如果激活值数量下降的太快,会影响网络性能。

1.11 为什么用卷积?

和只用全连接层(FC)相比,卷积层的两个主要优势:

  • 参数共享;
  • 稀疏连接;

通过这两种机制,神经网络减少了大量参数。以便于我们用更小的训练集来训练它,从而预测过拟合。

CNN具有平移不变属性。比如图像向有移动几个像素,仍然能够识别。因为神经网络的卷积结构即使移动几个像素,这张图像依然具有非常相似的特征,应该属于同样的输出标记。

猜你喜欢

转载自blog.csdn.net/cluster1893/article/details/81676572