tensorflow基于CNN实战mnist手写识别(小白必看)


Posted in Python onJuly 20, 2020

很荣幸您能看到这篇文章,相信通过标题打开这篇文章的都是对tensorflow感兴趣的,特别是对卷积神经网络在mnist手写识别这个实例感兴趣。不管你是什么基础,我相信,你在看完这篇文章后,都能够完全理解这个实例。这对于神经网络入门的小白来说,简直是再好不过了。

tensorflow基于CNN实战mnist手写识别(小白必看)

通过这篇文章,你能够学习到

  • tensorflow一些方法的用法
  • mnist数据集的使用方法以及下载
  • CNN卷积神经网络具体python代码实现
  • CNN卷积神经网络原理
  • 模型训练、模型的保存和载入

Tensorflow实战mnist手写数字识别

关于这个mnist手写数字识别实战,我是跟着某课网上的教学视频跟着写的

需要导入的包

import numpy as np
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data #mnist数据用到的包

下载mnist数据

mnist = input_data.read_data_sets('mnist_data',one_hot=True)

通过这一行代码,就可以将mnist数据集下载到本地文件夹mnist_data目录下,当然,你也可以使用绝对地址下载你想要下载的地方。这里需要注意一点是,如果第一次运行程序,由于需要下载资源的缘故,故需要一段时间,并且下载过程是没有提示的,之后下载成功时 才会提示 Success xxxxxx 。另一种方式就是直接去官网下载数据集
mnist官网 进去点击就可以直接下载了。

张量的声明

input_x = tf.compat.v1.placeholder(tf.float32,[None,28*28],name='input_x')#图片输入
output_y = tf.compat.v1.placeholder(tf.int32,[None,10],name='output_y')#结果的输出
image = tf.reshape(input_x,[-1,28,28,1])#对input_x进行改变形状,

稍微解释一下
[-1,28,28,1] -1表示不考虑输入图片的数量,28*28是图片的长和宽的像素值,1是通道数量,由于原图片是黑白的 ,所以通道是1,若是彩色图片,应为3.

取测试图片和标签

test_x = mnist.test.images[:3000]
test_y = mnist.test.labels[:3000]

[:3000]表示从列表下标为0到2999 这些数据
[1:3] 表示列表下标从1到2 这些数据

卷积神经网络第一层卷积层(用最通俗的言语告诉你什么是卷积神经网络)

#第一层卷积
conv1 = tf.layers.conv2d(inputs=image,#输入
  filters=32,#32个过滤器
  kernel_size=[5,5],#过滤器在二维的大小是5*5
  strides=1,#步长是1
  padding='same',#same表示输出的大小不变,因此需要补零
  activation=tf.nn.relu#激活函数
 )#形状[28,28,32]

第二层池化层

pool1 = tf.layers.max_pooling2d(
  inputs=conv1,#第一层卷积后的值
  pool_size=[2,2],#过滤器二维大小2*2
  strides=2 #步长2
)#形状[14,14,32]

第三层卷积层2

conv2 = tf.layers.conv2d(inputs=pool1,
  filters=64,
  kernel_size=[5,5],
  strides=1,
  padding='same',
  activation=tf.nn.relu
)#形状[14,14,64]

第四层池化层2

pool2 = tf.layers.max_pooling2d(
  inputs=conv2,
  pool_size=[2,2],
  strides=2
)#形状[7,7,64]

平坦化

flat = tf.reshape(pool2,[-1,7*7*64])

使用flat.shape 输出的形状为(?, 3136)

1024个神经元的全连接层

dense = tf.layers.dense(inputs=flat,units=1024,activation=tf.nn.relu)

tf.nn.relu 是一种激活函数,目前绝大多数神经网络使用的激活函数是relu

Droupout 防止过拟合

dropout = tf.layers.dropout(inputs=dense,rate=0.5)

就是为了避免训练数据量过大,造成过于模型过于符合数据,泛化能力大大减弱。

10个神经元的全连接层

logits = tf.layers.dense(inputs=dropout,units=10,name="logit_1")

计算误差,使用adam优化器优化误差

#计算误差,使用交叉熵(交叉熵用来衡量真实值和预测值的相似性)
loss = tf.losses.softmax_cross_entropy(onehot_labels=output_y,logits=logits)
#学习率0.001 最小化loss值,adam优化器
train_op = tf.train.AdamOptimizer(learning_rate=0.001).minimize(loss)

计算精度值

accurary = tf.metrics.accuracy(
   labels=tf.argmax(output_y,axis=1),
   predictions=tf.argmax(logits,axis=1),)[1]

创建会话,初始化变量

sess = tf.compat.v1.Session()#创建一个会话
#初始化全局变量和局部变量
init = tf.group(tf.global_variables_initializer(), tf.local_variables_initializer())
sess.run(init)

基本上到这里,这个程序就完成了,不过你也可以在此基础上加上一些数据的输出,使其更容易显示整个训练的过程。
比如我加上了这一段

for i in range(1000):
 #获取以batch_size为大小的一个元组,包含一组图片和标签
 batch = mnist.train.next_batch(50)
 train_loss,train_op_,logits_output = sess.run([loss,train_op,logits],{input_x:batch[0],output_y:batch[1]})
 if i % 100 == 0:
  test_accuracy = sess.run(accurary,{input_x:test_x,output_y:test_y})
  print(("step=%d,Train loss=%.4f,[Test accuracy=%.2f]") \
    % (i, train_loss, test_accuracy))

输出为:

tensorflow基于CNN实战mnist手写识别(小白必看)

完整的代码数据文件我整理到了GitHub 下载地址 大家如果觉得可以的话,可以给个⭐

下面就回答一些我在学习过程中的遇到的问题:

