前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场

LeNet-5

作者头像
狼啸风云
修改于 2022-09-03 11:57:49
修改于 2022-09-03 11:57:49
1.3K00
代码可运行
举报
运行总次数:0
代码可运行

1、LeNet-5模型简介

LeNet-5 模型是 Yann LeCun 教授于 1998 年在论文 Gradient-based learning applied to document recognitionr [1] 中提出的,它是第一个成功应用于数字识别问题的卷积神经网络。在 MNIST 数据集 上, LeNet-5 模型可以达到大约 99.2%的正确率。

2、LeNet-5模型结构

LeNet-5 模型总共有 7 层 ,下图展示了 LeNet-5 模型的架构 。

下面总结 LeNet-5 模型每一层的结构。

第一层: 卷积层

输入: 原始的图像像素矩阵(长、宽、色彩), 大小为 32*32*1。

卷积层参数: 过滤器尺寸为 5*5,深度为 6,不使用全 0 填充,步长为1。

输出:大小为 28*28*6。

分析:因为没有使用全 0 填充,所以这一层输出尺寸为 32-5+1=28, 深度为 6;

该卷积层共有 5*5*1*6+6=156 个参数,其中 6个为偏置项参数;

因为下一层的节点矩阵有 28*28*6=4704 个节点,每个节点和 5*5=25 个当前层节点相连,

所以本层卷积层共有 4704*(25+1)=122304 个连接。

第二层: 池化层

输入: 大小为 28*28*6。

池化层参数: 过滤器尺寸为 2*2,长和宽的步长均为2。

输出: 大小为 14*14*6

分析: 6 个特征图共包含 6*2=12 个可训练参数,以及 14*14*6*(2*2+1)=5880 个连接。

第三层: 卷积层

输入: 大小为 14*14*6。

卷积层参数: 过滤器尺寸为 5*5,深度为 16,不使用全 0 填充,步长为1。

输出:大小为 10*10*16。

分析:因为没有使用全 0 填充,所以这一层输出尺寸为 14-5+1=10, 深度为 16;

该卷积层共有 5*5*6*16+16=2416 个参数,其中 16个为偏置项参数;

因为下一层的节点矩阵有 10*10*16=1600 个节点,每个节点和 5*5=25 个当前层节点相连,

所以本层卷积层共有 1600*(25+1)=41600 个连接。

第四层: 池化层

输入: 大小为 10*10*16。

池化层参数: 过滤器尺寸为 2*2,长和宽的步长均为2。

输出: 大小为 5*5*16。

分析: 16 个特征图共包含 16*2=32 个可训练参数,以及 5*5*16*(2*2+1)=2000个连接。

第五层: 全连接层

输入节点个数: 5*5*16=400。

参数个数: 5*5*16*120+120=48120

输出节点个数: 120。

第六层: 全连接层

输入节点个数: 120。

参数个数: 120*84+84=10164

输出节点个数: 84。

第七层: 全连接层

输入节点个数: 84。

参数个数: 84*10+10=850

输出节点个数: 10。

3、LeNet-5模型TensorFlow实现MNIST数字识别

开发环境: Python - 3.0、TensorFlow - 1.4.0、无GPU

训练主文件:LeNet5_train.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding: utf-8 -*-
"""
Created on 2017
《TensorFlow 实战Google深度学习框架 第2,郑泽宇、梁博文等》
@author: 郑泽宇、梁博文等
"""
#见书 p151
#6.4.1 经典卷积神经网络模型——LeNet-5模型

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import LeNet5_infernece
import os
import numpy as np

BATCH_SIZE = 100     #每次选取batch_size个样本进行训练
TRAINING_STEPS = 6000   #训练次数
LEARNING_RATE_BASE = 0.01   #基础的学习率
global_step = tf.Variable(0, trainable=False)  #全局步长
LEARNING_RATE_DECAY = 0.99   #学习率的衰减率
REGULARIZATION_RATE = 0.0001   #正则化项系数
MOVING_AVERAGE_DECAY = 0.99  #滑动平均衰减率

