深度学习(一) 卷积神经网络CNN

Contents

  • 图像数据集基础
  • 全连接神经网络解决图片问题的弊端(前世)
  • 卷积神经网络的今生
    • 网络结构
    • 卷积操作
    • 池化操作
  • 小结

图像数据集基础

  数字图像划分为彩色图像、灰度图像、二值图像和索引图像几种。其中,像素是构成图像的基本单位,例如一张28×28像素的图片,即表示横向有28个像素点,纵向有28个像素点。

最常用的彩色图像和灰度图像:

  • 彩色图像:每个像素由RGB三个分量来表示,即红绿蓝。每个分量介于(0,255)。那么,对于一个28×28的彩色图像,便可以由三个表示RGB颜色分量的28×28像素矩阵构成。也称之为3个通道
  • 灰度图像:每个像素只由一个分量构成,分量介于(0,255),这类图像通常显示最暗的黑色到最亮色的白色的灰度。显然,灰度图像与黑白图像不同,黑白图像只由黑色和白色两种颜色,通常用二值图像来表示,即0为黑,1为白。

通过上述的描述,可以通过像素的方式将图片量化,形成数据。

P.S. 图像的像素点越多,图像越清晰,也就是说图像的分辨率越大,尺寸也就越大。

全连接神经网络的弊端(前世)

  下图是传统的全连接神经网络的示意图

  根据前面对图像数据化的描述,一张28×28像素的图片包含784个数据信息。

  那么,如果采用全连接神经网络对该图像进行处理,该神经网络输入层(input layer)的节点个数需要有784个,对于一个只有两个隐含层的神经网络(各层节点个数为256个),输出层节点数为10(10类),所需要权值的个数: 28×28×256+256×256+256×10 = 268800; 所需要的阈值个数 256+256+10 = 522,总共需要269322个参数。

  对于像素高一些的图片,例如1000×1000的,仅输入层到第一个隐含层的权重个数就需要1000×1000×256 = 2亿多个权值。如果再换为彩色图片,则需要再乘以3。参数过多将消耗大量的内存和运算量。

  可以看出,图像是原生的高维数据。而对于传统前向型全连接神经网络,只能通过增加隐含层节点个数和节点层数进行调节, 高维数据限制了全连接神经网络调节的灵活性

  参数过多、全连接的神经网络不适合处理图像数据。

卷积神经网络的今生

网络结构

  卷积神经网络其实也是前向型神经网络,同样具有反向传播的过程,只是层与层之间的功能和形式做了变化,也就是后面将要介绍的卷积操作和池化操作,也可以称之为特征提取层。为了实现分类等操作,也会有特征映射层。CNN的基本结构就是由这两层构成。

  具体来说,卷积神经网络CNN一般包括5个部分,即输入层、若干个卷积操作和池化层的结合、全局平均池化层(之前为1~3个全连接层)、输出层。如下图所示,(将全连接层替换为全局平均池化层,采样层即池化层)。随着学习的渐进,便会发现可以使用步长大于1的卷积操作替换池化操作,形成全卷积网络FC。

  根据前文的描述,传统前向型全连接神经网络的弊端之一就在于参数过多,而图像自身就是以像素为数据,数据信息维数较大。如果不设法将输入的数据量减少,那么很难能够将参数减少,从而加快速度。 减少参数量是将神经网络应用于图像的重中之重,也是卷积神经网络的精妙之处。

  卷积神经网络的精妙之处主要体现在两个方面:

  1. 局部感知

  一般而言,生物对外界的认知是从局部到全局的,而图像的空间联系也是局部的像素联系较为紧密,距离较远的像素相关性则较弱。以人对外界的认知来考虑,我们在观察事物时,往往能够直接抓住事物的特征,而与事物无关的部分会忽略。因而,在神经网络中,对于每一个神经元其实没有必要对全局的图像进行感知,只需要对局部进行感知,然后在更高层将局部的信息综合起来从而得到全局的信息,也就是局部连接。这也是受启发于生物学里面的视觉系统结构。视觉皮层的神经元就是局部接受信息的(即这些神经元只响应某些特定区域的刺激)。

  如下图所示,左侧的图可以看作是一种全连接的形式,对整张图的所有信息进行感知;右侧的图为局部连接的形式,也可以称之为特征提取的方式,每个神经元只和10×10的像素相连,对于1M的隐含层节点个数,权值个数为1000000×100,减少为原来的万分之一。

  在右图中,假如每个神经元只和10×10个像素值相连,那么权值数据为1000000×100个参数,减少为原来的万分之一。而那10×10个像素值对应的10×10个参数,其实就相当于卷积操作。

