【TensorFlow学习笔记】基础篇(六)— —全连接网络实现MNIST手写集

绪论

在这里插入图片描述
MNIST 手写数据集,作为一个经典的数据集,已经被大家所“嚼烂”, 无论是初学者还是高手,几乎都会用到它。那么接下来,我们将以MNIST数据集作为入门学习工具,从全连接网络到CNN,一步一步实现不同神经网络下的MNIST手写数据集分类,从而系统地学习和理解深度学习。

  • MNIST数据集

① 数据集安装
MNIST数据集的官网是Yann LeCun’s website。当然,你也可以通过下面这行代码,实现自动下载和安装,第一次执行程序可能需要花费些时间下载数据集,之后将不再需要,可以直接执行。

import  tensorflow.examples.tutorials.mnist.input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

② 数据集内容
下载下来的数据集被分成两部分:60000行的训练数据集(mnist.train)和10000行的测试数据集(mnist.test)。
每一个MNIST数据单元有两部分组成:一张包含手写数字的图片和一个对应的标签。我们把这些图片设为“xs”,把这些标签设为“ys”。
每一张图片包含28X28个像素点。我们可以用一个数字数组来表示这张图片:
在这里插入图片描述
我们把这二维矩阵展开成一个一维向量,长度是 28x28 = 784。
这样,在MNIST训练数据集中,训练数据集图片(mnist.train.images) 是一个形状为 [60000, 784] 的张量,第一个维度数字用来索引图片,第二个维度数字用来索引每张图片中的像素点。在此张量里的每一个元素,都表示某张图片里的某个像素的强度值,值介于0和1之间。
在这里插入图片描述
你可以把这个 [60000, 784]张量,想象成上图那样,6w张图片这样一片一片的按序排列,每张图都有784个像素点,故此构成这个二维矩阵。

之前我们说的都是每张图片(即:xs),现在我们来说说标签(即:ys)

相对应的MNIST数据集的标签是介于0到9的数字,用来描述给定图片里表示的数字。我们定义标签数据是”one-hot vectors”。 一个one-hot向量除了某一位的数字是1以外其余各维度数字都是0。所以在此教程中,数字n将表示成一个只有在第n维度(从0开始)数字为1的10维向量。比如,标签0将表示成([1,0,0,0,0,0,0,0,0,0,0])。因此,训练数据集标签(mnist.train.labels)是一个 [60000, 10] 的数字矩阵。

在这里插入图片描述

接下来,我们来实现一个非常简单的两层全连接网络来完成MNIST数据的分类问题,输入层784个神经元,对应每张图片784个像素点;输出层10个神经元,对应0-9这10个数字,实现分类。

在这里插入图片描述



1、载入库和数据集

下载mnist数据集是直接调用了tensorflow提供的函数read_data_sets,输入两个参数,
第一个是下载到数据存储的路径,第二个one_hot表示是否要将类别标签进行独热编码。
它首先会去找制定目录下有没有这个数据文件,没有的话才去下载,有的话就直接读取。
所以第一次执行这个命令,速度会比较慢,所以我们一般直接在官网下载保存到MNIST_data中。

代码中的one_hot=True,表示将样本标签转化为one_hot编码。
举例来解释one_hot编码:假如一共有10类:0的one_hot为1000000000,1的ont_hot为0100000000,2的one_hot为0010000000,依次类推。只要有一个位为1,1所在的位置就代表着第几类。

import tensorflow as tf
import os
from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets("MNIST_data", one_hot=True)

2、准备好placeholder

x = tf.placeholder(tf.float32, [None, 784], name='x_input')
y = tf.placeholder(tf.float32, [None, 10], name='y_input')
keep_prob = tf.placeholder(tf.float32, name='keep_prob')
lr = tf.Variable(0.001, dtype=tf.float32, name='learning_rate')
global_step = tf.Variable(0, trainable=False)
  • 在tf.placeholder()函数中传入了3个参数,第一个是定义数据类型为float32;第二个是数据的大小,特征数据是大小784的向量,标签数据是大小为10的向量,None表示不定死大小,到时候可以传入任何数量的样本;第3个参数是这个占位符的名称。
  • TensorFlow中global_step的简单分析

global_step在滑动平均、优化器、指数衰减学习率等方面都有用到,这个变量的实际意义非常好理解:代表全局步数,比如在多少步该进行什么操作,现在神经网络训练到多少轮等等,类似于一个钟表,这在断点继训中有着重要的作用。

根据代码可以发现global_step的初始化值是0:

  global_step=tf.Variable(0, trainable=False) 

然后在tf.train.GradientDescentOptimizer(learning_rate).minimize(loss, global_step=global_steps),系统会自动更新这个参数的值,从1开始,每训练一次global_tep自动加1。

验证代码:

import tensorflow as tf
import numpy as np
 
x = tf.placeholder(tf.float32, shape=[None, 1], name='x')
y = tf.placeholder(tf.float32, shape=[None, 1], name=
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值