def train(mnist):
    x = tf.placeholder(tf.float32, [
            BATCH_SIZE,        
            LeNet5_infernece.IMAGE_SIZE, 
            LeNet5_infernece.IMAGE_SIZE,
            LeNet5_infernece.NUM_CHANNELS], 
        name='x-input')
    y_ = tf.placeholder(tf.float32, [None, LeNet5_infernece.OUTPUT_NODE], name='y-input')
    regularizer = tf.contrib.layers.l2_regularizer(REGULARIZATION_RATE)
    y = LeNet5_infernece.inference(x,False,regularizer) 
    variable_averages = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY, global_step)
    variables_averages_op = variable_averages.apply(tf.trainable_variables())
    
    cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y, labels=tf.argmax(y_, 1))
    cross_entropy_mean = tf.reduce_mean(cross_entropy)
    
    loss = cross_entropy_mean + tf.add_n(tf.get_collection('losses'))
    
    learning_rate = tf.train.exponential_decay(
        LEARNING_RATE_BASE,
        global_step,
        mnist.train.num_examples / BATCH_SIZE, LEARNING_RATE_DECAY,
        staircase=True)

    train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss, global_step=global_step)
   
    train_op = tf.group(train_step, variables_averages_op) 
    saver = tf.train.Saver()
    
    with tf.Session() as sess:     
        tf.global_variables_initializer().run()    

        for i in range(TRAINING_STEPS):
            xs, ys = mnist.train.next_batch(BATCH_SIZE)
            reshaped_xs = np.reshape(xs, (
                BATCH_SIZE,
                LeNet5_infernece.IMAGE_SIZE,
                LeNet5_infernece.IMAGE_SIZE,
                LeNet5_infernece.NUM_CHANNELS))
            
            _, loss_value, step = sess.run([train_op, loss, global_step], feed_dict={x: reshaped_xs, y_: ys})
            if i % 1000 == 0:
                print("After %d training step(s), loss on training batch is %g." % (step, loss_value))

def main(argv=None):
    mnist = input_data.read_data_sets("MNIST_data", one_hot=True)
    train(mnist)

if __name__ == '__main__':
    main()

模型子文件:LeNet5_infernece.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding: utf-8 -*-
"""
Created on 2017
《TensorFlow 实战Google深度学习框架 第2,郑泽宇》
@author: 郑泽宇、梁博文等
"""
#见书 p151
#6.4.1 经典卷积神经网络模型——LeNet-5模型

import tensorflow as tf

#1. 设定神经网络的参数
INPUT_NODE = 784
OUTPUT_NODE = 10

IMAGE_SIZE = 28
NUM_CHANNELS = 1

#第一层卷积层的尺寸和深度
CONV1_DEEP = 32  #第一层卷积层深度
CONV1_SIZE = 5  #第一层卷积层尺寸

#第二层卷积层的尺寸和深度
CONV2_DEEP = 64  #第二层卷积层深度
CONV2_SIZE = 5   #第二层卷积层尺寸

#第五层全连接层节点的个数
FC_SIZE = 512

#第六层全连接层节点的个数
NUM_LABELS = 10

