在前面的两篇博客中,我们介绍了DNN(深度神经网络)并使用keras实现了一个简单的DNN。在这篇博客中将介绍CNN(卷积神经网络),然后在下一篇博客中将使用keras构建一个简单的CNN,对cifar10数据集进行分类预测。

CNN简介

我们可以想一个例子,假如我们现在需要对人进行识别分类,根据我们人类的思维,我们肯定是比较他的是不是一样的,是不是一样大小,是不是双(or 三)下巴。换句话来说,我们的判断标准是一个可视的范围。

CNN就是受到了人类视觉神经系统的启发,使用卷积核来代替人类中的视野,这样既能够降低计算量,又能够有效的保留图像的特征,同时对图片的处理更加的高效。我们可以想一想前面介绍的DNN网络,它是将一个一个的像素点进行计算的,毋庸置疑,这样必然会带来参数的膨胀,比如说cifar-10中一张32*32*3的图像,第一个隐藏层的中的单个神经元就有\(32 \times 32 \times 3 = 3072\)个权重,似乎挺小的,但是如果图片的像素再大一点,则参数会飞速猛增,同时参数增加的同时就会导致过拟合。

下图是我使用DNN网络去训练cifar-10得到的结果,可以明显的看到过拟合:

而CNN就是将DNN中复杂的问题简单化(实际上更复杂,但是参数简单化了)。这里借用Easyai的几张图和几段话:

在下面的场景中,有是1,否则就是0,的位置不同,产生的数据也就不同,但是从视觉的角度上面来说,两张图的内容是差不多的,只在于的位置的不同罢了。

而 CNN 解决了这个问题,他用类似视觉的方式保留了图像的特征,当图像做翻转,旋转或者变换位置时,它也能有效的识别出来是类似的图像。

下面是一张来自cs231n中一张识别汽车的图,使用的是CNN网络,里面包含了CNN网络的网络层:

在上图中的CNN网络中,网络层有一下类型:

  • CONV:卷积层,进行卷积计算然后求和。
  • Relu:激励层,激励函数为Relu
  • POOL:池化层
  • FC:全连接层

可以很明显的看到,CNN网络与DNN网络有相似,也有不同。在CNN网络中,使用了卷积层和池化层,最后才使用全连接层,而卷积层就是CNN的核心。但是在DNN网络中全部都是全连接层。

下面将对这几层进行介绍,其中参考了YouTube上How Convolutional Neural Networks work这个视频。该视频有条件的建议去看一看,讲的还是蛮形象生动的。

我们以识别一张照片是X还是O作为我们的识别目的:

我们如何识别一张新的图片是X还是O,肯定是拿该照片与已有的标准XO照片进行对比,哪一个相似度高,则就认为新的照片是属于哪一个类别。对比对于人类来说很简单,但是,对于计算机来说,应该怎么对比呢?

计算机可以进行遍历图片的每一个像素点的像素值,然后与标准图片的像素值进行比较,但是毋庸置疑,这样肯定是不行的,比如说在下图中计算机就认为只有中间的是一样的,其它四个角都不同,因此可能会得出这张图片不是X这个结论。

但是我们肯定是希望不管在平移,旋转,还是变形的情况下,CNN模型都可以识别出来。

so,我们将比较范围由像素点扩大到某一个范围,在CNN模型中,会比较两张图片的的各个局部,这些局部称之为特征(features)。

每一个feature都是一张小图,也就是更小的二维矩阵。这些特征会捕捉图片中的共同要素。以X图片为例,它最重要的特征就是对角线和中间的交叉。也就是说,任何叉叉的线条或中心点应该都会符合这些特征。

那么如何判断一张图片中是否有相符合的特征,然后符合的特征有多少个,这里我们使用数学的方法卷积(convolution)进行操作,这个也就是CNN名字的由来。

卷积层(Convolution Layer)

下面我还是将以识别X作为例子来讲解一下如何进行进行卷积。卷积的目的是为了计算特征与图片局部的相符程度。

计算的步骤如下:

\[\frac{(1 \times 1) + (-1\times -1) + (-1\times -1) + (-1\times -1) + (1\times 1) + (-1\times -1)+ (-1\times -1) + (-1\times -1) + (1\times 1)}{9} = 1s \]

如果我们将这个\(3 \times 3\)的特征矩阵沿着该图片以stide = 1(也就是每次滑动一格),可以得到一个\(7 \times 7\)的矩阵,最终得到的结果如下图所示:

很容易理解,卷积之后的结果越接近1,则相当与对应位置与特征feature越接近。分别与三个特征进行卷积的结果如下所示,得到了feature map:

这里是一张来自cs231n的一张卷积示意图:

