第一张图包括8层LeNet5卷积神经网络的结构图,以及其中最复杂的一层S2到C3的结构处理示意图。

第二张图及第三张图是用tensorflow重写LeNet5网络及其注释。

这是原始的LeNet5网络:

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import time# 声明输入图片数据,类别
x = tf.placeholder('float', [None, 784])
y_ = tf.placeholder('float', [None, 10])
# 输入图片数据转化
x_image = tf.reshape(x, [-1, 28, 28, 1])#第一层卷积层,初始化卷积核参数、偏置值,该卷积层5*5大小,一个通道,共有6个不同卷积核
filter1 = tf.Variable(tf.truncated_normal([5, 5, 1, 6]))
bias1 = tf.Variable(tf.truncated_normal([6]))
conv1 = tf.nn.conv2d(x_image, filter1, strides=[1, 1, 1, 1], padding='SAME')
h_conv1 = tf.nn.sigmoid(conv1 + bias1)maxPool2 = tf.nn.max_pool(h_conv1, ksize=[1, 2, 2, 1],strides=[1, 2, 2, 1], padding='SAME')filter2 = tf.Variable(tf.truncated_normal([5, 5, 6, 16]))
bias2 = tf.Variable(tf.truncated_normal([16]))
conv2 = tf.nn.conv2d(maxPool2, filter2, strides=[1, 1, 1, 1], padding='SAME')
h_conv2 = tf.nn.sigmoid(conv2 + bias2)maxPool3 = tf.nn.max_pool(h_conv2, ksize=[1, 2, 2, 1],strides=[1, 2, 2, 1], padding='SAME')filter3 = tf.Variable(tf.truncated_normal([5, 5, 16, 120]))
bias3 = tf.Variable(tf.truncated_normal([120]))
conv3 = tf.nn.conv2d(maxPool3, filter3, strides=[1, 1, 1, 1], padding='SAME')
h_conv3 = tf.nn.sigmoid(conv3 + bias3)# 全连接层
# 权值参数
W_fc1 = tf.Variable(tf.truncated_normal([7 * 7 * 120, 80]))
# 偏置值
b_fc1 = tf.Variable(tf.truncated_normal([80]))
# 将卷积的产出展开
h_pool2_flat = tf.reshape(h_conv3, [-1, 7 * 7 * 120])
# 神经网络计算,并添加sigmoid激活函数
h_fc1 = tf.nn.sigmoid(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)# 输出层,使用softmax进行多分类
W_fc2 = tf.Variable(tf.truncated_normal([80, 10]))
b_fc2 = tf.Variable(tf.truncated_normal([10]))
y_conv = tf.nn.softmax(tf.matmul(h_fc1, W_fc2) + b_fc2)
# 损失函数
cross_entropy = -tf.reduce_sum(y_ * tf.log(y_conv))
# 使用GDO优化算法来调整参数
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(cross_entropy)sess = tf.InteractiveSession()
# 测试正确率
correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))# 所有变量进行初始化
sess.run(tf.initialize_all_variables())# 获取mnist数据
mnist_data_set = input_data.read_data_sets('MNIST_data', one_hot=True)# 进行训练
start_time = time.time()
for i in range(20000):# 获取训练数据batch_xs, batch_ys = mnist_data_set.train.next_batch(200)# 每迭代100个 batch,对当前训练数据进行测试,输出当前预测准确率if i % 2 == 0:train_accuracy = accuracy.eval(feed_dict={x: batch_xs, y_: batch_ys})print("step %d, training accuracy %g" % (i, train_accuracy))# 计算间隔时间end_time = time.time()print('time: ', (end_time - start_time))start_time = end_time# 训练数据train_step.run(feed_dict={x: batch_xs, y_: batch_ys})# 关闭会话
sess.close()

