深度学习(DL)与卷积神经网络(CNN)学习随笔-05-基于Python的LeNet之CNN
2016-06-15 00:00
811 查看
本文原链接可以查看更多文章
博文01介绍了CNN的基本结构。博文
02、
03、
04依次介绍了卷积操作、LR模型的建立及实现,MLP模型及实现。这些都是作为实现LeNet的铺垫。因为LeNet的实现就是由它们组成的。
今天我们就来讨论一下LeNet的模型建立及实现。
先来看一下LeNet的结构图。由图中可得到其结构分别为输入层、s1、c1、s2、c2和输出层。
其中,输入层到s1是卷积运算;输入层输入数据batch_size个样本,每个样本是一个 28∗28 的图片,s1层滤波器大小为 5∗5 ,滤波器为20个。
经过卷积运算,s1的特征图数目为20个,每个特征图的大小为 (28−5+1)∗(28−5+1)=24∗24 。为什么会是这个样子呢?这就涉及到卷积运算是怎么回事了。卷积运算一个最重要的特点就是可以使原信号特征增强,并且能降低噪音。具体运算过程,请移步这里。
当计算完第一组 5∗5 区域后(比如计算的是原数据第一行下标0-4,第一列0-4构成的方阵), 5∗5 的滤波器整体向右移动步长=1,那么下一次就是计算原数据第一行下标1-5,第一列0-4的方阵。以此类推,原数据第一行28个数据,那么就会向右移动 (28−5+1) 次。因此,最终的结果图大小就是 (28−5+1)∗(28−5+1) 。如何还不太清楚,可以自己手动画一下,画一个4*4的原数据, 2∗2 的滤波器,最终生成的图像大小为 (4−2+1)∗(4−2+1) 。
下面我们计算一下s1层需要训练的参数个数:s1生成有20个特征图,每个特征图的滤波器不同,同一个特征图的滤波器相同(这不废话吗)每个特征图含 24∗24 个元素,每个元素的生成是由本图的滤波器与原图像卷积计算得出。本图的滤波器含有 5∗5 个W元素+1个b元素(共 5∗5+1=26 个参数)。那么总的计算就是:共有 20∗(5∗5+1)=520 个参数; 20∗(24∗24)∗(5∗5+1)=299520 个连接。
s1层到c1层是下采样层。计算过程就是将s1的输出数据作为c1的输入数据。因此,输入数据为20个 24∗24 的特征图。经过采样大小为 2∗2 感受野的计算后,结果仍然是20个特征图,每个特征图变为了 12∗12 。
滤波器的移动是有重叠的。而下采样是无重叠的。采样计算过程如下:结果特征图中的每一个元素对应输入特征图中的 2∗2 元素,将 2∗2 区域元素累加,然后乘以一个可训练参数,再加上一个偏置值,最后通过sigmoid函数计算得到一个数值。然后结果图的下一个元素就是输入图中下一个 2∗2 区域,以此类推。最终原图是 24∗24 的,经过下采样之后,就变成 12∗12 了(就是行和列分别是原来的一半。因此整体就是原来的1/4)。
总体就是在特征图数目不变的前提下,将每个特征图进行了类似压缩的操作,这样元素个数大大降低,这就是所谓的下采样。同样我们计算一下c1层需要训练的参数个数:c1仍然生成20个特征图,每个特征图含 12∗12 个元素,每个元素的生成是由原图的 2∗2 区域元素累加,然后乘以1个可训练参数+1个偏置b参数。相当于本图的滤波器含有 1∗1 个W元素+1个b元素(共 1∗1+1=2 个参数)。那么总的计算就是:共有 20∗(1∗1+1)=40 个参数; 20∗(12∗12)∗(2∗2+1)=14400 个连接。。
c1到s2是卷积运算;输入是batch_size个样本,每个样本是20个 12∗12 的特征图,s2层是50个滤波器,每个滤波器 5∗5 大小。然后经过卷积运算,生成50个 8∗8 的特征图。【c1与s2的全连接,但尚不清楚是如何计算的,因此未能算出其参数和连接。从其他资料经验看,应该有 20∗50∗(5∗5+1)=26000 个参数; 20∗50∗(8∗8)∗(5∗5+1)=1664000 个连接。】
s2层到c3层是下采样层,输入是50个 8∗8 特征图,采用 2∗2 感受野,结果是50个 4∗4 特征图。
c3层到输出层经过一个MLP层。输入数据是将c3的4维输出转换为2维矩阵,即把后三维 50∗4∗4 转换为行数据,送入MLP的隐层,激活函数是tanh,输出是batch_size;然后再把结果送入MLP的LR层,经过softmax函数,将结果分为10类。
至此,整个模型介绍完毕。经过注释后的代码GitHub下载 CSDN免费下载,包含2个文件:mlp.py和LeNetConvPoolLayer.py。
肯定会有纰漏和错误,欢迎指出,共同进步。
参考目录:
1. 官方教程
2. Deep Learning(深度学习)学习笔记整理系列之(七)
转载来自:http://blog.csdn.net/niuwei22007/article/details/48950347
博文01介绍了CNN的基本结构。博文
02、
03、
04依次介绍了卷积操作、LR模型的建立及实现,MLP模型及实现。这些都是作为实现LeNet的铺垫。因为LeNet的实现就是由它们组成的。
今天我们就来讨论一下LeNet的模型建立及实现。
先来看一下LeNet的结构图。由图中可得到其结构分别为输入层、s1、c1、s2、c2和输出层。
其中,输入层到s1是卷积运算;输入层输入数据batch_size个样本,每个样本是一个 28∗28 的图片,s1层滤波器大小为 5∗5 ,滤波器为20个。
经过卷积运算,s1的特征图数目为20个,每个特征图的大小为 (28−5+1)∗(28−5+1)=24∗24 。为什么会是这个样子呢?这就涉及到卷积运算是怎么回事了。卷积运算一个最重要的特点就是可以使原信号特征增强,并且能降低噪音。具体运算过程,请移步这里。
当计算完第一组 5∗5 区域后(比如计算的是原数据第一行下标0-4,第一列0-4构成的方阵), 5∗5 的滤波器整体向右移动步长=1,那么下一次就是计算原数据第一行下标1-5,第一列0-4的方阵。以此类推,原数据第一行28个数据,那么就会向右移动 (28−5+1) 次。因此,最终的结果图大小就是 (28−5+1)∗(28−5+1) 。如何还不太清楚,可以自己手动画一下,画一个4*4的原数据, 2∗2 的滤波器,最终生成的图像大小为 (4−2+1)∗(4−2+1) 。
下面我们计算一下s1层需要训练的参数个数:s1生成有20个特征图,每个特征图的滤波器不同,同一个特征图的滤波器相同(这不废话吗)每个特征图含 24∗24 个元素,每个元素的生成是由本图的滤波器与原图像卷积计算得出。本图的滤波器含有 5∗5 个W元素+1个b元素(共 5∗5+1=26 个参数)。那么总的计算就是:共有 20∗(5∗5+1)=520 个参数; 20∗(24∗24)∗(5∗5+1)=299520 个连接。
s1层到c1层是下采样层。计算过程就是将s1的输出数据作为c1的输入数据。因此,输入数据为20个 24∗24 的特征图。经过采样大小为 2∗2 感受野的计算后,结果仍然是20个特征图,每个特征图变为了 12∗12 。
滤波器的移动是有重叠的。而下采样是无重叠的。采样计算过程如下:结果特征图中的每一个元素对应输入特征图中的 2∗2 元素,将 2∗2 区域元素累加,然后乘以一个可训练参数,再加上一个偏置值,最后通过sigmoid函数计算得到一个数值。然后结果图的下一个元素就是输入图中下一个 2∗2 区域,以此类推。最终原图是 24∗24 的,经过下采样之后,就变成 12∗12 了(就是行和列分别是原来的一半。因此整体就是原来的1/4)。
总体就是在特征图数目不变的前提下,将每个特征图进行了类似压缩的操作,这样元素个数大大降低,这就是所谓的下采样。同样我们计算一下c1层需要训练的参数个数:c1仍然生成20个特征图,每个特征图含 12∗12 个元素,每个元素的生成是由原图的 2∗2 区域元素累加,然后乘以1个可训练参数+1个偏置b参数。相当于本图的滤波器含有 1∗1 个W元素+1个b元素(共 1∗1+1=2 个参数)。那么总的计算就是:共有 20∗(1∗1+1)=40 个参数; 20∗(12∗12)∗(2∗2+1)=14400 个连接。。
c1到s2是卷积运算;输入是batch_size个样本,每个样本是20个 12∗12 的特征图,s2层是50个滤波器,每个滤波器 5∗5 大小。然后经过卷积运算,生成50个 8∗8 的特征图。【c1与s2的全连接,但尚不清楚是如何计算的,因此未能算出其参数和连接。从其他资料经验看,应该有 20∗50∗(5∗5+1)=26000 个参数; 20∗50∗(8∗8)∗(5∗5+1)=1664000 个连接。】
s2层到c3层是下采样层,输入是50个 8∗8 特征图,采用 2∗2 感受野,结果是50个 4∗4 特征图。
c3层到输出层经过一个MLP层。输入数据是将c3的4维输出转换为2维矩阵,即把后三维 50∗4∗4 转换为行数据,送入MLP的隐层,激活函数是tanh,输出是batch_size;然后再把结果送入MLP的LR层,经过softmax函数,将结果分为10类。
至此,整个模型介绍完毕。经过注释后的代码GitHub下载 CSDN免费下载,包含2个文件:mlp.py和LeNetConvPoolLayer.py。
肯定会有纰漏和错误,欢迎指出,共同进步。
参考目录:
1. 官方教程
2. Deep Learning(深度学习)学习笔记整理系列之(七)
转载来自:http://blog.csdn.net/niuwei22007/article/details/48950347
相关文章推荐
- python机器学习之神经网络(三)
- 人人都能用Python写出LSTM-RNN的代码![你的神经网络学习最佳起步]
- 卷积神经网络(Convolutional Neural Network)学习资料
- 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-04-基于Python的LeNet之MLP
- deep learning 卷积神经网络的实现(Convolution Neural Networks)
- VMWare 中Ubuntu 中的NAT 网络设置
- Java神经网络的框架Neuroph 2.5 with Neuroph Studio 测试
- 神经网络Tips 和Tricks
- 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-02-基于Python的卷积运算
- python机器学习之神经网络(一)
- [Deep Learning]学习记录1-Python实现神经网络BP算法
- 卷积神经网络在自然语言处理的应用
- 手把手入门神经网络系列(2)_74行代码实现手写数字识别
- Apache httpd与tomcat集群
- 从头开始实现神经网络:入门
- 【深度学习】卷积神经网络(Convolutional Neural Network)
- 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-01-CNN基础知识点
- 人工神经网络的深入理解
- 机器学习算法汇总:人工神经网络、深度学习及其它
- 十一行Python代码实现一个神经网络(第一部分)