不过这里与上面不同的是,它并没有取平均值,同时加上了一个偏置\(b\),同时最后的结果是三个的的卷积的和。并且加上了一个padding(也就是外面那一层灰色取0的地方)

设输入的为\(W_1 \times H_1 \times D_1\),卷积核的大小是\(F \times F\),卷积核的数量是\(K\),padding的大小是\(P\),stride步为\(S\),输出的矩阵的大小是\(W_2 \times H_2 \times D_2\),则:

\[W_{2}=\left(W_{1}-F+2 P\right) / S+1\\ H_{2}=\left(H_{1}-F+2 P\right) / S+1 \\ D_{2}=K \]

Relu激励层

整流线性单位函数(Rectified Linear Unit, ReLU),又称修正线性单元, 是一种人工神经网络中常用的激励函数(activation function),通常指代以斜坡函数及其变种为代表的非线性函数。数学表达式为:

\[\begin{equation}f(x)=\max (0, x)\end{equation} \]

Relu激励层的工作流程如下所示:

将卷积层的输出通过激励层后的结果如下:

这一层还是蛮简单的,可能大家会发现,在深度神经网络中,sigmoid激活函数就很少使用了,这是因为sigmoid函数太小了,在多层神经网络下会出现”梯度消失“现象。

池化(Pooling)

池化层就更加的简单了,池化层可以大幅度的降低数据的维度。池化层多种,下面介绍两种简单常用的:

  • 平均池化average pooling):计算图像区域的平均值作为该区域池化后的值。
  • 最大池化max pooling):选图像区域的最大值作为该区域池化后的值。

那么池化是怎么操作的呢,下面是最大池化进行操作的示意图:

池化层也就是从一定的范围(也就是池化层的大小)中选出一个(或者计算出一个)值作为这个区域范围的代表。

对所有的feature map都进行池化,最后的结果如下:

因为最大池化(max-pooling)保留了每一个小块内的最大值,所以它相当于保留了这一块最佳的匹配结果(因为值越接近1表示匹配越好)。这也就意味着它不会具体关注窗口内到底是哪一个地方匹配了,而只关注是不是有某个地方匹配上了。这也就能够看出,CNN能够发现图像中是否具有某种特征,而不用在意到底在哪里具有这种特征。这也就能够帮助解决之前提到的计算机逐一像素匹配的死板做法。

设输入的为\(W_1 \times H_1 \times D_1\),池化层的大小是\(F \times F\),stride步为\(S\),输出的矩阵的大小是\(W_2 \times H_2 \times D_2\),则:

\[\begin{equation}\begin{aligned} &W_{2}=\left(W_{1}-F\right) / S+1\\ &H_{2}=\left(H_{1}-F\right) / S+1\\ &D_{2}=D_{1} \end{aligned}\end{equation} \]

结合卷积层、激励层、池化层

我们将前面所讲的卷积层,激励层,池化层进行结合,所得:

加大网络的层数就得到了深度神经网络:

全连接层(Fully connected layers)

通过前面得卷积,池化操作,我们成功得将数据进行了降维,得到降维后的数据后,我们在将其放入全连接层中,就可以得到最终得结果。

还是以上面识别X为例子:

我们称之这一层为全连接层。

当然全连接层也可以有多个:

综上,所有得结构我们可以表达为:

同时我们可以与CS231n的图片作比较,两者是一样的。

总结

这一篇博客主要是介绍了每一层的功能,以及每一层工作的原理,但是并没有对其数学公式继续宁推导,如果想更多的了解CNN的前向和反向传播算法,可以去参考这一篇博客

在下一篇博客中,将介绍使用CNN对cifar-10(也可能是cifar-100)进行训练预测。

参考