下面是改进后的LeNet5网络:

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import time
import matplotlib.pyplot as plt# 初始化单个卷积核上的权重
def weight_variable(shape):initial = tf.truncated_normal(shape, stddev=0.1)return tf.Variable(initial)# 初始化单个卷积核上的偏置值
def bias_variable(shape):initial = tf.constant(0.1, shape=shape)return tf.Variable(initial)# 输入特征x,用卷积核W进行卷积运算,strides为卷积核移动步长,
# padding表示是否需要补齐边缘像素使输出图像大小不变
def conv2d(x, W):return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')# 对x进行最大池化操作,ksize进行池化的范围,
def max_pool_2x2(x):return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')sess = tf.InteractiveSession()
# 声明输入图片数据,类别
x = tf.placeholder('float32', [None, 784])
y_ = tf.placeholder('float32', [None, 10])
# 输入图片数据转化
x_image = tf.reshape(x, [-1, 28, 28, 1])W_conv1 = weight_variable([5, 5, 1, 32])
b_conv1 = bias_variable([32])
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
h_pool1 = max_pool_2x2(h_conv1)W_conv2 = weight_variable([5, 5, 32, 64])
b_conv2 = bias_variable([64])
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
h_pool2 = max_pool_2x2(h_conv2)W_fc1 = weight_variable([7 * 7 * 64, 1024])
# 偏置值
b_fc1 = bias_variable([1024])
# 将卷积的产出展开
h_pool2_flat = tf.reshape(h_pool2, [-1, 7 * 7 * 64])
# 神经网络计算,并添加relu激活函数
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)W_fc2 = weight_variable([1024, 128])
b_fc2 = bias_variable([128])
h_fc2 = tf.nn.relu(tf.matmul(h_fc1, W_fc2) + b_fc2)W_fc3 = weight_variable([128, 10])
b_fc3 = bias_variable([10])
y_conv = tf.nn.softmax(tf.matmul(h_fc2, W_fc3) + b_fc3)
# 代价函数
cross_entropy = -tf.reduce_sum(y_ * tf.log(y_conv))
# 使用Adam优化算法来调整参数
train_step = tf.train.GradientDescentOptimizer(1e-5).minimize(cross_entropy)# 测试正确率
correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float32"))# 所有变量进行初始化
sess.run(tf.initialize_all_variables())# 获取mnist数据
mnist_data_set = input_data.read_data_sets('MNIST_data', one_hot=True)
c = []# 进行训练
start_time = time.time()
for i in range(1000):# 获取训练数据batch_xs, batch_ys = mnist_data_set.train.next_batch(200)# 每迭代10个 batch,对当前训练数据进行测试,输出当前预测准确率if i % 2 == 0:train_accuracy = accuracy.eval(feed_dict={x: batch_xs, y_: batch_ys})c.append(train_accuracy)print("step %d, training accuracy %g" % (i, train_accuracy))# 计算间隔时间end_time = time.time()print('time: ', (end_time - start_time))start_time = end_time# 训练数据train_step.run(feed_dict={x: batch_xs, y_: batch_ys})sess.close()
plt.plot(c)
plt.tight_layout()

转载于:https://www.cnblogs.com/chizi15/p/9808330.html

