LeNet-5是由Yann LeCun设计的用于手写数字识别和机器打印字符的卷积神经网络。她在1998年发表的论文《基于梯度学习的文本识别》中提出了该模型,并给出了对该模型网络架构的介绍。如下图所示,LeNet-5共有7层(不包括输入层),包含卷积层、下采样层、全连接层,而其输入图像为32*32.论文链接:Gradient-based learning applied to document recognition | IEEE Journals & Magazine | IEEE Xplore

 图1. LeNet-5网络架构

1.C1:卷积层

c1层采用卷积层对输入的图像进行特征提取,利用6个5*5的卷积核生成6个特征图(feature map)。其步长为1且不使用扩充值。因此卷积后的特征层为28*28.一个卷积核拥有的可训练参数为5*5+1=26,其中1为偏置参数。整个C1层可训练参数为(5*5+1)*6=156.

2.S2:下采样层

下采样(subsampling)层主要对特征进行降维处理,效果与池化相同。S2层使用2*2的滤波器池化C1的特征图,因此将生成6个尺寸为14*14的特征图。在计算时,将滤波器中的4个值相加,然后乘以可训练权值参数w,加上偏置参数b,最后通过sigmoid函数形成新的值。S2层的每个特征图中都有两个参数,一个是权值参数,一个是偏置参数,因此该层共有2*6=12个参数。

3.C3:卷积层

C3层有16个大小为5*5的卷积核,步长为1且不填充边界。C3层将S2层6个14*14的特征图卷积成16个10*10的特征图。值得注意的是,S2层与C3层的卷积核并不是全连接的,而是部分连接的。

图2:S2层特征图与C3层卷积核连接的组合

4.S4:下采样层

S4的滤波器与S2层的滤波器相似,也是2*2的,所以,S4层的特征图池化后,将生成16个5*5的特征图。S4层参数的个数为2*16=32.

5.C5:卷积层

C5层有120个5*5的卷积核,将产生120个1*1的特征图,与S4层是全连接的。C5层参数的个数不能参照C1层来计算,而是要参照C3层来计算,且此时是没有组合的,因此,应该是(5*5*16+1)*120=48120.

6.F6:全连接层

F6有84个单元,单元的个数与输出层的设计有关。该层作为典型的神经网络层,每一个单元都计算输入向量与权值参数的点积并加上偏置参数,然后传给sigmoid函数,产生该单元的一个状态并传递给输出层。在这里,将输出作为输出层的径向基函数的初始参数,用于识别完整的ASCII字符集。C5有120个单元;F6层有84个单元,每个单元都将容纳120个单元的计算结果。因此,F6层参数的个数为(120+1)*84=10164.

7.output:输出层

output层是全连接层,共有10个单元,代表数字0~9。利用径向基函数,将F6层84个单元的输出作为节点的输入xj,计算欧氏距离。距离越近,结果就越小,意味着识别的样本越符合该节点所代表的字符。由于该层是全连接层,参数个数为84*10=840。

网络搭建:

import torch.nn as nn
import torch.nn.functional as F class Net(nn.Module): def __init__(self):
super(Net, self).__init__()
#input image channel is one, output channels is six,5*5 square convolution
self.conv1=nn.Conv2d(1, 6, 5)
self.conv2=nn.Conv2d(6, 16, 5)
self.fc1=nn.Linear(16*5*5, 120)
self.fc2=nn.Linear(120, 84)
self.fc3=nn.Linear(84, 10) def forward(self, x):
#max pooling over a (2,2) window
#c1
x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
#if the kernel size is a square you can only specify a single number
x = F.max_pool2d(F.relu(self.conv2(x)), 2)
x = x.view(-1, self.num_flat_features(x))
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x def num_flat_features(self, x):
#all dimensions except the batch dimension
size = x.size()[1:]
num_features = 1
for s in size:
num_features *= s
return num_features net = Net()
print(net)

最新文章

  1. jsp的九大内置对象
  2. Verilog HDL基础语法讲解之模块代码基本结构
  3. 简单RTOS学习(一) uc/os-II 工程模板建立
  4. Local IIS 7.0 - CS0016: Could not write to output file / Microsoft.Net > Framework > v4.0.30319 > Temporary ASP.NET Files
  5. php随笔6-thinkphp OA系统 JS 实时显示当前时间
  6. 学习Java绝对要懂的,Java编程中最常用的几种排序算法!
  7. python编程基础知识—列表(一)
  8. none,hidden和opacity="0"设置元素不可见的区别
  9. 安装coreseek cannot find input file: src/Makefile.in 错误解决方法
  10. MySQL 内连接与外连接
  11. SVN远程管理
  12. c# 泛型和IComparable<T>接口
  13. meta标签常用设置
  14. Xcode OpenGL ES Frame Capture的使用
  15. 连接Oracle时ORA-12541 TNS 无监听程序
  16. 《Java程序猿面试笔试宝典》之Java变量命名有哪些规则
  17. js学习笔记34----自执行函数
  18. C++与C的区别二
  19. python接口自动化读取json,yaml配置文件+封装requests+unittest+HTMLRunner实现全自动化
  20. [转]解读Unity中的CG编写Shader系列8——多光源漫反射

热门文章

  1. Day008 三种初始化及内存分析
  2. CCNA 第二章 以太网回顾
  3. XAML一些控件的使用
  4. es6.4.0安装和配置IK+拼音插件 实现非全拼搜索
  5. Beta_测试说明
  6. jenkins邮件报警机制配置
  7. 【大白话 mysql】mysql 事务与日志原理
  8. [bug] HDFS:hdfs missing blocks. The following files may be corrupted
  9. 下载最新版本Fiddler
  10. [刷题] 454 4Sum II