CNN——池化、结构、误差反向传播

el/2024/3/2 11:12:07

CNN反向传播算法总结

上一篇介绍了CNN基本概念和卷积的知识,CNN的特征抽取除了包含卷积,还包含池化。

池化

池化又叫子采样,是特殊的卷积。池化比较好理解,还是上篇公司工作交接的例子,每个销售区域有100个老员工,我们可以先推举一个最懂本区域的业务人员参与交接(如各区域的领导),其他人员不必参与交接;或者每个区域内部先开一个会,把100个老员工的经验结合在一起,生成一个会议纪要,根据这份纪要与新员工交接。这实际对应两种池化方式,前一种是最大化池化,后一种是平均池化。

放到图像识别的例子里,池化是为了降维。例如一个250*250像素的图像,从上到下、从左到右用2*2大小的矩阵扫描,也就是说250*250的图像中每个连在一起2*2的小图像,都用这四个点中像素值最大的点代替,其他像素点舍弃;或者用这四个像素值的均值代替,也就完成了池化。注意平均池化实际相当于卷积核元素都是1的矩阵。


以上图为例,池化以后图像会变模糊,高、宽变为原来的一半。

结构

之所以没在本篇开头说结构,是因为希望大家一开始有个感性的认识,知道卷积是为了做什么,池化是为了做什么,否则一开始看结构会不知所云,不便于理解。

在了解卷积、池化以后,CNN的结构就比较简单了,首先它依然有输入层和输出层,输入层是一个矩阵,接收图像的二维矩阵信息(此处图像只考虑一个通道),经过卷积、池化、卷积、池化……得到的依然是矩阵。但是输出层与BPNN一样,并非一个矩阵,而是一个向量,例如(1, 0, 0)代表图像是狗,(0, 1, 0)代表图像是猫, (0, 0, 1)代表图像是鸟,(0.9, 0.1, 0)代表图像很大概率是狗,小概率是猫,所以CNN在最后的结构需要把矩阵展开,然后类似BPNN那样全连接神经网络,输出到一个一维向量中。

误差反向传播

首先了解前向传播。前向传播的过程是,图像的原始像素值输入到CNN中,经过卷积操作,得到特征平面,特征平面经过激活函数激活,输出到池化层,池化层经过简单的最大值池化或均值池化,再输出给下一层卷积,经过N次这样反复处理,即可完成从识别简单的轮廓、线到识别抽象物体的飞跃。以上过程存续的结果都是二维的矩阵。最后连接到一个全连接层,输出成一个一维向量。最后经过激活函数即可得到图像属于每个类的概率。

卷积层的激活函数可以选择ReLU函数(线性整流函数),池化层没有激活函数,池化的结果直接传递给下一层,输出层的激活函数可以选择Softmax,Softmax是专门处理多分类的激活函数,可以输出样本分别属于各个类的概率。

ReLU函数见下图


ReLU函数有一定生物学道理,即信号到达一定阈值以后才激活

Softmax函数见下式


其中Z是一个k维向量,各个分量用e做指数,占指数之和的比例,即为Z属于该类的概率。

需要训练的参数是卷积核矩阵中的值以及偏置。训练好的卷积核矩阵理论上可以表示物体的相关特征(如针对汽车的轮胎形状)。

误差反向传播与BPNN不太一样,因为涉及到卷积、池化的操作,稍微有些复杂。从后往前分析,全连接层的反向传播不太复杂,只需要把softmax或其他激活函数形式写出来求导即可。比较关键的是卷积层、池化层的反向传播。

(1)池化层向上传播

假设CNN的结构是卷积层A(L-1层)激活-本池化层(L层)-卷积层B,即本池化层上一层是卷积层A,下一层是卷积层B。还记得BPNN里的δ吗,很多神经网络都用了这个结果。δ表示误差传播到节点的结果,这里想给大家灌输一个思想,δ具体来看是损失函数对这个节点激活前的导数。

已经知道误差传播到本池化层的结果是(即误差对本池化层激活前的导数),现在求误差传播到卷积层A的结果

