《人工智能实践教程》6、卷积神经网络
<p>卷积神经网络(Convolutional Neural Network, CNN)可用于图像识别、语音识别等场合,在图像识别的比赛中,基于深度学习的方法几乎都以CNN为基础。</p><p> </p>
<p><strong>一、CNN的结构</strong></p>
<pre ng-bind-html="message.MMActualContent">
与之前介绍的神经网络一样,CNN可以通过组装层进行构建。不过,CNN中出现了新的卷积层(Convolution层)和池化层(Pooling层)。</pre>
<p>下图就是一个典型的CNN网络:</p>
<div style="text-align: left;"></div>
<p><strong>二、卷积层</strong></p>
<p>在CNN中出现了一些特有的术语,如填充、步幅等。此外,各层中传递的数据是有形状的数据(如3维数据),这与之前的全连接神经网络不同。接下来慢慢来了解。</p>
<p>在全连接神经网络中,数据是没有形状的,也就是数据都当作1个通道了。卷积层可以保持形状不变,当输入数据为图像时,卷积层会以3维数据的形状接收输入数据,并以3维数据的形式输出到下一层。因此,在CNN中,卷积层可以正确理解图像等具有形状的数据。</p>
<p> </p>
<p><strong>1、卷积运算</strong></p>
<p>说到卷积层,就要先了解卷积运算,卷积运算相当于图像处理中的“滤波器运算”。下面通过一个图来说明卷积运算:</p>
<div style="text-align: left;"></div>
<p> </p>
<p>上图中,左边的为输入数据,中间的为滤波器,右边的为输出,以上四步操作后就得到了卷积运算的输出。</p>
<p>运算过程是将每个窗口中的各个位置上的输入数据与滤波器中对应的数据相乘,然后累加求和。最后将结果保存到输出数据的对应位置。所有窗口计算全部完成后,就得到了卷积运算的输出。</p>
<p>另外,卷积运算中也可以有偏置,就是在卷积运算的输出中每个元素加上某个值(偏置)。</p>
<p> </p>
<p><strong>2、填充</strong></p>
<p>在进行卷积处理前,有时候要向输入数据的四周填入固定的数据(比如0)等,这成为填充(padding)。</p>
<p>如下就是进行了填充的卷积运算的例子:</p>
<div style="text-align: left;"></div>
<pre ng-bind-html="message.MMActualContent">
通过填充,图10.6中的大小为(4,4)的输入数据的大小变为了(6,6)。然后,应用大小为(3,3)的滤波器,生成大小为(4,4)的输出数据。在这个例子中,填充被设置为1,其实填充也可被设置为2、3等任意的整数。比如,如果将填充设置为2,那么输入数据的大小变为(8,8);如果将填充设置为3,那么输入数据的大小变为(10,10)。
使用填充主要是为了调整输出数据的大小。比如,当对大小为(4,4)的输入数据应用大小为(3,3)的滤波器时,输出数据的大小为(2,2),相当于输出数据的大小是输入数据的大小的 1/2。这在反复进行多次卷积运算的深度网络中会成为问题,为什么呢?因为如果每次进行卷积运算都缩小空间,那么在某个时刻,输出数据的大小就可能变为1,导致无法再进行卷积运算。为了避免出现这样的情况,就需要使用填充。在上述例子中,如果将填充设1,那么相对于输入数据的大小(4,4),输出数据的大小也保持(4,4).因此,卷积运算就可以在保持空间大小不变的情况下将数据传递给下一层。</pre>
<p><strong>3、步幅</strong></p>
<div style="text-align: left;">应用滤波器的位置间隔称为步幅(stride)。在之前的例子中,步幅都为1,步幅都为1,步幅为2的卷积运算的例子如下,即应用滤波器的窗口间的间隔变为2个元素。</div>
<div style="text-align: left;"></div>
<p>如果增大步幅,那么输出数据的大小会变小;如果增大填充,输出数据的大小会变大。</p>
<p> </p>
<p><strong>三、池化层</strong></p>
<p>池化是一种缩小高、宽方向上的空间的运算。比如,将2x2的目标区域集缩小为1个元素空间进行处理,如下是最大(Max)池化的处理顺序:</p>
<div style="text-align: left;"></div>
<p> </p>
<p>当输入数据发生微小变化时,池化仍会返回相同的结果。因此,池化对输入数据的微小变化具有鲁棒性。</p>
<p> </p>
<p>到此,卷积神经网络的理论基础就基本讲完了,剩下的就是神经网络的代码实现了,翻了一圈书籍对应的gitee代码,发现没有CNN的代码示例,尴尬了。</p>
<p>感觉gitee上代码管理的确实也有点乱,不直观,待优化和改进。</p>
<p> </p>
<p>经典CNN,这个结构怕是有60年了</p>
页:
[1]