卷积神经网络代码理解
1、代码来源:
代码来自DeepLearnToolbox-master,是matlab一个深度学习的工具包,里面含有很多机器学习算法,如卷积神经网络CNN,深度信念网络DBN,自动编码AutoEncoder等。
2、CNN函数介绍
3、函数调用关系
图3-1 函数调用关系图
4、样例数据集
该模型使用了mnist的数字mnist_uint8.mat作为样本,每个样本特征为一个28*28的向量。其中训练集样本60000,测试集样本10000,并将首先将样本像元值转化为一维向量作为网络的输入:
样本示例如下图所示:
图4-1 样本示例图
图4-2 样本预处理5、样例网络结构
图5-1 网络结构图
6、算法流程
图6-1 算法流程7 、误差反向传播过程
7.1计算误差和Loss Function
7.2 计算单层感知机的灵敏度
7.3把单层感知机的输入层的误差矩阵,恢复为4*4二维矩阵形式
7.4误差在特征提取网络【卷积降采样层】的传播
7.4.1 卷积层敏感度向前传播
假设拿出第l层某个特征图图,大小为3×3,第l+1层核大小为2×2卷积核为:
灵敏度为:
采用’full’模式需先将第l+1层2个卷积图扩充,周围填0,
I层灵敏度
7.4.2采样层灵敏度向前传播
假设卷积层的矩形大小为4×4,pooling区域大小为2×2,则pooling后得到的矩形大小也为2*2,如果此时pooling后的矩形误差敏感值如下:
则按照mean-pooling,首先得到的卷积层应该是4×4大小,其值分布为(等值复制):
因为得满足反向传播时各层间误差敏感总和不变,所以卷积层对应每个值需要平摊(除以pooling区域大小,这里pooling层大小为2×2=4)),最后的卷积层值分布为:
7.5计算卷积层和单层感知机的梯度
7.6权重及偏置修改,更新模型
8、示例(训练一个样本)
8.1初始化网络
8.1.1初始化网络结构,代码如下:
其结构如下图所示,从左到右依次命名为:输入层、卷积层1、降采样层1、卷积层2、降采样层2、全连接层、输出层(命名方便后面阐述)
8.1.2随机初始化卷积核权重,
代码为:
疑问:rand(n)是产生n×n的0-1之间均匀取值的数值的矩阵,再减去0.5就相当于产生-0.5到0.5之间的随机数,再*2 就放大到[-1, 1]。然后不明白再乘以后面那一数?
8.1.2.1卷积层1有1*6=6个卷积核
卷积层1第一个卷积核权重为:
卷积层1第二个卷积核权重为:
卷积层1第三个卷积核权重为:
卷积层1第四个卷积核权重为:
卷积层1第五个卷积核权重为:
卷积层1第六个卷积核权重为:
其存储在格式为(方便理解卷积运算):
8.1.2.2卷积层2有6*12=72个卷积核,其权重不在这里一一列出,其存储格式为
8.1.3初始化卷积层偏置,均设为0
8.1.4 随机初始化全连接层权重
构造一个10*192的矩阵
全连接层有10*192个权重,下图截取部分值:
8.2 信号向前传播
8.2.1 输入训练样本为(28*28)(截取部分值),及期望输出为(10*1)
8.2.2 第一次卷积过程
第一次卷积,获取6张24*24的特征图
获取第一个特征图(24*24)(截取部分值):第一个卷积核与输入的特征图
进行卷积得到第一个特征图
获取第二个特征图(24*24):
以此类推,直至第六张特征图,即得到卷积层1:
8.2.3 第一次降采样过程(采用均值采样法,模板为2*2,模板上值为0.25,得到6个12*12的特征图)
第一张降采样后特征图(其他不再列举)
采样过程分为两步:
(1)采样模板与上层特征图进行卷积,得到6张23*23的特征图,该过程与8.2.2类似
(2)将上一步得到的每张23*23的图隔行隔列取值,即得到降采样最终的图为12*12,举例说明隔行隔列取值方式:
8.2.4 第二次卷积
第二次卷积时,输入6张特征图,与72个卷积核进行卷积,得到12张8*8特征图,每张特征图要与6个卷积核进行卷积,卷积过程如下:(1)上层输出的6张特征图与第一列的6个卷积核分别进行卷积运算,得到6张图,然后这6张图对应位置值相加(矩阵相加),即得到第一张8*8特征图;
(2)上层输出的6张特征图与第二列的6个卷积核分别进行卷积运算,同样得到6张图,然后这6张图对应位置相加,即得到第二张8*8特征图;
以此类推,最终得到12张8*8的特征图
8.2.5 第二次降采样
第二次降采样过程与第一次完全相同,在此不再赘述,本次降采样,得到12张4*4的特征图
8.2.6 构建全连接层
即将12个4*4的矩阵,构建成1*192的一维向量(每次在fv后面追加一个长度为4*4=16的向量):
全连接层特征图值(截取部分值)
8.2.7 输出结果
输出结果为10*1的矩阵
8.3误差反向传播
8.3.1 计算输出误差
误差=输出-期望
=—