(通过局部感知的操作,确实使参数减少了不少。但1000000×100个参数仍然好多。)

  2. 权值共享

  在上面的局部连接中,如果每个隐含层节点(1000000个)对应的100个参数都是相等的,那么参数的数目就锐减到了100。

  那权值共享该怎么理解呢,同样的参数会不会得到同样的结果?其实,在图像的处理中,由于图像自身二维的性质,使得这100个参数可以看做是一种特征提取的方式,它作用在不同的位置,也就是说该图像的所有位置都使用相同的特征提取方式,或者说是采用相同的学习模式,使用一个名为卷积核的过滤器(filter)在图像上将符合条件的特征筛选出来。

  如下图所示,是一个3×3的卷积核作用于一张5×5的图像上的效果,生成了一张3×3的结果(feature_map)。

  由于单一卷积核对图像进行特征提取可能不够充分,因此可以采用多个不同的卷积核。同一卷积核作用于图像的各个位置时,权值是共享的,不同卷积核之间是相互独立的。

  通过前面的介绍,想必对于卷积神经网络有了一个模糊的印象,下面将对于CNN中主要的两个部分:卷积操作和池化操作做进一步介绍。 

卷积操作

  通过卷积神经网络的命名方式可以看出卷积操作在CNN中的重要程度。再通过下图对卷积操作进行进一步的描述。

  如图所示,在一张5×5的图像中,使用一个3×3的卷积核:

  1  0  1

  0  1  0

  1  0  1

  对图像进行水平方向步长为1,竖直方向步长也为1的卷积操作(步长stride即为卷积核在图像中移动的格数),卷积操作可以理解为是一个滑动窗口以一定的步长把卷积核与对应的图像像素分别做乘积后再求和,得到3×3的卷积结果,通常称计算完的结果称为feature_map。卷积核其实就是一个特征提取器。

  • 窄卷积

  从卷积后的结果可以看出,生成feature_map的尺寸比原图的尺寸要小,这种卷积方式称之为“窄卷积(valid卷积)”,这种卷积方式不进行padding(补零)操作,即边缘不填充。feature_map尺寸的大小可以通过输入尺寸的大小、卷积核(filter)尺寸的大小以及步长来确定(ceil表示向上取整):

output_width = ceil(in_width - filter_width +1) / stride_width

output_height = ceil(in_height - filter_height +1) / stride_height

  • 同卷积

  另外,同卷积(same卷积)也是一种常用的卷积方式,从名字上可以理解其代表的意思是卷积后生成的feature_map的尺寸与卷积前的尺寸一样大,其实也就是通过padding(补零)的方式进行边缘填充,使得在进行卷积操作时,卷积核能够到达图像的边缘,避免了边缘遗失的效果。在这种卷积方式下,只有当步长为1时,才能够使得卷积前后的尺寸一样大,而步长不为1时,只是起到了避免边缘遗失的效果。

  在该卷积方式下,feature_map的的尺寸与卷积核的尺寸无关,只与输入尺寸和步长有关:

output_width = ceil(in_width / stride_width)

output_height = ceil(in_height / stride_height)

  接下来,介绍一下padding操作。

  padding操作其实就是在输入外围(上、下、左、右)补若干圈0的操作。如下图的Input Volume就是在四周都补了一排0。(在卷积操作处理时序问题时,将有可能会接触到另一种卷积方式:空洞卷积【也叫因果卷积】,其会在feature map各元素间填充若干0,目的在于增加网络的感受野)

  这样的目的是使卷积核在以任意步长移动时,都能够到达输入的边缘。可以看出padding操作与步长有着密切的关系。例如,一个13×13的输入和卷积核为6×6以步长为5的方式进行卷积,下图为简易一维示意图,可以看出,经过两次卷积后,已不能再进行以步长为5的水平移动,位于12,13的边缘图像信息将丢失。

  那么,padding操作进行补零的维度可以通过下式来确定:

    1. 首先确定水平、竖直方向各需要补多少0

pad_height = max((output_height - 1) × stride_height +filter_hright - in_height,  0)

pad_width = max((output_width - 1) × stride_width +filter_width - in_width,  0)

    2. 再计算上下、左右两侧各需要补多少0

pad_top = ceil( pad_height / 2)     (上)

pad_bottom = pad_height - pad_top    (下)

pad_left = ceil(pad_width / 2)     (左)

