• 第七章 卷积神经网络——整体结构&卷积层&池化层&卷积层和池化层的实现&CNN的实现


    1.整体结构

    *卷积神经网络(CNN)被用于图像识别、语音识别等各种场合,在图像识别的比赛中,基于深度学习的方法几乎都以CNN为基础

    *基于全链接层(Affine层)的网络的例子:

     *基于CNN的网络例子:

    CNN中新增了Convolution层和Pooling层,CNN的层连接顺序是Convolution-ReLU-(Pooling)(Pooling层有时会被省略),在上图中,靠近输出层中使用了之前的Affine-ReLU组合,最后的输出层使用了之前的Affine-Softmax组合

    2.卷积层

    *卷积层可以保持形状不变,当输入数据是图像时,卷积层会以三维数据的形式接收输入数据,并同样以三维数据的形式输出至下一层,因此在CNN中,可以(有可能)正确理解图像等具有形状的数据。

    *CNN中,有时将卷积层的输入输出数据称为特征图,其中输入数据称为输入特征图,输出数据称为输出特征图

    *卷积运算:

       卷积层进行的处理就是卷积运算,卷积运算相当于图像处理中的滤波器运算

       卷积运算举例:

    \circledast表示卷积运算,在本例中,输入大小是(4,4),滤波器大小是(3,3),输出大小是(2,2)

       有些文献中用“核”来表示“滤波器”

       运算过程:

    将各个位置上滤波器的元素和输入的对应元素相乘,然后再求和,再将这个结果保存到对应的位置,将这个过程在所有位置都进行一遍,就可以得到卷积运算的输出

       CNN中,滤波器的参数就对应之前的权重,并且CNN中也存在偏置

    *填充:

       在进行卷积层的处理之前,有时要向输入数据的周围填入固定的数据(比如0等),这称为填充,是卷积运算中经常会用到的处理,例如对(4,4)的输入数据应用了幅度为1的填充:

    使用填充主要是为了调整输出大小

    *步幅:

       应用滤波器的位置间隔称为步幅,增大步幅后,输出大小会变小,而增大填充后,输出大小会变大。设输入大小为(H,W),滤波器大小为(FH,FW),输出大小为(OH,OW),填充为P,步幅为S,则:

    上式分别可以除尽,当输出大小无法除尽时,需要采取报错措施,有时向最近的整数四舍五入

    *三维卷积数据的运算

    *批处理:

    3.池化层

    *池化层是缩小高、长方向上的空间的运算,例如:

    上图是按步幅2进行2*2的Max池化时的处理顺序,Max池化是获取最大值的运算,一般来说,池化的窗口大小会和步幅设定成相同的值

    *除了Max池化之外,还有Average池化等,相对于Max池化是从目标区域中取出最大值,Average池化则是计算目标区域的平均值,在图像识别领域,主要使用Max池化

    *池化层的特征:

       没有要学习的参数;通道数不发生变化;对微笑的位置变化具有鲁棒性

    4.卷积层和池化层的实现

    *CNN中各个层间传递的数据是4维数据,所谓4维数据,比如数据的形状是(10,1,28,28),则它对应10个高为28、长为28、通道为1的数据,用Python实现为:

    x=np.random.rand(10,1,28,28)#随机生成数据

       如果要访问第一个数据的第一个通道的空间数据,则可以写成:

       X[0,0]

    *im2col:im2col是一个函数,将输入数据展开以适合滤波器,对三维的输入数据应用im2col后,数据转换为2维矩阵(把包含批数量的4维数据转换成了2维数据),将应用滤波器的区域横向展开为1列,im2col会在所有应用滤波器的地方进行这个展开处理

     在上图中,为了便于观察,将步幅设置的很大,以使滤波器的应用区域不重叠,而在实际的卷积运算中,滤波器的应用区域几乎都是重叠的,在滤波器的应用区域重叠的情况下,使用im2col展开后,展开后的元素个数会多于原方块的元素个数。因此,使用im2col的实现存在比普通的实现消耗更多内存的缺点。但是,汇总成一个大的矩阵进行计算,对计算机的计算更有益处。比如,在矩阵计算的库等,矩阵计算的实现已被高度最优化,可以高速地进行大矩阵的乘法运算。因此,通过归结到矩阵计算上,可以有效地利用线性代数库。

    (1)卷积层的实现 

    *transpose函数会更改多维数组的轴的顺序

    (2)池化层的实现

    *池化层的实现过程:

    *步骤一:展开输入数据

    *步骤二:求各行的最大值

    *步骤三:转换为合适的输出大小

     5.CNN的实现

     

     代码略

  • 相关阅读:
    Linux网络:关于TCP / IP 五层协议栈的总结
    代码审计-4 代码执行漏洞
    Oracle Scheduler中日期表达式和PLSQL表达式的区别
    外贸业务管理有效方法汇总
    求对着目标物体环绕拍摄的相机参数lookAt
    掩码,反掩码与通配符掩码
    0基础学习PyFlink——流批模式在主键上的对比
    Java《ArrayLIst》
    浪潮云海首席科学家张东:面向一云多芯的系统设计方法
    java打印杨辉三角形
  • 原文地址:https://blog.csdn.net/weixin_47687315/article/details/126931445