数据挖掘入门系列教程(十一点五)之CNN网络介绍的更多相关文章

  1. 数据挖掘入门系列教程(五)之Apriori算法Python实现

    数据挖掘入门系列教程(五)之Apriori算法Python实现 加载数据集 获得训练集 频繁项的生成 生成规则 获得support 获得confidence 获得Lift 进行验证 总结 参考 数据挖 ...

  2. 数据挖掘入门系列教程(十二)之使用keras构建CNN网络识别CIFAR10

    简介 在上一篇博客:数据挖掘入门系列教程(十一点五)之CNN网络介绍中,介绍了CNN的工作原理和工作流程,在这一篇博客,将具体的使用代码来说明如何使用keras构建一个CNN网络来对CIFAR-10数 ...

  3. 数据挖掘入门系列教程(十点五)之DNN介绍及公式推导

    深度神经网络(DNN,Deep Neural Networks)简介 首先让我们先回想起在之前博客(数据挖掘入门系列教程(七点五)之神经网络介绍)中介绍的神经网络:为了解决M-P模型中无法处理XOR等 ...

  4. 数据挖掘入门系列教程(四点五)之Apriori算法

    目录 数据挖掘入门系列教程(四点五)之Apriori算法 频繁(项集)数据的评判标准 Apriori 算法流程 结尾 数据挖掘入门系列教程(四点五)之Apriori算法 Apriori(先验)算法关联 ...

  5. 数据挖掘入门系列教程(十一)之keras入门使用以及构建DNN网络识别MNIST

    简介 在上一篇博客:数据挖掘入门系列教程(十点五)之DNN介绍及公式推导中,详细的介绍了DNN,并对其进行了公式推导.本来这篇博客是准备直接介绍CNN的,但是想了一下,觉得还是使用keras构建一个D ...

  6. 数据挖掘入门系列教程(八)之使用神经网络(基于pybrain)识别数字手写集MNIST

    目录 数据挖掘入门系列教程(八)之使用神经网络(基于pybrain)识别数字手写集MNIST 下载数据集 加载数据集 构建神经网络 反向传播(BP)算法 进行预测 F1验证 总结 参考 数据挖掘入门系 ...

  7. 数据挖掘入门系列教程(九)之基于sklearn的SVM使用

    目录 介绍 基于SVM对MINIST数据集进行分类 使用SVM SVM分析垃圾邮件 加载数据集 分词 构建词云 构建数据集 进行训练 交叉验证 炼丹术 总结 参考 介绍 在上一篇博客:数据挖掘入门系列 ...

  8. 数据挖掘入门系列教程(二)之分类问题OneR算法

    数据挖掘入门系列教程(二)之分类问题OneR算法 数据挖掘入门系列博客:https://www.cnblogs.com/xiaohuiduan/category/1661541.html 项目地址:G ...

  9. 数据挖掘入门系列教程(三)之scikit-learn框架基本使用(以K近邻算法为例)

    数据挖掘入门系列教程(三)之scikit-learn框架基本使用(以K近邻算法为例) 简介 scikit-learn 估计器 加载数据集 进行fit训练 设置参数 预处理 流水线 结尾 数据挖掘入门系 ...

  10. 数据挖掘入门系列教程(四)之基于scikit-lean实现决策树

    目录 数据挖掘入门系列教程(四)之基于scikit-lean决策树处理Iris 加载数据集 数据特征 训练 随机森林 调参工程师 结尾 数据挖掘入门系列教程(四)之基于scikit-lean决策树处理 ...

随机推荐

  1. H - 遥远的糖果 HihoCoder - 1478

    给定一个N x M的01矩阵,其中1表示人,0表示糖.对于每一个位置,求出每个位置离糖的最短距离是多少. 矩阵中每个位置与它上下左右相邻的格子距离为1. Input 第一行包含两个整数,N和M. 以下 ...

  2. canvas 悬浮效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. ThinkPHP6.0学习笔记-模型操作

    ThinkPHP模型 模型定义 在app目录下创建Model目录,即可创建模型文件 定义一个和数据库表相匹配的模型 use think\Model; class User extends Model ...

  4. 大曾Blogs使用说明书😊——Super ITZ

    大曾Blogs使用说明书 先敲黑板,四句话: pipe搜索,简洁,用于跳转,博客园及csdn和github 博客园炫酷界面,用于查看主要博文 csdn所有博客汇总,查看详细信息 github项目源码汇 ...

  5. SpringCloud(三)之我学 Hystrix

    1.断路器 在消费服务的启动类,添加注解:@EnableCircuitBreaker,在消费服务的调用类上,添加注解:@HystrixCommand(fallbackMethod = "&q ...

  6. java编写规范

    编码规范 转载于:https://www.cnblogs.com/ftl1012/p/javaCode.html 1 前言为确保系统源程序可读性,从而增强系统可维护性,java编程人员应具有基本类似的 ...

  7. 100 Path Sum

    Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all ...

  8. docker-compose中redis查询版本

    1.查询CONTAINER ID docker ps 2.进入容器,查询版本号信息 docker exec -it CONTAINER ID /bin/bash 3.查询到redis中的redis-s ...

  9. 08-jmeter-plugins-manager.jar插件安装

    1.安装第三方插件:jmeter-plugins-manager 2.将此jar包下载好后放到jmeter的安装目录lib/ext文件夹内, 3.然后运行jmeter,选择菜单“选项”可见插件入口 4 ...

  10. java消除 list重复值及交集,并集,差集

    消除 list重复值 Java代码  public void removeDuplicate(List list) { HashSet h = new HashSet(list); list.clea ...