【问】如何开始学习tensorflow,小白如何入门?
【答】 我的建议是先找到自己感兴趣的点,从这个点出发,通过实践将自己不明白的方法原理通过看官网,看博客,查百度,一一解决。文章开头的那个视频,我认为作为入门还不错,最好再有一本tensorflow相关书籍结合着来。

【问】 CNN卷积神经网络的流程是什么,其中的转化是什么样的?
【答】主要涉及的知识就是数组之间的计算,具体关于我对卷积神经网络的理解,可以参考这篇博客 最易懂-CNN卷积神经网络运行原理和流程

【问】训练好的模型如何保存或者直接拿来使用呢?
【答】具体看我的另一篇博客 模型的保存和使用 也是通过这个例子,教你如何保存模型和使用模型

【问】为什么中间有出现两次卷积层,两次池化层?
【答】这个不是必须的,有的比较复杂的模型需要很多层,每一层都是对上一层特征的提取,只是这个就是比较基本的模型,都是使用两次。初次咱们学习的话,就使用两次就够了,后面学习的知识多了,就可以自己根据实际情况加了。

【问】为什么全连接层有两个,里面的神经元数是固定的吗?
【答】有几个全连接层不是固定的,你就可以理解,这个全连接层就是做最后的收尾工作的,就是将前面几个层所提取到的信息,最后进行汇总 并显示,所以,最后一个全连接层的神经元必须是10,由于本次使用的ont-hot (独热码)的形式来表示图片的label,所以最后一个输出的神经元个数必须是10.至于前面的,大家可以尝试多使用几个尝试一下。
【问】one_hot独热码在咱们这个程序中是怎么使用的?
【答】其实我也是头一次听说这个编码(我是小白),举个例子吧。
0:1000000000
1:0100000000
2:0010000000
就是这种

到此这篇关于tensorflow基于CNN实战mnist手写识别(小白必看)的文章就介绍到这了,更多相关tensorflow mnist手写识别内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python中MySQLdb模块用法实例
Nov 10 Python
一些Python中的二维数组的操作方法
May 02 Python
Python制作爬虫采集小说
Oct 25 Python
Python爬虫辅助利器PyQuery模块的安装使用攻略
Apr 24 Python
Python创建对称矩阵的方法示例【基于numpy模块】
Oct 12 Python
基于Python的文件类型和字符串详解
Dec 21 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
Mar 01 Python
代码实例讲解python3的编码问题
Jul 08 Python
Python常用模块logging——日志输出功能(示例代码)
Nov 20 Python
python语言time库和datetime库基本使用详解
Dec 25 Python
python 统计list中各个元素出现的次数的几种方法
Feb 20 Python
Python日志模块logging用法
Jun 05 Python
基于python实现生成指定大小txt文档
Jul 20 #Python
python中upper是做什么用的
Jul 20 #Python
Pytorch框架实现mnist手写库识别(与tensorflow对比)
Jul 20 #Python
python集合能干吗
Jul 19 #Python
python如何建立全零数组
Jul 19 #Python
解决python中0x80072ee2错误的方法
Jul 19 #Python
python给视频添加背景音乐并改变音量的具体方法
Jul 19 #Python
You might like
Ajax PHP简单入门教程代码
2008/04/25 PHP
详解PHP执行定时任务的实现思路
2015/12/21 PHP
laravel 框架配置404等异常页面
2019/01/07 PHP
javascript操作cookie的文章(设置,删除cookies)
2010/04/01 Javascript
jQuery 阴影插件代码分享
2012/01/09 Javascript
Extjs Gird 支持中文拼音排序实现代码
2013/04/15 Javascript
js获取电脑分辨率的思路及操作
2013/11/22 Javascript
JavaScript中的变量作用域介绍
2014/12/31 Javascript
jQuery中replaceAll()方法用法实例
2015/01/16 Javascript
js实现字符串和数组之间相互转换操作
2016/01/12 Javascript
简单介绍jsonp 使用小结
2016/01/27 Javascript
JS实现的表格行上下移动操作示例
2016/08/03 Javascript
原生JS实现轮播效果+学前端的感受(防止走火入魔)
2016/08/21 Javascript
Angular 4 指令快速入门教程
2017/06/07 Javascript
使用vue-router为每个路由配置各自的title
2018/07/30 Javascript
vue-router 实现导航守卫(路由卫士)的实例代码
2018/09/02 Javascript
Vue 自定义指令实现一键 Copy功能
2019/09/16 Javascript
javascript 数组精简技巧小结
2020/02/26 Javascript
[56:24]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第二局
2016/03/04 DOTA
使用Python的PEAK来适配协议的教程
2015/04/14 Python
Python tkinter模块弹出窗口及传值回到主窗口操作详解
2017/07/28 Python
Python装饰器限制函数运行时间超时则退出执行
2019/04/09 Python
12个步骤教你理解Python装饰器
2019/07/01 Python
Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现
2020/04/22 Python
记一次django内存异常排查及解决方法
2020/08/07 Python
解决PyCharm无法使用lxml库的问题(图解)
2020/12/22 Python
CSS3下的渐变文字效果实现示例
2018/03/02 HTML / CSS
CAD制图人员的自荐信
2014/02/07 职场文书
人力资源职位说明书
2014/07/29 职场文书
银行授权委托书格式
2014/10/10 职场文书
党的群众路线教育实践活动领导班子整改方案
2014/10/25 职场文书
幼儿园教师读书笔记
2015/06/29 职场文书
2019年二手房买卖合同范本
2019/10/14 职场文书
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
2021/06/09 Python
python超详细实现完整学生成绩管理系统
2022/03/17 Python
苹果macOS 13开发者预览版Beta 8发布 正式版10月发布
2022/09/23 数码科技