卷积神经网络入门:LeNet5(手写体数字识别)详解相关推荐

  1. 读书笔记-深度学习入门之pytorch-第四章(含卷积神经网络实现手写数字识别)(详解)

    1.卷积神经网络在图片识别上的应用 (1)局部性:对一张照片而言,需要检测图片中的局部特征来决定图片的类别 (2)相同性:可以用同样的模式去检测不同照片的相同特征,只不过这些特征处于图片中不同的位置, ...

  2. 基于卷积神经网络的手写数字识别(附数据集+完整代码+操作说明)

    基于卷积神经网络的手写数字识别(附数据集+完整代码+操作说明) 配置环境 1.前言 2.问题描述 3.解决方案 4.实现步骤 4.1数据集选择 4.2构建网络 4.3训练网络 4.4测试网络 4.5图 ...

  3. 深度学习 卷积神经网络-Pytorch手写数字识别

    深度学习 卷积神经网络-Pytorch手写数字识别 一.前言 二.代码实现 2.1 引入依赖库 2.2 加载数据 2.3 数据分割 2.4 构造数据 2.5 迭代训练 三.测试数据 四.参考资料 一. ...

  4. 【图像识别】基于卷积神经网络cnn实现银行卡数字识别matlab源码

    1 基于卷积神经网络cnn实现银行卡数字识别模型 模型参考这里. 2 部分代码 %印刷体识别 clc;clear;close all; addpath('util/'); addpath('data/ ...

  5. bp神经网络_BP 神经网络驱动的手写体数字识别软件 EasyOCR

    EasyOCR 项目介绍 本软件是一个手写体数字识别软件,采用BP神经网络,基于colt数学库,有完整源码,可以保存训练结果,基于开源例程neuralnetwork-sample,原作可以在GitHu ...

  6. bp神经网络测试_BP 神经网络驱动的手写体数字识别软件 EasyOCR

    EasyOCR 项目介绍 本软件是一个手写体数字识别软件,采用BP神经网络,基于colt数学库,有完整源码,可以保存训练结果,基于开源例程neuralnetwork-sample,原作可以在GitHu ...

  7. 卷积神经网络mnist手写数字识别代码_搭建经典LeNet5 CNN卷积神经网络对Mnist手写数字数据识别实例与注释讲解,准确率达到97%...

    LeNet-5卷积神经网络是最经典的卷积网络之一,这篇文章就在LeNet-5的基础上加入了一些tensorflow的有趣函数,对LeNet-5做了改动,也是对一些tf函数的实例化笔记吧. 环境 Pyc ...

  8. keras从入门到放弃(十三)卷积神经网络处理手写数字识别

    今天来一个cnn例子 手写数字识别,因为是图像数据 import keras from keras import layers import numpy as np import matplotlib ...

  9. 1.卷积神经网络入门-训练手写体识别

    文章目录 前言 一.代码和运行结果 二.图例解读代码过程 总结 前言 笔者权当做笔记,借鉴的是<Python 深度学习>这本书,里面的代码也都是书上的代码,用的是jupyter noteb ...

  10. 卷积神经网络CNN 手写数字识别

    1. 知识点准备 在了解 CNN 网络神经之前有两个概念要理解,第一是二维图像上卷积的概念,第二是 pooling 的概念. a. 卷积 关于卷积的概念和细节可以参考这里,卷积运算有两个非常重要特性, ...

最新文章

  1. 网络卖家自曝黑幕 “信用刷手”欺骗你
  2. promise 实现依次循环 请求数据
  3. python 如何获取数组(列表)长度? len()
  4. 线性回归模型算法原理及Python实现
  5. cad刷新快捷键_第16期分享:常用电脑快捷键是哪些?
  6. c++用模板实现稀疏多项式_用线性表实现一元多项式及相加运算
  7. 2场直播丨OGG日常运维及故障处理、云原生数据仓库AnalyticDB
  8. 返回一个整数数组中最大子数组的和---环形数组
  9. centos中mysql启动失败,解决CentOS下mysql启动失败
  10. de4dot命令 v2.0.3.3405 破解命令
  11. Redis常用命令总结
  12. python降低图片分辨率_Python批量更改图片分辨率
  13. 金仓数据库KingbaseES数据库概念(六)--数据库对象管理
  14. 她力量系列四丨读博6年两次换导师,靠一点点“倔”,俞舟成为social chatbot的开拓者之一
  15. alpine是什么 ?
  16. AlexNet VGGNet ResNet 对比 简介
  17. app软件开发有哪些方式?
  18. 大数据薪水大概多少_大数据各岗位薪资收入水平多少?出路在哪里?
  19. c/c++ 标准日期和时间戳互相转化
  20. 数学一年级应用题_一年级下册数学应用题专项训练题

热门文章

  1. Mac安装ps软件,提示Error解决方法
  2. 关于单向TSP旅行商问题/修路问题/最小生成树问题的求解讨论
  3. 实验三 XSS和SQL注入
  4. 电路的等效变换(二)
  5. html导出excel表头多了一行空行,excel中有时候表格下面有很多空行,下拉条滚动一点就过了很多行,怎么取消掉多余的行啊?(excel表头每页都显示)...
  6. PS字体如何加粗的方法
  7. python绘制热图
  8. CSDN文章如何迁移至微信公众号
  9. 从零开始的命令行CLI
  10. 速腾聚创16线激光雷达rslidar-16的ros驱动安装与rviz点云显示