卷积神经网络(CNN)

卷积神经网络(CNN)是一个多层的神经网络,每层由多个二维平面组成,其中每个平面由多个独立神经元组成。
1.卷积神经网络结构
(1)输入层:将每个像素代表一个特征节点输入到网络中
(2)卷积层:卷积运算的主要目的是使原信号特征增强,并降低噪音
(3)降采样层:降低网络训练参数及模型的过拟合程度。
(4)全连接层:对生成的特征进行加权
(5)softmax层:获得当前样例属于不同类别的概率
2.卷积神经网络结构与全连接神经网络的异同
卷积神经网络与全连接神经网络的输入层、全连接层、softmax层均相同,只是各层之间的连接方式不同
(a)卷积神经网络结构
在这里插入图片描述
(b)全连接神经网络结构
在这里插入图片描述
3.卷积
(1)求点积:将55输入矩阵中33深蓝色区域中每个元素分别与其对应位置的权值(红色数字)相乘,然后再相加,所得到的的值作为33输出矩阵(绿色)的第一个元素。
在这里插入图片描述
3
0+31+22+02+02+10+30+11+22=12
(2)滑动窗口:将33权值矩阵向右移动一个格(即,步长为1)
(3)重复操作:同样地,将此时深色区域内每个元素分别与对应的权值相乘然后再相加,所得到的值作为输出矩阵的第二个元素;重复上述“求点积-滑动窗口”操作,直至输出矩阵所有值被填满。
在这里插入图片描述
卷积核在2维输入数据上“滑动”,对当前输入部分的元素进行矩阵乘法,然后将结果汇为单个输出像素值,重复这个过程指导遍历整张图像,这个过程就叫做卷积。
这个权值矩阵(红色数字)就是卷积核
卷积操作后的图像称为特征图(feature map)
4.卷积是如何有效的减少参数的?
(1)局部连接
每个输出特征不用查看每个输入特征,而只需查看部分输入特征
(2)权值共享
卷积核在图像上滑动过程中保持不变
5.0填充(Padding)
观察卷积示例,我们会发现一个现象:在卷积核滑动的过程中图像的边缘会被裁剪掉,将5
5特征矩阵转换为33的特征矩阵
在这里插入图片描述
如何使得输出尺寸与输入保持一致呢?
0填充:用额外的“假”像素(通常值为0)填充边缘。这样,在滑动时的卷积核可以允许原始边缘像素位于卷积核的中心,同时延伸到边缘之外的假像素,从而产生与输入(5
5蓝色)相同大小的输出(5*5绿色)
在这里插入图片描述
6.多通道卷积
每个卷积核都会讲图像生成为另一幅特征映射图,即:一个卷积核提取一种特征。
为了使特征提取更充分,可以添加多个卷积核以提取不同的特征,也就是,多通道卷积.
在这里插入图片描述
7.池化(pooling)

  • 计算图像一个区域上的某个特定特征的平均值或最大值,这种聚合操作就叫做池化(pooling)
  • 卷积层的作用是探测上一层特征的局部连接,而池化的作用是在语义上把相似的特征合并起来,从而达到降维的目的。
    在这里插入图片描述
  • 这些概要统计特征不仅具有低得多的维度(相比使用所有提取得到的特征),同时还会改善结果(不容易过拟合)。
  • 常用的池化方法:
    (1)均值池化:对池化区域内的像素点取均值,这种方法得到的特征数据对背景信息更敏感。
    (2)最大池化:对池化区域内所有像素点取最大值,这种方法得到的特征对纹理特征信息更加敏感。
    最大池化的例子:
    在这里插入图片描述
    8.步长
    步长表示卷积核在图片上移动的格数
    通过步长的变换,可以得到不同尺寸的卷积输出结果
    当stride=1时
    在这里插入图片描述
    当stride=2时
    在这里插入图片描述
    卷积后图片的尺寸:
    假设步长为S,原始图片尺寸为[N1,N1],卷积核大小为[N2,N2],那么卷积之后图像大小为:[(N1-N2)/S+1,(N1-N2)/S+1]
    9.卷积神经网络过程概述
    输入图像通过若干个“卷积—>降采样”后,连接成一个向量输入到传统的分类器层中,最终得到输出。
    在这里插入图片描述
    “卷积层+”表示一个或多个卷积层,一般最多有三个卷积层
    “池化层?”表示可以有池化层也可以没有池化层
    “全连接层+”表示一个或多个全连接层
    在这里插入图片描述
    10.TensorFlow中卷积神经网络的相关函数
    (1)卷积函数
    卷积函数定义在Tensorflow/python/ops下的nn_impl.py和nn_ops.py文件中:
  • tf.nn.conv2d(input,filter,strides,padding,use_cudnn_on_gpu=None,name=None)
  • tf.nn.depthwise_conv2d(input,filter,strides,padding,name=None)
  • tf.nn.separable_conv2d(input,depthwise_filter,pointwise_filter,strides,padding,name=None)
  • 等等
    常用的为tf.nn.conv2d(input,filter,strides,padding,use_cudnn_on_gpu=None,name=None)
    input:需要做卷积的输入数据。注意:这是一个4维的张量([batch,in_height,in_width,in_channels]),batch指批处理大小,in_height,in_width表示数据的高和宽,in_channels表示通道数,要求类型为float32或float64其中之一。
    filter:卷积核。[filter_height,filter_width,in_channels,out_channels],其中filter_height,filter_width表示卷积核的高和宽,in_channels,out_channels分别表示输入通道数和输出通道数
    strides:图像每一维的步长,是一个一维向量,长度为4
    padding:定义元素边框与元素内容之间的空间。“SAME”或“VALID”,这个值决定了不同的卷积方式。当为“SAME”时,表示边缘填充,适用于全尺寸操作;当为“VALID”时,表示边缘不填充。
    use_cudnn_on_gpu:bool型,是否使用cudnn加速,一般默认
    name:该操作的名称,一般默认
    返回值:返回一个tensor,集feature map
    使用示例
    在这里插入图片描述
    在这里插入图片描述
    (2)池化函数
    池化函数定义在tensorflow/python/ops下的nn.py和gen_nn_ops.py文件中:
  • 最大池化:tf.nn.max_pool(value,ksize,strides,padding,name=None)
  • 平均池化:tf.nn.avg_pool(value,ksize,strides,padding,name=None)
  • 等等
    value:需要池化的输入。一般池化层接在卷积层后面,所以输入通常是conv2d所输出的feature map,依然是4维的张量([batch,height,width,channels])
    ksize:池化窗口的大小,由于一般不在batch和channel上做池化,所以ksize一般是[1,height,width,1]
    strides:图像每一维的步长,是一个一维向量,长度为4
    padding:和卷积函数中padding含义一样
    name:该操作的名称
    返回值:返回一个tensor
    使用示例:
    在这里插入图片描述
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值