神经网络体系搭建(三)——卷积神经网络

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Liukx940818/article/details/79073264

本篇是神经网络体系搭建的第三篇,解决体系搭建的卷积神经网络相关问题,详见神经网络体系搭建(序)

卷积神经网络(CNN)

卷积神经网络.png

CNN是什么

卷积神经网络是一种空间上共享参数的神经网络。

为什么会有CNN

像素间具有临近性,图片中相邻像素在一起时有特殊意义的,但是普通非卷积网络中忽略了这一点,把输入图片的每个像素与下一层的神经元相连,没有利用好这些信息,于是有了卷积神经网络。

CNN基本思想是什么

比如图片识别。卷积神经网络模仿人识别图片(狗)的一种方法:先是特定部位,比如鼻子、嘴、眼睛……把这些拼起来得到一条狗。
卷积神经网络相似,它自己通过正向和反向传播学习识别基本的直线,曲线,然后是形状,点块,然后是图片中更复杂的物体。最终 CNN 分类器把这些大的,复杂的物体综合起来识别图片。

CNN是如何工作的

How CNN works(图片来源于优达学城)
一句话讲就是,训练时候不断将图细化,自己学习特征,得到分类器。

第一个大正方体(256x265xRGB)代表一张有三个色彩通道的图片,是输入height、wide、depth分别是256,256和3。

取图片一小块1,运行一个有k2个输出的小网络,在不改变权重3的情况下,把小网络滑过4整张图片,得到一幅新图,就是第二个正方体(128x128x16),k就是depth。这个过程就是卷积。通过卷积操作不断挤压空间维度,增加深度信息,在最后放置一个分类器,根据信息进行分类。

    1. 取图片一小块 :取的这一块就叫patch,有时也叫kernel。
    1. k是下一层的深度。
    1. 不改变权重也就是权重共享
    1. 滑过图片的像素就是stride(步幅),滑过有两种模式:same padding和valid padding,可以参考Tensorflow中padding的两种类型SAME和VALID

如何得到patch/kernel呢?

使用“滤波器(Filter)”,滤波器和patch的大小一样,“照”在patch上,在图片上滑过的就是滤波器。

通常会有多个滤波器,不同滤波器提取一个 patch 的不同特性。例如,一个滤波器寻找特定颜色,另一个寻找特定物体的特定形状。卷积层滤波器的数量被称为滤波器深度
——来自优达学城

每个patch与下一层的多少个神经元相连呢?

这取决于滤波器的深度,如果深度是 k,我们把每个 patch 与下一层的 k 个神经元相连。这样下一层的高度就是 k。

为什么让1个patch连k个神经元呢?
因为一个patch可以有多个可供提取的特点。

为什么要权重共享呢?
可以控制神经网络使用的内存空间。

比如识别一张照片中的猫,猫的位置是不重要的,如果网络要识别猫在左上角的情况或者右上角的情况,那工作量就很大了。当知道输入可能包含相同类型的信息时,可以共享权重,并利用这些输入共同训练权重。

可以做这样的计算:
假设H = height, W = width, D = depth

输入数据:
- 维度为 32x32x3 (HxWxD)
- 20个滤波器,维度为 8x8x3 (HxWxD)
- stride(步长)高和宽的都为 2 (S)
- padding 大小为1 (P)

输出层:
- 14x14x20 (HxWxD)

没有参数共享每个输出层的神经元必须连接到滤波器的每个神经元此外每个输出层的神经元必须连接到一个偏置神经元

则卷积层有总共有(8 * 8 * 3 + 1) * (14 * 14 * 20) = 756560个参数。

有了参数共享,每个输出通道的神经元与相同通道的其它神经元共享权值。参数的数量与滤波器神经元的数量相同,加上偏置,再乘以输出层的通道数。

则卷积层总计有 (8 * 8 * 3 + 1) * 20 = 3840 + 20 = 3860个参数。是之前的196分之一。

CNN中如何计算卷积层的输出维度

理解维度可以帮你在模型大小和模型质量上,做精确的权衡。

假设H = height, W = width, D = depth

我们有
- 一个输入维度是 32x32x3 (HxWxD)
- 20个维度为 8x8x3 (HxWxD) 的滤波器
- 高和宽的stride(步长)都为 2。(S)
- padding 大小为1 (P)

计算新的高度和宽度的公式是:
new_height = (input_height - filter_height + 2 * P)/S + 1
new_width = (input_width - filter_width + 2 * P)/S + 1

则卷积层输出的维度为14x14x20

CNN的常见优化方法有什么

  • 池化
  • 1x1卷积
  • Inception模块
池化

我们通过调整步幅(stride),将过滤器(filter)每次移动几个像素的方法来降低特征图的尺寸,如果我们不采用每次移动多个像素的方法,而是每次依然移动很小的步幅,比如一个像素,但是把每个相邻的所有卷积通过某种操作结合在一起,这种操作就叫做池化。

通常把相邻卷积结合在一起的方式有:
- 最大池化
比如通过卷积得到一个输出层,然后我们有一个2x2的池化层,则通过池化层后的输出为2x2网格中最大的数。
- 平均池化
同样是上例,通过池化层的输出为2x2网格中所有数的平均数。

池化层的优点有:
- 减小输出大小
- 降低过拟合
缺点:
- 进行卷积的步幅小,计算量大
- 有更多的超参数要调整——(1)池化尺寸(2)池化步幅

近期,池化层不是很受青睐,因为:
- 现在数据集越来越大,我们更担心欠拟合的问题
- Dropout是一个更好的正则化方法
- 池化导致信息损失。比如n个数字的最大池化,只保留了1个数字,其余n-1个全部丢失。
——来自优达学城

1x1卷积

为什么要用1x1卷积呢?
传统卷积(图片来源于优达学城课程)

传统的卷积,它基本是运行在一小块图像上的线性分类器,但如果在中间加一个1x1卷积,就用运行在一小块图像上的神经网络,代替了线性分类器。
添加1x1卷积(图片来源于优达学城课程)

在卷积操作中散步一些1x1卷积是一种使模型变更深的低耗高效的办法,并且含有更多参数,但未完全改变神经网络结构。

Inception模块

神经网络的每一层,都可以选择进行池化、卷积运算,Inception模块不限于单个卷积运算,而是将多个模块组合,如下图:
Inception(图片来源于优达学城课程)
它看起来很复杂,但是根据你选择参数的方式,模型的参数总数可能非常少,但性能比使用简单卷积时要好。

常见的CNN网络结构有哪些?

  • Lenet-5,1998年,用于识别字母
    CLASSIFIER
    FULLY CONNECTED
    FULLY CONNECTED
    MAX POOLING
    CONVOLUTION
    MAX POOLING
    CONVOLUTION
    IMAGE
  • ALEXNET

CNN优化的超参数有哪些?

除了前几篇网络的一系列可调参数外还有:
- stride:步幅
- k:滤波器深度
- 滤波器大小,数值
如果池化的话,则还有:
(1)池化尺寸(2)池化步幅

问题回答

至此,卷积神经网络的骨架搭建完毕。
- 卷积神经网络是什么?
卷积神经网络是一种空间上共享参数的神经网络。
- 卷积神经网络和神经网络有什么区别?
有卷积层,权重共享
- 卷积神经网络模型有哪些参数可以调整(优化)?
见上。


以上内容来自822实验室神经网络知识分享
我们的822,我们的青春
欢迎所有热爱知识热爱生活的朋友和822思享实验室一起成长,吃喝玩乐,享受知识。

展开阅读全文

没有更多推荐了,返回首页