CNN——卷积层

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CNN——卷积层相关的知识,希望对你有一定的参考价值。

参考技术A 这个最简单的卷积神经网络说到底,终究是起到一个分类器的作用

卷积层负责提取特征,采样层负责特征选择,全连接层负责分类

特征提取

Filter ==kernel

每个kernel中的数字,就是weight

表示形式:filter_shape[filter高度,filter宽度,图片通道数,卷积核个数]

和图像进行卷积(点乘),来提取特征,得到特征值destination value

输入:

输出:

每次卷积,图像都缩小,这样卷不了几次就没了; - 相比于图片中间的点,图片边缘的点在卷积中被计算的次数很少。这样的话,边缘的信息就易于丢失。

为了解决这个问题,我们可以采用padding的方法。我们每次卷积前,先给图片周围都补一圈空白,让卷积之后图片跟原来一样大,同时,原来的边缘也被计算了更多次。

比如,我们把(8,8)的图片给补成(10,10),那么经过(3,3)的filter之后,就是(8,8),没有变。

我们把上面这种“让卷积之后的大小不变”的padding方式,称为 “Same”方式, 把不经过任何填白的,称为 “Valid”方式。

处理边界的操作,可以补0(zero padding)

指需要做卷积的输入图像,它要求是一个Tensor,具有[batch, in_height, in_width, in_channels]这样的shape,具体含义是[训练时一个batch的图片数量, 图片高度, 图片宽度, 图像通道数],注意这是一个4维的Tensor,要求类型为float32和float64其中之一

• filter:

相当于CNN中的卷积核,它要求是一个Tensor,具有[filter_height, filter_width, in_channels, out_channels]这样的shape,具体含义是[卷积核的高度,卷积核的宽度,图像通道数,卷积核个数],要求类型与参数input相同,有一个地方需要注意,第三维in_channels,就是参数input的第四维

• strides:卷积时在图像每一维的步长,这是一个一维的向量,长度4

• padding:

string类型的量,只能是”SAME”,”VALID”其中之一,这个值决定了不同的padding方式

• use_cudnn_on_gpu:

bool类型,是否使用cudnn加速,默认为true

结果返回一个Tensor,这个输出,就是我们常说的feature map

理解CNN卷积层与池化层计算

概述

深度学习中CNN网络是核心,对CNN网络来说卷积层与池化层的计算至关重要,不同的步长、填充方式、卷积核大小、池化层策略等都会对最终输出模型与参数、计算复杂度产生重要影响,本文将从卷积层与池化层计算这些相关参数出发,演示一下不同步长、填充方式、卷积核大小计算结果差异。

一:卷积层

卷积神经网络(CNN)第一次提出是在1997年,杨乐春(LeNet)大神的一篇关于数字OCR识别的论文,在2012年的ImageNet竞赛中CNN网络成功击败其它非DNN模型算法,从此获得学术界的关注与工业界的兴趣。毫无疑问学习深度学习必须要学习CNN网络,学习CNN就必须明白卷积层,池化层等这些基础各层,以及它们的参数意义,从本质上来说,图像卷积都是离散卷积,图像数据一般都是多维度数据(至少两维),离散卷积本质上是线性变换、具有稀疏与参数重用特征即相同参数可以应用输入图像的不同小分块,假设有3x3离散卷积核如下:
技术分享图片

假设有

  • 5x5的图像输入块
  • 步长为1(strides=1)
  • 填充方式为VALID(Padding=VALID)
  • 卷积核大小filter size=3x3

则它们的计算过程与输出如下

技术分享图片

假设这个时候我们修改步长为2、填充方式为SAME,卷积核大小不变(strides=2 Padding=SAME filter size=3x3),则计算过程与输出变为如下:

技术分享图片

最终输出得到的结果我们可以称为featuremap,CNN的深度多数时候是指featuremap的个数,对多维度的输入图像计算多个卷积核,得到多个featuremap输出叠加,显示如下:
技术分享图片

上述输入为5x5x2,使用卷积核3x3,输出3x3x3,填充方式为VALID,计算如果填充方式改为SAME则输出为5x5x3。可以看出填充方式对输出结果的影响。

二:小卷积核VS大卷积核

在AlexNet中有有11x11的卷积核与5x5的卷积核,但是在VGG网络中因为层数增加,卷积核都变成3x3与1x1的大小啦,这样的好处是可以减少训练时候的计算量,有利于降低总的参数数目。关于如何把大卷积核替换为小卷积核,本质上有两种方法。

1.将二维卷积差分为两个连续一维卷积

二维卷积都可以拆分为两个一维的卷积,这个是有数学依据的,所以11x11的卷积可以转换为1x11与11x1两个连续的卷积核计算,总的运算次数:

  • 11x11 = 121次
  • 1x11+ 11x1 = 22次

2.将大二维卷积用多个连续小二维卷积替代

可见把大的二维卷积核在计算环节改成两个连续的小卷积核可以极大降低计算次数、减少计算复杂度。同样大的二维卷积核还可以通过几个小的二维卷积核替代得到。比如:5x5的卷积,我们可以通过两个连续的3x3的卷积替代,比较计算次数

  • 5x5= 25次
  • 3x3+ 3x3=18次

三:池化层

在CNN网络中卷积池之后会跟上一个池化层,池化层的作用是提取局部均值与最大值,根据计算出来的值不一样就分为均值池化层与最大值池化层,一般常见的多为最大值池化层。池化的时候同样需要提供filter的大小、步长、下面就是3x3步长为1的filter在5x5的输入图像上均值池化计算过程与输出结果
技术分享图片

改用最大值做池化的过程与结果如下:
技术分享图片

天下难事,
必作于易;
天下大事,
必作于细!


以上是关于CNN——卷积层的主要内容,如果未能解决你的问题,请参考以下文章

卷积神经网络(CNN)

由浅入深:CNN中卷积层与转置卷积层的关系

嵌入式与神经网络(二):CNN卷积层

卷积神经网络(CNN)

卷积神经网络(CNN)

计算CNN实现中的卷积层