关于机器学习:MindSpore易点通深度学习系列卷积神经网络

32次阅读

共计 2602 个字符,预计需要花费 7 分钟才能阅读完成。

小 Mi 前天一不注意瞄了眼公众号,发现居然曾经有了 YOLOv7,登时感觉本人落后的不是一星半点,印象中还是 YOLOv5 来着,怎么大伙的科研速度跟火箭有的一拼?吓得小 Mi 连忙补功课。废话不多说(是不是还是相熟的配方),明天开始先跟大家从 CNN 开始温习吧~

鼻祖来了
好了,首先具体解释下,为什么要先从 CNN 开始温习呢?因为咱们常见的很多网络,比方 LeNet、Alexnet、VGG、RCNN、Fast RCNN、Faster RCNN、YOLO、YOLOv2、SSD 等等这些网络模型的鼻祖就是 CNN,只不过前面的各个儿子孙子如神仙打架个别,在各自的畛域施展着本身的劣势,比方 Lenet、Alexnet、Googlenet、VGG 次要面向图像分类工作,RCNN、fastRCNN、fasterRCNN 等作为指标检测工作的算法,而 YOLO、SSD、YOLOv2 又是不同于 RCNN 系列的另一类指标检测算法。所以是不是鼻祖很重要呢!(鼻祖的创始人 Yann LeCun 是第一个通过卷积神经网络在 MNIST 数据集上解决手写数字问题的人。)

网络结构
在这之前,小 Mi 曾经在之前的深度学习系列中对深度神经网络有过简略的介绍(https://bbs.huaweicloud.com/f…),卷积神经网络构造包含:输出层 Input layer、卷积层 Convolution Layer、池化层 Pooling layer、全连贯层 Full connection Layer 和输入层 Output Layer。

输出层
该层要做的解决次要是对原始图像数据进行预处理,比方去均值、归一化、PCA 降维等等。

卷积层
好啦,为什么咱们这个网络要叫卷积神经网络呢?那么重点就来了。

首先让咱们以最常见的二维卷积层为例,看下卷积层是如何工作的吧~

在二维卷积层中,一个二维输出数组和一个二维核(kernel)数组通过相互关

运算输入一个二维数组。如图所示,输⼊是一个 3×3 的二维数组,卷积核是一个 2×2 的二维数组。

二维相互关运算

输入后果中数字 19 的计算公式为:0×0+1×1+3×2+4×3=19

在二维相互关运算中,卷积窗口从输⼊数组的最左上方开始,按从左往右、从上往下的程序,顺次在输出数组上滑动。当卷积窗口滑动到某一地位时,窗口中的输出子数组与核数组按元素相乘并求和,失去输入数组中相应地位的元素。

那么剩下的三个元素计算公式为:

1×0+2×1+4×2+5×3=25,

3×0+4×1+6×2+7×3=37,

4×0+5×1+7×2+8×3=43。

二维卷积层输入的二维数组能够看作是输出在空间维度(宽和高)上某⼀级的表征,也叫特色图(feature map)。影响元素 x 的前向计算的所有可能输出区域(可能大于输出的理论尺寸)叫做 x 的感触野(receptive field)。以上图为例,输出中暗影局部的四个元素是输入中暗影局部元素的感触野。将输入记为 Y,如果 Y 与另一个形态为 2×2 的核数组做相互关运算,输入单个元素 z。那么,z 在 Y 上的感触野包含 Y 的全部四个元素,在输出上的感触野包含其中全副 9 个元素。可见,能够通过更深的卷积神经网络使特色图中单个元素的感触野变得更加⼴阔,从而捕获输出上更大尺寸的特色。

因而卷积层的输入形态由输出形态和卷积核窗口形态决定,其中最重要的两个超参数便是填充和步幅了。

填充(padding)是指在输出高和宽的两侧填充元素(通常是为 0)。下图中在原输出高和宽的两侧别离增加了 0 的元素,使得输出高和宽从 3 变成了 5,并导致输入高和宽由 2 减少到 4。

在输出的高和宽两侧别离填充了 0 元素的二维相互关计算

而卷积窗口从输出数组的最左上方开始,按从左往右、从上往下的程序,顺次在输出数组上滑动,每次滑动的行数和列数就叫做步幅(stride)。在高和宽两个方向上步幅均为 1,当然也能够应用更大步幅。比方下图就展现了在高上步幅为 3、在宽上步幅为 2 的二维相互关运算。能够看到,输入第一列第二个元素时,卷积窗口向下滑动了三行。而在输入第一行第二个元素时卷积窗口向右滑动了两列。当卷积窗口在输出上再向右滑动两列时,因为输出元素无奈填满窗口,无后果输入。

高和宽上步幅别离为 3 和 2 的二维相互关运算

其实通过各种试验最终咱们能够发现,填充能够减少输入的高和宽,能够使得输入与输出具备雷同的高和宽,而步幅能够减小输入的高和宽,例如输入的高和宽仅为输出的高和宽的 1 /n(n 为大于 1 的整数)。当然啦,为什么咱们始终强调是二维卷积层呢?输入的后果必定也会与输出的数组维度无关啦,大家能够自行钻研下~

池化层
池化(pooling)层的提出是为了缓解卷积层对地位的适度敏感性。

不同于卷积层里计算输出和核的互相关性,池化层间接计算池化窗口内元素的最大值或者平均值。在最大池化中,池化窗口从输⼊数组的最左上方开始,按从左往右、从上往下的程序,顺次在输出数组上滑动。当池化窗口滑动到某⼀地位时,窗口中的输出子数组的最大值即输入数组中相应地位的元素。

池化窗口形态为 2×2 的最大池化

暗影局部为第⼀个输入元素及其计算所应用的输出元素:max(0, 1, 3, 4) = 4

剩下三个元素别离为:

max(1, 2, 4, 5) = 5,

max(3, 4, 6, 7) = 7,

max(4, 5, 7, 8) = 8.

那么均匀池化的共作原理也就很好了解咯。

因而池化操作就是图像的 resize,就好比一张狗的图像被放大了一倍咱们还能认出狗,图像压缩时去掉的信息只是一些无关紧要的信息,而留下的信息则是具备尺度不变性的特色;同时还进行了特色降维,去除了很多无用或反复信息,并在肯定水平上避免过拟合,更不便优化。

全连贯层
这里的全连贯与咱们之前讲到的全连贯并没有任何差别,通过池化层解决失去的后果中的所有元素都有权重连贯:

其中,x1、x2、x3 为全连贯层的输出,a1、a2、a3 为输入,

总结
当然啦,明天跟大家分享的卷积神经网络都是从最简略的方面逐渐介绍的,既然是深度学习网络系列,咱们平时遇到的网络可不是只有几个二维数组,一两个卷积层那么简略,CNN 在实质上是一种输出到输入的映射,它可能学习大量的输出与输入之间的映射关系,而不须要任何输出和输入之间的准确的数学表达式,只有用已知的模式对卷积网络加以训练,网络就具备输入输出对之间的映射能力。心愿大家在我的根底上,持续学习开始跟大家提到的各种“子孙”网络吧(LeNet、Alexnet、VGG、RCNN、YOLO 等等等等)!

正文完
 0