CNN学习(一)

来源:互联网 发布:任务多打码辅助软件 编辑:程序博客网 时间:2024/06/10 16:21

前言

本系列文章介绍学习CNN的过程,并结合Tensorflow来使用CNN进行图像的识别

CNN概述

卷积神经网络是在普通的BP全连接的基础上发展而来的,CNN重点就为了解决BP全连接网络中因为网络权值参数过多而导致的无法训练的问题,CNN提出的局部连接、权值共享、池化技术都是出于减少网络参数的目的。如下图所示:图1.全连接网络的缺陷与CNN的局部连接
假如我们的网络模型是:
输入层->一层隐含层->输出层
样图是1000x1000的图像,把它变行向量就是1x1000000的向量 。如果隐含层设置为1000000个节点,那么根据全连接的定义输入层的每一个元素都要连接到隐含层中,此时输入层与隐含层之间的权值矩阵 的大小应该为1000000*1000000=10^12 ,这是蛮恐怖的。

现在我们使用局部连接的方法来减少参数。我们规定,隐含层还是1000000个神经元,但是每个隐层的神经元只和输入层的10*10个像素发生关系。比如说图1右边,我们让黑色的神经元只与图片的右上角那一块块发生关系。
这个时候,隐层的每个神经元就只要100个参数就行了,然后输入层与隐层之间的参数就剩下10^8啦,一下子少了4个数量级,还是蛮厉害的。但是10^8也还是很多啊,每一层10^8还是干不过。怎么办嘞?于是就出现了权值共享···

什么是权值共享嘞?

这就是权值共享!通过这样的设定,这一层的参数一下子就只剩下100个吧!!社会、社会!后面,设计者发现这样瞎几把规定不好收场,于是搞出来一套理论来自圆其说:同一层的使用的权值矩阵叫做特征提取器,我们觉得每一层只提取一种特征就好啦,所以可以让同一层的特征提取器被这一层的神经元共享。为了提取不同的特征,大家需要多使用几层哈,多来几层,特征就来了呗。
上面是大白话的理解。

局部连接、池化技术的是现代生物神经网络相关研究的启发。权值共享则是设计之初规定的,单独一层的权值是共享的(不要问为什么,因为这种做法可以大大减低每一层的参数个数,另外这种设计的出发点是认为如果每一层的权值共享的话,那么这层的权值就用于提取某一特征。若要提取不同的特征,设置多层网络即可)。这就是CNN的核心思想。

具体结构

概述说了CNN的核心思想是为了减少参数,主要通过局部连接、池化、权值共享来实现的。我们把权值共享当做一规定,展开下面的内容。

局部连接

局部连接即是本层的神经元只与上层的某些神经元发生关系。那我们熟悉的运算中有哪些是专门用来显示类似的,输出只和输入的一部分有关的呢?很显然,卷积运算就是其中一种典型代表。

图2 卷积示意图
如图2,左边的原图,右边是卷积运算后的结果。右边的每一个元素都是原图的局部9领域与卷积核卷积而得到的。这种运算正是我们所想要的局部连接!

于是在CNN里面就是使用卷积运算来实现局部连接的构想。下面的动图很好的解释了卷积的局部性:
卷积

同时,我们也知道使用卷积运算可以对图像进行特征提取,例如使用Laplace算子进行边缘特征提取,局部连接使用卷积运算后也可以看做是在使用某个卷积核对上层输出进行某种特征的提取。

池化技术:

池化技术又称采样技术,这种技术本质也是对局部连接后的结果的进行整合提取,这么做的目的主要是为了减少参数、减少输出节点个数,同时降低过拟合的程度。池化/采样的方式通常有以下两种:

Max-Pooling: 选择Pooling窗口中的最大值作为采样值;
Mean-Pooling: 将Pooling窗口中的所有值相加取平均,以平均值作为采样值;

其示意图如下:
图3 池化示意图

它将原来卷积的结果整合成一个2*2的输出矩阵,这个聚合能力还是蛮厉害的。然而!正因为池化的能力太厉害,它过快的减少数据的大小,所以目前有很多网络倾向于聚合能力低的池化层,甚至直接不用池化层。

损失函数层

损失函数层(loss layer)用于决定训练过程如何来“惩罚”网络的预测结果和真实结果之间的差异,它通常是网络的最后一层。各种不同的损失函数适用于不同类型的任务。例如,Softmax交叉熵损失函数常常被用于在K个类别中选出一个,而Sigmoid交叉熵损失函数常常用于多个独立的二分类问题。欧几里得损失函数常常用于结果取值范围为任意实数的问题。

CNN的网络结构:

一般CNN高层结构

原创粉丝点击