#2. 定义前向传播的过程
#参数:输入(四维矩阵)、是否为训练/测试、正则化参数(参数变量管理)
def inference(input_tensor, train, regularizer):
    
    #声明第一层卷积层的变量并实现前向传播过程。
    #使用不同的命名空间来隔离不同层的变量。
    #输入: 28*28*1     输出: 28*28*32
    with tf.variable_scope('layer1-conv1'):
        #定义卷积过滤器。
        #定义卷积层参数:前两个为尺寸 5*5 、第三个为当前层节点矩阵的深度 1、第四个为卷积层的深度 32
        conv1_weights = tf.get_variable(
            "weight", [CONV1_SIZE, CONV1_SIZE, NUM_CHANNELS, CONV1_DEEP],
            initializer=tf.truncated_normal_initializer(stddev=0.1))
        #定义偏置项为 0,及下一层节点矩阵的深度 32(参数共享)
        conv1_biases = tf.get_variable("bias", [CONV1_DEEP], initializer=tf.constant_initializer(0.0))
        #tf.nn.conv2d 提供了一个方便的卷积层前向传播函数
        #参数1:当前层的节点矩阵,四维矩阵,第一维度对应一个输入batch,如第一张图片,第二张图片..
        #参数2:卷积层参数
        #参数3:不同维度上的步长(第一维、最后一维必须为1)
        #参数4:提供'SAME''VALLD'选择,'SAME'为添加全0填充,'VALLD'为不添加,填充的目的是矩阵尺寸在卷积层不变。
        conv1 = tf.nn.conv2d(input_tensor, conv1_weights, strides=[1, 1, 1, 1], padding='SAME')
        #tf.nn.bias_add提供给每个conv节点加上偏置项,再将计算结果通过ReLU激活函数完成去线性化
        relu1 = tf.nn.relu(tf.nn.bias_add(conv1, conv1_biases))
    
    #声明第二层池化层前向传播过程
    #使用不同的命名空间来隔离不同层的变量。
    #tf.nn.max_pool 提供了一个方便的最大池化层的前向传播过程。
    #tf.nn.avg_pool 提供了一个方便的平均池化层的前向传播过程,两者参数一致。
    #参数1:四维矩阵,第一维度对应一个输入batch,如第一张图片,第二张图片..
    #参数2:ksize为过滤器参数,常为[1, 2, 2, 1][1, 3, 3, 1]
    #参数3:不同维度上的步长(第一维、最后一维必须为1)
    #参数4:提供'SAME''VALLD'选择,'SAME'为添加全0填充,'VALLD'为不添加
    #输入: 28*28*32     输出: 14*14*32
    with tf.name_scope("layer2-pool1"):
        pool1 = tf.nn.max_pool(relu1, ksize = [1,2,2,1],strides=[1,2,2,1],padding="SAME")

    #声明第三层卷积层的变量并实现前向传播过程。
    #使用不同的命名空间来隔离不同层的变量。
    #输入: 14*14*32     输出: 14*14*64
    with tf.variable_scope("layer3-conv2"):
        conv2_weights = tf.get_variable(
            "weight", [CONV2_SIZE, CONV2_SIZE, CONV1_DEEP, CONV2_DEEP],
            initializer=tf.truncated_normal_initializer(stddev=0.1))
        conv2_biases = tf.get_variable("bias", [CONV2_DEEP], initializer=tf.constant_initializer(0.0))
        conv2 = tf.nn.conv2d(pool1, conv2_weights, strides=[1, 1, 1, 1], padding='SAME')
        relu2 = tf.nn.relu(tf.nn.bias_add(conv2, conv2_biases))
    
    #声明第四层池化层前向传播过程
    #输入: 14*14*64     输出: 7*7*64(不包括数据处理)
    with tf.name_scope("layer4-pool2"):
        pool2 = tf.nn.max_pool(relu2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
        pool_shape = pool2.get_shape().as_list()
        nodes = pool_shape[1] * pool_shape[2] * pool_shape[3]
        reshaped = tf.reshape(pool2, [pool_shape[0], nodes])

    #声明第五层全连接层的变量并实现前向传播过程
    #输入:向量长度为3136   输出:向量长度为512
    with tf.variable_scope('layer5-fc1'):
        fc1_weights = tf.get_variable("weight", [nodes, FC_SIZE],
                                      initializer=tf.truncated_normal_initializer(stddev=0.1))
        if regularizer != None: tf.add_to_collection('losses', regularizer(fc1_weights))
        fc1_biases = tf.get_variable("bias", [FC_SIZE], initializer=tf.constant_initializer(0.1))
        fc1 = tf.nn.relu(tf.matmul(reshaped, fc1_weights) + fc1_biases)
        if train: fc1 = tf.nn.dropout(fc1, 0.5)

    #声明第六层全连接层的变量并实现前向传播过程
    #输入:向量长度为512   输出:向量长度为10
    with tf.variable_scope('layer6-fc2'):
        fc2_weights = tf.get_variable("weight", [FC_SIZE, NUM_LABELS],
                                      initializer=tf.truncated_normal_initializer(stddev=0.1))
        if regularizer != None: tf.add_to_collection('losses', regularizer(fc2_weights))
        fc2_biases = tf.get_variable("bias", [NUM_LABELS], initializer=tf.constant_initializer(0.1))
        logit = tf.matmul(fc1, fc2_weights) + fc2_biases

    return logit

实验结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
After 1 training step(s), loss on training batch is 5.95725.
After 1001 training step(s), loss on training batch is 0.664706.
After 2001 training step(s), loss on training batch is 0.670048.
After 3001 training step(s), loss on training batch is 0.638539.
After 4001 training step(s), loss on training batch is 0.743027.
After 5001 training step(s), loss on training batch is 0.638279.
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用 L2 正则化和平均滑动模型的 LeNet-5MNIST 手写数字识别模型
[1]Tensorflow实战Google深度学习框架: https://github.com/caicloud/tensorflow-tutorial/tree/master/Deep_Learning_with_TensorFlow/1.4.0
演化计算与人工智能
2020/08/14
4490
基于卷积神经网络的图像识别
视觉是人类认识世界非常重要的一种知觉。对于人类来说,通过识别手写体数字、识别图片中的物体或者是找出4%图片中人脸的轮廓都是非常简单的任务。然而对于计算机而言,让计算机识别图片中的内容就不是一件容易的事情了。图像识别问题希望借助计算机程序来处理、分析和理解图片中的内容,使得计算机可以从图片中自动识别各种不同模式的目标和对象。图像识别作为人工智能的一个重要领域,在最近几年已经取得了很多突破性的进展,而神经网络就是这些突破性进展背后的主要技术支持。
狼啸风云
2019/03/05
7.9K0
图像识别与卷积神经网络
卷积神经网络是除了全连接神经网络以外另一个常用的网络结果,其在图像识别方面表现十分突出。本文结合Tensorflow:实战Google深度学习框架,讲述卷积神经网络常用数据集,介绍卷积网络的结构思想,以及通过TensorFlow实现其设计。
全栈程序员站长
2022/09/02
1.1K0
图像识别与卷积神经网络
TensorFlow实战——CNN(LeNet5)——MNIST数字识别
本文地址: http://blog.csdn.net/u011239443/article/details/72861591
小爷毛毛_卓寿杰
2019/02/13
5350
卷积神经网络处理图像识别(二)
其中的全连接层还引入了dropout的概念。dropout在训练时会随机将部分节点的输出改为0(使神经元以一定概率失活)。dropout可以避免过拟合(overfitting)问题。
用户6021899
2019/11/23
8030
卷积层与池化层(bn层的原理和作用)
构建了最简单的网络之后,是时候再加上卷积和池化了。这篇,虽然我还没开始构思,但我知道,一定是很长的文章。
全栈程序员站长
2022/07/25
2.7K0
卷积层与池化层(bn层的原理和作用)
TensorFlow-手写数字识别(三)
本篇文章在上篇TensorFlow-手写数字识别(二)的基础上,将全连接网络改为LeNet-5卷积神经网络,实现手写数字识别。
xxpcb
2020/08/04
1K0
(二)Tensorflow搭建卷积神经网络实现MNIST手写字体识别及预测
1 搭建卷积神经网络 1.0 网络结构 [图1.0 卷积网络结构 ] 1.2 网络分析 序号 网络层 描述 1 卷积层 一张原始图像(28, 28, 1),batch=1,经过卷积处理,得到图像特征(28, 28, 32) 2 下采样 即池化层,最大池化后图像特征(14, 14, 32) 3 卷积层 将池化特征(14, 14, 32)卷积处理后,得到图像特征(14, 14, 64) 4 下采样 最大池化,得到图像特征(7, 7, 64) 5 全连接层 将上一层即池化层的图像特征经过矩阵内积计算,拉成一个向量
xdq101
2019/06/02
7960
(二)Tensorflow搭建卷积神经网络实现MNIST手写字体识别及预测
【Kaggle竞赛】AlexNet模型定义及实现
在图像识别/目标检测领域,基本上CNN的天下,从基础的AlexNet,再到后面更深的GoogleNet、VGGNet等,再到收敛速度更快、泛化性更强ResNet等残差网络,从2012年到现在CNN网络在图像识别/目标检测领域可谓是一个很好的方法。
嵌入式视觉
2022/09/05
3770
【Kaggle竞赛】AlexNet模型定义及实现
CNN
32x32x1(f=5,s=1)—>28x28x6(k=2,s=2)—>14x14x6(f=5,s=1)—>10x10x16(k=2,s=2)—>5x5x16—>Fc(120)—>Fc(84)—>10
用户4880117
2019/03/18
1.1K0
[TensorFlow深度学习入门]实战六·用CNN做Kaggle比赛手写数字识别准确率99%+
参考博客地址 本博客采用Lenet5实现,也包含TensorFlow模型参数保存与加载参考我的博文,实用性比较好。在训练集准确率99.85%,测试训练集准确率99%+。
小宋是呢
2019/06/27
9810
3.1 学习率(learning rate)的选择
版权声明:本文为博主原创文章,未经博主允许不得转载。python版本为python3,实例都是经过实际验证。 https://blog.csdn.net/jinxiaonian11/article/details/83105439
锦小年
2019/05/28
1.4K0
机器之心GitHub项目:从零开始用TensorFlow搭建卷积神经网络
机器之心原创 参与:蒋思源 机器之心基于 Ahmet Taspinar 的博文使用 TensorFlow 手动搭建卷积神经网络,并提供所有代码和注释的 Jupyter Notebook 文档。我们将不仅描述训练情况,同时还将提供各种背景知识和分析。所有的代码和运行结果都已上传至 Github,机器之心希望通过我们的试验提供精确的代码和运行经验,我们将持续试验这一类高质量的教程和代码。 机器之心项目地址:https://github.com/jiqizhixin/ML-Tutorial-Experiment
机器之心
2018/05/08
1.5K0
机器之心GitHub项目:从零开始用TensorFlow搭建卷积神经网络
卷积神经网络实战MNIST
本节学习来源斯坦福大学cs20课程,有关本节源代码已同步只至github,欢迎大家star与转发,收藏!
公众号guangcity
2019/09/20
7500
卷积神经网络实战MNIST
美还是丑?这有一个CNN开发的颜值评分器 | 实战
在人工智能的发展越来越火热的今天,其中智能应用也在伴随着我们的生活,其中最具有代表性的便是图像识别,并且其中的应用比比皆是,如车站的人脸识别系统,交通的智能监控车牌号系统等等。而卷积神经网络作为图像识别的首选算法,对于图像的特征提取具有很好的效果,而TensorFlow作为Google的开源框架具有很好的结构化特征,而本篇文章将利用卷积神经网络算法对图像识别进行应用,开发出颜值评分器的功能。
AI科技大本营
2019/11/12
1.2K0
[TensorFlow深度学习入门]实战九·用CNN做科赛网TibetanMNIST藏文手写数字数据集准确率98%+
我们在博文,使用CNN做Kaggle比赛手写数字识别准确率99%+,在此基础之上,我们进行对科赛网TibetanMNIST藏文手写数字数据集训练,来验证网络的正确性。
小宋是呢
2019/06/27
6260
CNN卷积神经网络之通俗理解!
简而言之,卷积神经网络(Convolutional Neural Networks)是一种深度学习模型或类似于人工神经网络的多层感知器,常用来分析视觉图像。卷积神经网络的创始人是着名的计算机科学家Yann LeCun,目前在Facebook工作,他是第一个通过卷积神经网络在MNIST数据集上解决手写数字问题的人。
智能算法
2019/07/12
1.8K0
CNN卷积神经网络之通俗理解!
知乎问题代码
# -*- coding: utf-8 -*- """ Created on Sat May 19 18:44:40 2018 @author: John Kwok """ # import import numpy as np import tensorflow as tf import GetDataUtil # 数据读取及预处理 ''' 定义超参 ''' BATCH_SIZE = 128 # 批大小 EPOCH = 5 # 训练EPOCH次数 HIDDEN_UNIT = 512 KERNEL_S
10JQKA
2018/08/01
1.1K0
(一)Tensorflow搭建普通神经网络实现MNIST手写字体识别及预测
输入层数据为维度(1, 784),其中1表示数据数量,因为网络一次只处理一张图片,所以为1,784是图像数据维度,将$28\times 28 \times1$的数据处理成一个列向量,便于存储,若向显示,则需要将其回复到源尺寸,参见博客MNIST手写字体数据集解析.
xdq101
2019/05/31
1.2K0
(一)Tensorflow搭建普通神经网络实现MNIST手写字体识别及预测
tensorflow学习笔记_03
上一篇使用tensorflow完成一个卷积神经网络,但当时写的代码虽然可以工作,还比较零乱,并且并没有经过参数调优,最终得到的模型准确率也并不是很高。本周花了些时间将代码进行了重构,并且对某些地方进行了调整了,目前得到的准确率就比较高了。 神经网络 神经网络的概念 神经网络只是一个很酷的名词,媒体用来夸大其词的,其实没有生物神经那么高级。神经网络归根结底就是计算图谱,或者说数据流图谱。其实就是一串链在一起的函数,这些函数的操作对象是各种维度的矩阵。 下面这段我总结出来的话很重要,很重要,很重要。 在tens
jeremyxu
2018/05/10
6600
相关推荐
使用 L2 正则化和平均滑动模型的 LeNet-5MNIST 手写数字识别模型
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验