正向传播的时候,从卷积层A到池化层分别作了激活、池化操作,所以误差反向传播的时候要先求池化的导数,再求激活函数的导数。

池化使得结果降维(如文章开头250*250降维成125*125),所以为了将误差还原回去,需要从降维后的小矩阵125*125还原回降维前的大矩阵250*250。

如果是最大值池化,那么将误差指定给小范围矩阵像素最大值的点;如果是平均值池化,那么将误差平均分给小范围矩阵的各个点即可。我们把这个过程叫做upsample,顾名思义,这里的操作是将维度扩大,将误差以一定规则分给小范围的各个点。还是公司工作交接的例子,假如某个销售区域交接工作出了差错,如果是最大化池化,由于是领导在进行工作交接,那么让领导背锅;如果是平均池化,由于大家都参与了开会并形成会议纪要,那么所有区域员工都背负相同的责任。


因此


其中a表示激活后的值(activation), z表示激活前的值。

上式最右侧两项分别表示对池化求导和对ReLU等激活函数求导。

(2)卷积层向上传播

假设CNN的结构是池化层A(l-1层)-本卷积层(l层)-池化层B,即本卷积层向上把误差传播到池化层A。已经知道误差传播到本卷积层的结果是(即误差对本卷积层激活前的导数),现在求误差传播到池化层A的结果

正向传播的时候,由于池化层没有激活(池化后的样子就是传到下一层的样子),所以从池化层A到卷积层只有卷积的操作,所以误差反向传播就是求卷积的导数。

卷积的导数稍微有些特别,因为卷积操作本身比较特别。


这里的*表示卷积,rot180表示将矩阵旋转180度,即上下各翻转一次。

下面用一个例子说明,为了简化假设这里偏置都为0。

卷积操作如下图所示


现在z传过来的误差是

例如,对于a11来说,它只参与了z11的运算,J代表损失函数。


对于a12来说,它参与了z11和z12的运算


同理,可以得到

以上可以表示成


其中*表示卷积

δ推导到各个卷积核具体权重和每层偏置就十分简单了,与BPNN道理一样,这里不再详述。



总结

为了处理图像问题,BPNN的算法不易求解,而且不符合仿生学的特点。CNN是专门为了处理图像等矩阵形成的神经网络,后一层神经元只与前一层部分区域神经元相连,大大减小参数;相连的权重是公用的,更进一步减小参数;池化层对图像降维,继续减小了参数。是在满足仿生的基础上不断减小参数,使得CNN可以训练。

延续BPNN的思想,CNN误差向后传导重点是求δ,δ是误差传播到节点的值,具体地说,是损失函数对节点输入值(未激活前的值)的导数。求出δ再求误差对权重、偏置的导数就十分容易了。由于卷积与池化交替进行,所以“卷积向上传导到池化”和“池化向上传导到卷积”情况不同。池化的操作求导比较容易理解,卷积的操作求导稍微有些复杂,需要对矩阵旋转操作。我们用一个例子证明了算式的正确性。


小结


1.卷积核的尺寸必须为正方形吗?可以为长方形吗?如果是长方形应该怎么计算?
1.卷积核的尺寸不一定非得为正方形。长方形也可以,只不过通常情况下为正方形。如果要设置为长方形,那么首先得保证这层的输出形状是整数,不能是小数。如果你的图像是边长为 28 的正方形。那么卷积层的输出就满足 [ (28 - kernel_size)/ stride ] + 1 ,这个数值得是整数才行,否则没有物理意义。譬如,你算得一个边长为 3.6 的 feature map 是没有物理意义的。 pooling 层同理。FC 层的输出形状总是满足整数,其唯一的要求就是整个训练过程中 FC 层的输入得是定长的。如果你的图像不是正方形。那么在制作数据时,可以缩放到统一大小(非正方形),再使用非正方形的 kernel_size 来使得卷积层的输出依然是整数。总之,撇开网络结果设定的好坏不谈,其本质上就是在做算术应用题:如何使得各层的输出是整数。


2.卷积核的个数如何确定?每一层的卷积核的个数都是相同的吗?