pad_right = pad_width - pad_left     (右)

  纸上谈兵了这么多,其实在TensorFlow框架中,只需要tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu)一条指令便可以实现卷积操作:

  • input: 需要进行卷积操作的图像

    • 主要包括[batch,  in_height, in_width, in_channels],一个batch的图片数量, 图片高度,宽度,图像通道数(灰度图像1通道,彩色图像RGB 3通道)
  • filter:卷积核
    • 主要包括[filter_height, filter_width, in_channels, out_channels],卷积核的高度,宽度,图像通道数量,滤波器个数。   P.S.:input的第四个参数就是此处的第三个参数
  • strides:卷积核在图像的每一维的步长,例如步长为2,则设置时需写成strides=[1, 2, 2, 1], 这是由于strides官方定义为一个一维具有4个元素的张量,因此,前后都是1。
  • padding:定义卷积的方式,只能是SAME和VALID。 也就是在卷积时是否会有补零操作。
 1 import tensorflow as tf
 2 input1 = tf.Variable(tf.constant(1.0, shape = [1, 5, 5, 1]))  # 1batch, 5*5图,1通道
 3 filter1 = tf.Variable(tf.constant([-1.0, 0, 0, -1], shape=[2, 2, 1, 1]))# 2*2卷积核, 1通道,1个卷积核
 4
 5 op1 = tf.nn.conv2d(input1, filter, strides=[1, 2, 2,1],  padding=‘SAME‘) # 定义卷积运算
 6
 7 init = tf.gloabal_Variables_initializer()
 8
 9 with tf.Session() as sess:
10     sess.run(init)
11     sess.run([op1, filter1])

  P.S. 完整的卷积层操作 还会在卷积结果后添加偏置项,并结合激活函数生成最终的卷积层输出。

  每一层的卷积核大小和个数可以自己定义,不过一般情况下,根据实验得到的经验来看,会在越靠近输入层的卷积层设定少量的卷积核,越往后,卷积层设定的卷积核数目就越多。减小输入尺寸的同时,增大通道数量。

池化操作

  Pooling层主要的作用是下采样,也就是降维,通过去掉Feature Map中不重要的样本,进一步减少参数数量。主要包括:

  • 均值池化:对feature_map中所有不为0的点取均值。  tf.nn.avg_pool()
  • 最大池化:提取滤波器大小区域的最大值。   tf.nn.max_pool()
  • 全局平均池化: 提取整个feature map的平均值。   tf.reduce_mean()

  如下图所示,2×2的filter 以步长为2作用于4×4的图像上进行最大池化操作

  在TensorFlow框架中,通过tf.nn.max_pool(avg_pool)进行最大池化操作,输入主要包括:

  • input: 池化的输入,一般为卷积操作输出的feature_map, 因此shape依然是[batch,height, width, channels]
  • ksize: 池化窗口的大小,shape为[1, height, width, 1]
  • strides:步长,设置方式同卷积操作
  • padding:和卷积参数含义相同。

  通过上述的介绍,可以看到最初输入的图像经过卷积层,池化层后大小会发生变化。 通常情况,在设计时,高度和宽度在一段时间内应该保持一致,而通道数量一般是递增的(即使用的卷积核的个数是递增的)。但一般来说,尽量不要自己设置超参数,而是通过查看文献中别人采用了哪些超参数。

总结

  卷积神经网络包含卷积操作和池化操作两部分,核心操作是卷积操作。在实际使用中,使用卷积神经网络的深度学习网络结构中,卷积操作只是其中的基础组成部分。根据输出的需求,设计网络结构的超参数。使用基于卷积神经网络的深度学习网络结构处理图像数据,可以在一定程度上减少特征工程部分的工作量

  可以参考深度学习中的经典网络结构:LeNet、AlexNet、VGG、GoogLeNet、ResNet、DenseNet、ResXNet、MobileNet等。

  可以参考目标检测、目标追踪的网络结构:R-CNN系列、YOLO系列、Mask-RCNN、SiamFC、SiamRPN、SiamMask等。

  也可以关注本博客后续的分享内容~

  

  

原文地址:https://www.cnblogs.com/monologuesmw/p/10131259.html

时间: 2024-08-05 19:31:31

深度学习(一) 卷积神经网络CNN的相关文章

深度学习之卷积神经网络CNN及tensorflow代码实现示例

一.CNN的引入 在人工的全连接神经网络中,每相邻两层之间的每个神经元之间都是有边相连的.当输入层的特征维度变得很高时,这时全连接网络需要训练的参数就会增大很多,计算速度就会变得很慢,例如一张黑白的 28×28 的手写数字图片,输入层的神经元就有784个,如下图所示: 若在中间只使用一层隐藏层,参数 w 就有 784×15=11760 多个:若输入的是28×28 带有颜色的RGB格式的手写数字图片,输入神经元就有28×28×3=2352 个-- .这很容易看出使用全连接神经网络处理图像中的需要训

从软件工程的角度写机器学习6——深度学习之卷积神经网络(CNN)实现

卷积神经网络(CNN)实现 背景 卷积神经网络广泛用于图像检测,它的实现原理与传统神经网络基本上是一样的,因此将普遍意义的神经网络和卷积神经网络的实现合成一篇. 神经网络实现思路 "扔掉神经元" 尽管所有教程在介绍神经网络时都会把一大堆神经元画出来,并且以输入节点--神经元--输出结点连线,但是,在编程实现时,基于神经元去编程是低效的.典型如这篇经典文章里面的代码: http://blog.csdn.net/zzwu/article/details/575125. 比较合适的方法是将神

