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

 更新时间:2020年07月20日 08:40:32   作者:梁先森-python数据分析师进阶之路  
这篇文章主要介绍了tensorflow基于CNN实战mnist手写识别(小白必看),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

很荣幸您能看到这篇文章,相信通过标题打开这篇文章的都是对tensorflow感兴趣的,特别是对卷积神经网络在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))

输出为:


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

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

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

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

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

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

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

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

相关文章

  • matplotlib绘制多个子图(subplot)的方法

    matplotlib绘制多个子图(subplot)的方法

    这篇文章主要介绍了matplotlib绘制多个子图(subplot)的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • ElasticSearch Python 使用示例详解

    ElasticSearch Python 使用示例详解

    这篇文章主要介绍了ElasticSearch Python 使用示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-04-04
  • Python实现查询某个目录下修改时间最新的文件示例

    Python实现查询某个目录下修改时间最新的文件示例

    这篇文章主要介绍了Python实现查询某个目录下修改时间最新的文件,涉及Python使用os与shutil模块针对文件的遍历、属性获取、读写等相关操作技巧,需要的朋友可以参考下
    2018-08-08
  • 使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例

    使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例

    这篇文章主要介绍了使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • python SQLAlchemy 中的Engine详解

    python SQLAlchemy 中的Engine详解

    这篇文章主要介绍了python SQLAlchemy 中的Engine详解,Engine 翻译过来就是引擎的意思,汽车通过引擎来驱动,而 SQLAlchemy 是通过 Engine 来驱动,Engine 维护了一个连接池(Pool)对象和方言(Dialect),需要的朋友可以参考下
    2019-07-07
  • 使用apiDoc实现python接口文档编写

    使用apiDoc实现python接口文档编写

    今天小编就为大家分享一篇使用apiDoc实现python接口文档编写,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • Python中函数的创建及调用

    Python中函数的创建及调用

    这篇文章主要介绍了Python中函数的创建及调用,创建函数也称为定义一个函数,可以理解为创建一个具有某种用途的工具。调用函数也就是执行函数。如果把创建的函数理解为创建一个具体有某种用途的工具,那么调用函数就相当于使用该工具
    2022-06-06
  • Django实现在线无水印抖音视频下载(附源码及地址)

    Django实现在线无水印抖音视频下载(附源码及地址)

    该项目功能简单,完全复制SaveTweetVedio的项目。用户观看抖音视频时选择复制视频链接,输入到下载输入栏,即可下载无水印视频,还可扫描二维码手机上预览。亲测成功。
    2021-05-05
  • Python Pandas 中的数据结构详解

    Python Pandas 中的数据结构详解

    这篇文章主要介绍了Python Pandas 中的数据结构详解,Pandas有三种数据结构Series、DataFrame和Panel,文章围绕主题展开更多相关内容需要的小伙伴可以参考一下
    2022-06-06
  • Python OpenCV图像模糊处理介绍

    Python OpenCV图像模糊处理介绍

    大家好,本篇文章主要讲的是Python OpenCV图像模糊处理介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01

最新评论