LeNet
简介
LeNet-5(http://yann.lecun.com/exdb/lenet/a35.tml), 一个手写体数字识别模型,是一个广为人知的商用的卷积神经网络。当年美国大多数银行用它来识别支票上面的手写数字。
基本信息
论文:基于梯度的学习在文档识别中的应用
paper :LeCun, Yann; Léon Bottou; Yoshua Bengio; Patrick Haffner (1998). "Gradient-based learning applied to document recognition"
http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf
作者:Yann LeCun,LéonBottou,Yoshua Bengio和Patrick Haffner
发表于:IEEE会议论文集(1998)
补充:全文非常长,小伙伴给出了部分翻译,供大家学习。其中LeNet5详细描述在第二章B节。
创新点
它是深度学习最简单的体系结构之一。 它具有2个卷积层和3个完全连接层。因此LeNet被称为LeNet-5。平均池化层现在称为降采样层,并且当时它具有可训练的权重(现在很少使用这种设计,往往使用Max-pooling)。 该体系结构具有约60,000个参数。
它的网络结构成为后来深度学习网络的标准的“模板”:堆叠若干激活功能的卷积层和pooling层,最后加上一个或多个完全连接的FC层。
网络结构
Lenet5 原始结构如,包括卷积层,降采样,卷积层,降采样,卷积层(实现全连接),全连接层,高斯连接层(进行分类)
LeNet-5网络参数配置
网络层 | 输入尺寸 | 核尺寸 | 输出尺寸 | 可训练参数量 |
---|---|---|---|---|
卷积层$C_1$ | $32\times32\times1$ | $5\times5\times1/1,6$ | $28\times28\times6$ | $(5\times5\times1+1)\times6$ |
下采样层$S$ | $28\times28\times6$ | $2\times2/2$ | $14\times14\times6$ | $(1+1)\times6$ |
卷积层$C_2$ | $14\times14\times6$ | $5\times5\times6/1,16$ | $10\times10\times16$ | $(5\times5\times6+1)\times16$ |
下采样层$S$ | $10\times10\times16$ | $2\times2/2$ | $5\times5\times16$ | $(1+1)\times16$ |
全连接层$F_3$ | $5\times5\times16$ | $5\times5\times16/1,120$ | $1\times1\times120$ | $(5\times5\times16+1)\times120$ |
全连接层$F_4$ | $1\times1\times120$ | $120\times84$ | $1\times1\times84$ | $(120+1)\times84$ |
全连接层$F_5$/输出层 | $1\times1\times84$ | $84\times10$ | $1\times1\times10$ | $(84+1)\times10$ |
可显示如图
$L(p, t, x) = L_{cls}(p, p^) + {\lambda}L_{reg}(t, t^) + {\mu}L_c(x)$
其中降采样层在后期发展中被maxpooling所取代,分类也被softmax所替代,第一个全连接层,可以用卷积层来替代。因此很多实现中会改成3个卷积层,2全连接层来进行实现,如下:
一层卷积层: 5×5的卷积核,6个
一层maxpooling
一层卷积层:5×5的卷积核,16个
一层maxpooling
一层卷积层:5×5的卷积核,120个
一层全连接层:84个隐含节点,激活函数为ReLU(paper中激活函数为sigmoid)
最后通过softmax分类输出(paper之前为一个高斯连接层,由Euclidean Radial Basis Function单元组成)
数据变化为
源码
比较热门的源码 有这些,现在一般pooling直接用maxpooling:
tensorflow 源码 https://github.com/tensorflow/models/tree/master/research/slim/nets/lenet.py
tensorflow的输入 改成了28×28,因此少了一层卷积层,最后使用softmax输出
pytorch 源码 https://github.com/pytorch/examples/blob/master/mnist/main.py
caffe https://github.com/BVLC/caffe/blob/master/examples/mnist/lenet.prototxt
练习:在32*32 的 cifar10 上进行十分类,用pytorch构建网络结构
手写示例:
class LeNet(nn.Module):
def __init__(self):
super(LeNet, self).__init__()
self.conv1 = nn.Conv2d(3, 6, kernel_size=5)
self.conv2 = nn.Conv2d(6, 16, kernel_size=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):
x = func.relu(self.conv1(x))
x = func.max_pool2d(x, 2)
x = func.relu(self.conv2(x))
x = func.max_pool2d(x, 2)
x = x.view(x.size(0), -1)
x = func.relu(self.fc1(x))
x = func.relu(self.fc2(x))
x = self.fc3(x)
return x
结果:
BEST ACC. PERFORMANCE: 66.050%
知识点
反向传播算法 / 卷积 / 激活函数 / 神经元结构
需要知道基本概念:
- A Pits 提出的神经元数学模型 ,也被称为感知机(PLA: Perceptron Learning Algorithm)
图来自 :
感知机——神经网络最基本的模型 - DeepTalk的文章 - 知乎
https://zhuanlan.zhihu.com/p/49191769
- B 多层神经元组合,就叫多层感知机,MLP,我们也叫多层神经网络,DNN等
- 反向传播算法:Backpropagation BP算法
可以参看:
如何直观地解释 backpropagation 算法? - Anonymous的回答 - 知乎
https://www.zhihu.com/question/27239198/answer/89853077
其中有一段很好玩:
举个不太恰当的例子,如果把上图中的箭头表示欠钱的关系,即c→e表示e欠c的钱。以a, b为例,直接计算e对它们俩的偏导相当于a, b各自去讨薪。a向c讨薪,c说e欠我钱,你向他要。于是a又跨过c去找e。b先向c讨薪,同样又转向e,b又向d讨薪,再次转向e。可以看到,追款之路,充满艰辛,而且还有重复,即a, b 都从c转向e。
而BP算法就是主动还款。e把所欠之钱还给c,d。c,d收到钱,乐呵地把钱转发给了a,b,皆大欢喜。
- 卷积
卷积操作在图像中非常常用,一般大家都使用那套动图来展示计算。
出处忘了,给一个知乎上的总结吧。
绝妙可视化:什么是深度学习的卷积? - 论智的文章 - 知乎
https://zhuanlan.zhihu.com/p/42090228
激活函数:
深度学习中【激活函数】存在的意义是什么? - ShuYini的文章 - 知乎
https://zhuanlan.zhihu.com/p/80730031
今天刷题:
题目1:
**关于激活函数,选出下列说法中不对的答案
A 激活函数可以引入非线性因素,完成复杂的函数映射。
B 激活函数都是线性的,深度网络也可以完成学习和模拟其他复杂类型的数据,例如图像、音频等。
C 激活函数可以把当前特征空间映射到另一个空间,让数据能够更好的被分类。
D 激活函数不能都是线性的
后期会开放小程序刷题打卡,欢迎来玩