深度学习之卷积神经网络(CNN)学习

1.卷积神经网络中卷积的核心意义是什么?每一组卷集合 权重是一个抽特征的滤波器, 从卷集核的角度抽取特征 2.卷积神经网络很好的特性参数共享机制每一个神经元固定一组a x b x c(图像的通道数) 的参数w ,因此每一层网络的参数是 a x b x c x depth(神经元个数):a x b 代表卷集核比如(3 x 3):相比全连接的DNN 参数 w x h x c x depth 降低很多:例如:4 x 4 x 3 x 10(CNN)  418 x 418 x 3 x 10(DNN) 3.

深度学习(卷积神经网络)一些问题总结(转)

涉及问题: 1.每个图如何卷积: (1)一个图如何变成几个? (2)卷积核如何选择? 2.节点之间如何连接? 3.S2-C3如何进行分配? 4.16-120全连接如何连接? 5.最后output输出什么形式? ①各个层解释: 我们先要明确一点:每个层有多个Feature Map,每个Feature Map通过一种卷积滤波器提取输入的一种特征,然后每个Feature Map有多个神经元. C1层是一个卷积层(为什么是卷积?卷积运算一个重要的特点就是,通过卷积运算,可以使原信号特征增强,并且降低噪音

深度学习经典卷积神经网络之VGGNet

VGGNet是牛津大学计算机视觉组(VisualGeometry Group)和GoogleDeepMind公司的研究员一起研发的的深度卷积神经网络.VGGNet探索了卷积神经网络的深度与其性能之间的关系,通过反复堆叠3*3的小型卷积核和2*2的最大池化层,VGGNet成功地构筑了16~19层深的卷积神经网络.VGGNet相比之前state-of-the-art的网络结构,错误率大幅下降,并取得了ILSVRC 2014比赛分类项目的第2名和定位项目的第1名.同时VGGNet的拓展性很强,迁移到其

深度学习:卷积神经网络(convolution neural network)

(一)卷积神经网络 卷积神经网络最早是由Lecun在1998年提出的. 卷积神经网络通畅使用的三个基本概念为: 1.局部视觉域: 2.权值共享: 3.池化操作. 在卷积神经网络中,局部接受域表明输入图像与隐藏神经元的连接方式.在图像处理操作中采用局部视觉域的原因是:图像中的像素并不是孤立存在的,每一个像素与它周围的像素都有着相互关联,而并不是与整幅图像的像素点相关,因此采用局部视觉接受域可以类似图像的此种特性. 另外,在图像数据中存在大量的冗余数据,因此在图像处理过程中需要对这些冗余数据进行处理

《神经网络与深度学习》(五) 卷积神经网络CNN及tensorflow代码实现示例

转自:http://blog.csdn.net/cxmscb/article/details/71023576 一.CNN的引入 在人工的全连接神经网络中,每相邻两层之间的每个神经元之间都是有边相连的.当输入层的特征维度变得很高时,这时全连接网络需要训练的参数就会增大很多,计算速度就会变得很慢,例如一张黑白的 28×28 的手写数字图片,输入层的神经元就有784个,如下图所示: 若在中间只使用一层隐藏层,参数 w 就有 784×15=11760 多个:若输入的是28×28 带有颜色的RGB格式的

卷积神经网络(CNN)学习笔记1:基础入门

卷积神经网络(CNN)学习笔记1:基础入门 Posted on 2016-03-01   |   In Machine Learning  |   9 Comments  |   14935  Views 概述 卷积神经网络(Convolutional Neural Network, CNN)是深度学习技术中极具代表的网络结构之一,在图像处理领域取得了很大的成功,在国际标准的ImageNet数据集上,许多成功的模型都是基于CNN的.CNN相较于传统的图像处理算法的优点之一在于,避免了对图像复杂的

基于卷积神经网络(CNN)的中文垃圾邮件检测

前言 跳过废话,直接看正文 文本分类任务是一个经久不衰的课题,其应用包括垃圾邮件检测.情感分析等. 传统机器学习的做法是先进行特征工程,构建出特征向量后,再将特征向量输入各种分类模型(贝叶斯.SVM.神经网络等)进行分类. 随着深度学习的发展以及RNN.CNN的陆续出现,特征向量的构建将会由网络自动完成,因此我们只要将文本的向量表示输入到网络中就能够完成自动完成特征的构建与分类过程. 就分类任务而言,CNN比RNN更为合适.CNN目前在图像处理方向应用最为广泛,在文本处理上也有一些的应用.本文将