浅谈LeNet-5

浅谈LeNet-5

基于Tensorflow的实现欢迎查看我下一篇博客Tensorflow实战 LeNet-5神经网络进行手写体数字识别

一、LetNet是什么?

LetNet是一种入门级的神经网络模型,是一个简单的卷积神经网络,可以用来做手写体识别。

img

下面我将以上图为例简单介绍一下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×padF)+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"
具体含义见下图所示。
"""

浅谈LeNet-5_第1张图片
(注:该图片从【深度学习框架TensorFlow】零基础入门|应用 视频中获取)

(如有错误欢迎指正)

你可能感兴趣的:(浅谈LeNet-5)