2.由经验确定。通常情况下,靠近输入的卷积层,譬如第一层卷积层,会找出一些共性的特征,如手写数字识别中第一层我们设定卷积核个数为5个,一般是找出诸如"横线"、“竖线”、“斜线”等共性特征,我们称之为basic feature,经过max pooling后,在第二层卷积层,设定卷积核个数为20个,可以找出一些相对复杂的特征,如“横折”、“左半圆”、“右半圆”等特征,越往后,卷积核设定的数目越多,越能体现label的特征就越细致,就越容易分类出来,打个比方,如果你想分类出“0”的数字,你看到这个特征,能推测是什么数字呢?只有越往后,检测识别的特征越多,试过能识别这几个特征,那么我就能够确定这个数字是“0”。


3.步长的向右和向下移动的幅度必须是一样的吗?

3.有stride_w和stride_h,后者表示的就是上下步长。如果用stride,则表示stride_h=stride_w=stride。



http://www.ngui.cc/el/4466220.html

相关文章

电影推荐系统详细代码注释

注:此博文是转载于它处,注释部分也为转载 # -*- coding: utf8 -*-Created on 2015-06-22 author: Lockvictorimport sys, random, math import os from operator import itemgetter random.seed(0) class ItemBasedCF(): TopN recommendation - ItemBas…

基于物品的协同过滤

ItemCF:ItemCollaborationFilter,基于物品的协同过滤 算法核心思想:给用户推荐那些和他们之前喜欢的物品相似的物品。 比如,用户A之前买过《数据挖掘导论》,该算法会根据此行为给你推荐《机器学习》,但是It…

knn算法思想及代码实现

实验中用到的数据在我的上传中心有 1.什么是KNN K近邻算法(K-Nearest Neighbour,K-NN)是一种基本分类与回归方法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本…

机器学习—— 评价指标

一、分类指标 1、准确率和召回率 准确率(Precision)是你给出的正确结果数占你给出的所有结果数的比例。 召回率(Recall)是你给出的正确结果数占所有正确结果数的比例。 比如:池塘里共有200生物,其中鱼140&…

机器学习测试二总结

1、卷积神经网络计算公示: 卷积层与池化层输出矩阵大小 C[(T-F2*P)/S]1 C为输出矩阵尺寸,T为待处理矩阵的尺寸,F为滤波器矩阵尺寸,P为填充矩阵(pooling),S为步长 2、MLP是完全连通的有向图&…

0-1背包与完全背包的区别

0-1背包 重要部分:每次每个物品最多只能选择一次。 题面:有n个重量和价值分别为 Wi 与 Vi 的物品,现在从这些物品中挑选出总重量不超过 s 的物品,并且要求总价值最大。 输入: n4 S5 (w,v) {(2,3&#xf…

最小生成树之最大生成树

poj 3723 Conscription 【最大生成树|最大权森林】 题目:poj 3723 Conscription 题意:要征兵n个男兵和m个女兵,每个花费10000元,但是如果已经征募的男士兵中有和将要征募的女士兵关系好的,那么可以减少花费&#xff0c…

Crazy Rows(2009 Round2 A)

Problem You are given an N x N matrix with 0 and 1 values. You can swap any two adjacent rows of the matrix. Your goal is to have all the 1 values in the matrix below or on the main diagonal. That is, for each X where 1 ≤ X ≤ N, there must be no 1 valu…

selenium启动chrome时,弹出设置页面:Windows Defender 防病毒要重置您的设置。和data页面

selenium启动chrome时,弹出设置页面:Windows Defender 防病毒要重置您的设置。和data页面 1.在使用selenium打开chrome时同时打开了两个标签页,且页面停留在chrome的设置页面,页面打开链接后data页面也没有消失 winr 运行 regedit &#xff…

Java从头来(一)

java命名规范 1、命名规则 包:英文全小写 类:英文,每个单词的首字母为大写,其它为小写,例如:JavaTest 变量:英文有意义,首字母第一个单词小写,其它单词首字母大写。例如…