【深度学习|Keras卷积神经网络识别CIFAR-10图像(1)】之前的文章通过识别手写数字来学习什么是多层感知器,本文将会通过识别CIFAR-10图像这个项目来认识什么是卷积神经网络。
这篇文章将会分成两个部分,第一部分会简单介绍一下卷积神经网络的结构,第二部分将通过构建卷积神经网络来识别CIFAR-10图像,让大家了解卷积神经网络是如何搭建和工作的。
1 卷积神经网络简介
1.1卷积神经网络结构 先上一张看起来很牛X的图(图片来源:百度百科)
文章图片
(1) 卷积层
维基百科是这样解释的:
卷积层(Convolutional layer),卷积神经网上中每层卷积层由若干卷积单元组成,每个卷积单元的参数都是通过反向传播算法最优化得到的。卷积运算的目的是提取输入的不同特征,第一层卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网路能从低级特征中迭代提取更复杂的特征。
其实我也不是很懂维基百科的解释,但我简单点理解就是在一个卷积层中,把输入样本(输入样本是一个矩阵)和m(m>0)个卷积核(卷积核是一个n*n维的矩阵,n的大小不定)作内积运算,然后把内积的结果(m个矩阵)通过激活函数的计算,最后得出m个特征图(每个特征图还是一个矩阵),下 一个及以后的卷积层都会把前一个卷积层得出的特征图作为输入。换句话说,本卷积层卷积核的个数决定了下一卷积层所需要的卷积核数
这里补充一个求经过内积运算后得到的矩阵的维数的公式:
文章图片
各个参数说明如下
参数名 | 说明 |
---|---|
hout | 内积结果(矩阵)的阶数 |
hin | 卷积层输入样本(矩阵)的阶数 |
Filter | 卷积核的阶数 |
Pad | 补充在输入样本外面的“0”的圈数 |
Stride | 卷积运算中卷积核滑动的步长 |
池化层的作用就是减小卷积层产生的特征图的尺寸。选取一个区域,根据该区域的特征图得到一个新的特征图,这个过程就叫做池化操作。例如对一个原来是6x4的图像,设置一个filter为2x2,经过池化操作后就得到一个3x2的新的特征图。池化的目的是降低特征图的维度,使得特征表示对输入数据的位置变化具有稳定性。常见的池化方法有最大池化,平均池化等。
(3)激励函数
激励函数,也叫激活函数,本人更喜欢把它称作激活函数,有点类似于人类的神经元,引入激活函数是为了增加神经网络模型的非线性,因为有些复杂的事情不是是线性模型可以完成的,例如图像识别,一条直线不可能把图像分成很多类型吧(最多也就两类),所以使用激活函数把模型变成非线性的,使得这个模型可以做更复杂的事情(例如可以把很多很多的图像分成若干个类型)。将之前经过卷积层和池化层操作得到的特征图输入到激活函数中(即作为激活函数的参数),经过激活函数的转化后得到一个非线性的模型。其实,没有激活函数的每层都相当于矩阵相乘。就算你叠加了若干个层卷积层和池化层之后,最后结果无非还是个线性模型罢了。
(4)全连接层
与多层感知器一样,全连接层也采用了三层结构,分别是平坦层,隐藏层和输出层。我个人对于平坦层的理解就是把经过卷积层和池化层处理的图像转化为一维的向量,作为隐藏层的输入。隐藏层就类似于中间层,隐藏层的各个单元与上一层各单元通过权重连接,通过函数计算隐藏层各单元的输出值,把输出值输入到下一层。值得注意的是,隐藏层可以有多层,每层可以有多个神经元。至于输出层,简单地理解就是输出层有多少个神经元就代表有多少个输出结果,例如识别手写数字,输出层一共有10个神经元,就代表0~9一共10个数字。
卷积神经网络的介绍就到这里,其实以上这些介绍都只是我个人的浅显理解,如果有哪部分说得不好,请多多包涵,或者直接在下面指出,毕竟也是初步接触深度学习,理解得可能还不是那么透彻,以后深入学习后应该还会作更新补充的。
推荐阅读
- TensorFlow2|深度学习之卷积神经网络(8)BatchNorm层
- 深度学习|基于Pytorch的强化学习(DQN)之蒙特卡罗算法
- DL|深入理解PyTorch中LSTM的输入和输出(从input输入到Linear输出)
- 深度学习与神经网络|计算机视觉之卷积神经网络
- 环境搭建|tensorflow安装测试教程【一文读懂】
- 神经网络|(翻译)60分钟入门深度学习工具-PyTorch
- java|亚马逊跨境电商平台怎么入驻()
- 手把手搭建一个pytorch mobile 的Android APP
- 模型部署|通过MACE在Android手机上部署深度学习模型