浅谈LeNet-5
Posted jiangxiaoju
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈LeNet-5相关的知识,希望对你有一定的参考价值。
浅谈LeNet-5
基于Tensorflow的实现欢迎查看我下一篇博客Tensorflow实战 LeNet-5神经网络进行手写体数字识别
一、LetNet是什么?
LetNet是一种入门级的神经网络模型,是一个简单的卷积神经网络,可以用来做手写体识别。
下面我将以上图为例简单介绍一下LetNet神经网络的工作流程。
-
输入层
读入需要被网络处理的图片,这里图片的大小为32*32的黑白图片
-
Conv1层
图片大小:32x32,通道数为1
filter(卷积核):5x5x6(大小5x5,个数6)
步长:1
输出:28x28x6
采用的卷积方式:vaild
-
S2层
图片大小:28x28
池化窗口:2x2
个数:6
输出:14x14x6
-
Conv3层
图片大小:14x14,通道数为6
filter(卷积核):5x5x16(大小5x5,个数16)
步长:1
输出:10x10x16
采用的卷积方式:vaild
-
S4层
图片大小:10x10
池化窗口:2x2
个数:16
输出:5x5x6
-
Conv5层
图片大小: 5x5,通道数为16
filter(卷积核):5x5x120(大小5x5,个数120)
步长:1
输出:1x1x120
采用的卷积方式:vaild
-
F6层
输入向量维度:[1,120]
权重参数的维度:[120,84]
计算方式:输入的向量与权重参数之间用矩阵点积的方式进行运算,得到一个输出维度为[1,86]的向量
-
OUTPUT层
输入向量维度:[1,84]
权重参数的维度:[84,10]
计算方式:输入的向量与权重参数之间用矩阵点积的方式进行运算,得到一个输出维度为[1,10]的向量
附经过卷积后输出维度大小的公式:
N: 输入的维度、F:卷积核大小、stride: 步长、pad: 扩充边缘
o
u
t
p
u
t
=
(
N
+
2
×
p
a
d
−
F
)
s
t
r
i
d
e
+
1
output=\\frac(N+2 \\times pad-F)stride+1
output=stride(N+2×pad−F)+1
二、使用TensorFlow实现卷积、池化
1、卷积
import tensorflow as tf
#定义一个卷积层
def conv2d(x,W):
return tf.nn.conv2d(input, filter, strides, padding)
'''
1.使用TensorFlow定义一个卷积层时,需要使用的函数就是tf.nn.conv2d
该函数需要使用到四个参数。
input:很明显,这个参数就是要填入我们需要进行卷积操作的变量。
filter:卷积核,我们需要定义好卷积核的大小,通道数和个数。
strides:用来定义卷积核每次上下左右移动的步长
padding:决定此处卷积将采用哪种方式。
2.我在定义卷积层时采用函数的形式,conv2d函数需要传进来两个参数x,W,
分别对应input,和filter。值得注意的时,filter的维度要和input相对应才行。
例如我想对一组彩色图片进行卷积操作.
则假设x的维度为x=[10,128,128,3]。
在这里,x.shape[0]表示的时图片的个数,即十张。
x.shape[1]和x.shape[2]表示图片大小为128x128。
x.shape[3]表示图片的通道数,即3。
3.x维度确定好后,W(即filter)的维度也可以确定下来。
W=[5,5,3,16]
在这里,W.shape[0]和W.shape[1]表示的卷积核的大小为5x5。
W.shape[2]表示卷积核的通道数,一定要注意,在定义卷积核通道数时,要和输入的图片的通道数相一致才行,既输入图片通道数为m,则卷积核的通道数也要为m
x.shape[3]表示卷积核的个数,既16。每次卷积有多少个卷积核,则经过卷积后输出的图片通道数就有多少。
4.关于参数strides
strides=[a,b,c,d]这四个变量中,a和d一般情况下都设置为1。
b,c分别表示在卷积时,卷积核每次左右移动步长为b,上下移动步长为c
一般定义是strides=[1,1,1,1]
5.关于参数padding
在卷积里面padding的方式有两种,为"SAME"和”VALID"
使用SAME时,经过卷积后输出的图片大小和输入的大小一致。
使用VALID时,经过卷积后输出的图片大小会小于输入的图片大小,而输出的图片大小具体为多少,可以根据我上面提供的公式进行计算。
'''
2、池化
import tensorflow as tf
#最大池化层
def max_pool_2x2(x):
return tf.nn.max_pool(value, ksize, strides, padding)
"""
1.在使用TensorFlow实现池化是,我选择用tf.nn.max_pool这个函数,最大池化。
最大池化就是在池化窗口中,选取里面最大值出来。把其他值给舍去。tf.nn.max_pool这个函数
也一样需要四个参数,分别为value,ksize,strides,padding。
value:需要进行池化的输入。
ksize:池化窗口,是一个四维向量。
strides:进行池化时,池化窗口上下左右移动的步长。
padding:和卷积类型,决定池化的方式。
2.我在定义定义池化层的时候也同样采用了函数的形式,max_pool_2x2(x)
x很明显就是需要进行池化的输入,应该放在参数value的位置。
假设我想对一组彩色图片进行池化操作。图片数量为10.
则x=[10,128,128,3].
在这里,x.shape[0]表示的时图片的个数,即十张。
x.shape[1]和x.shape[2]表示图片大小为128x128。
x.shape[3]表示图片的通道数,即3。
3.ksize
上面说了,ksize是一个思维向量。
ksize=[a,h,w,b] a和b分别表示batch和channel,因为一般情况下我们不在batch和channel上面进行池化操作,所以a和b的值一般设为1。h和w就是池化窗口的大小了。
4.strides
同卷积一样
strides=[a,b,c,d]这四个变量中,a和d一般情况下都设置为1。
b,c分别表示在卷积时,卷积核每次左右移动步长为b,上下移动步长为c
一般定义是strides=[1,1,1,1]
5.关于参数padding
在池化里面padding的方式有两种,为"SAME"和”VALID"
具体含义见下图所示。
"""
(注:该图片从【深度学习框架TensorFlow】零基础入门|应用 视频中获取)
(如有错误欢迎指正)
若对你有所帮助,点赞、关注点一点
以上是关于浅谈LeNet-5的主要内容,如果未能解决你的问题,请参考以下文章
Tensorflow实现LeNet5网络并保存pb模型,实现自定义的手写数字识别(附opencv-python调用代码)
我用 PyTorch 复现了 LeNet-5 神经网络(MNIST 手写数据集篇)!