1

全连接网络基础1——MNIST数据集

 1 year ago
source link: https://blog.51cto.com/hiszm/5285437
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

全连接网络基础1——MNIST数据集

原创

孙中明 2022-05-10 12:25:09 博主文章分类:2022年4月 ©著作权

文章标签 数据集 神经网络模型 神经网络 文章分类 深度学习 人工智能 阅读数161

mnist 数据集 :包含 7 7 万张 黑底白字手写数字 图片, 其中 0 55000 张为训练集 ,
5000 张为验证集,10 0000 张 为测试集 。每张图片大小为 28*28 像素,图片中 纯 黑
色像素 值为 0 , 纯 白色像素值为 1 。数据集 的 标 签是长度为 10 的一维数组,数组
中每个元素 索引号 表示对应数字 出现的概率 。

在将 mnist 数据集作为输入喂入神经网络时,需先将数据集中每张图片变为长度
784 一维数组,将该数组作为神经网络输入特征喂入神经网络。

例如:
一张数字手写体图片变成长度为 784 的一维数组[0.0.0.0.0.231 0.235 0.459
……0.219 0.0.0.0.]输入神经网络。该图片对应的标签为[0.0.0.0.0.0.1.0.
0.0],标签中索引号为 6 的元素为 1,表示是数字 6 出现的概率为 100%,则该图
片对应的识别结果是 6。

√ 使用 input_data 模块中的 read_data_sets( () )函数 加载 mnist 数据集:

from tensorflo w.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets( ’ ./data/’,one_hot=True)

read_data_sets()函数中有两个参数,第一个参数表示数据集存放路径,第
二个参数表示数据集的存取形式。当第二个参数为 Ture 时,表示以独热码形式
存取数据集。read_data_sets()函数运行时,会检查指定路径内是否已经有数据
集,若指定路径中没有数据集,则自动下载,并将 mnist数据集分为训练集 train、
验证集 validation 和测试集 test 存放。在终端显示如下内容:

Extracting ./data/train-images-idx3-ubyte.gz
Extracting ./data/train-labels-idx1-ubyte.gz
Extracting ./data/tl0k-images-idx3-ubyte.gz
Extracting ./data/ tl0k-labels-idx1-ubyte.gz

√ 返回 mnist 数据集中 训练集 train 、验证集 n validation 和测试集 test 样本数
在 Tensorflow 中用以下函数返回子集样本数:
① 返回 训练集 train 样本数

print “train data size:”,mnist.train.mun_examples

输出结果:

train data size:55000

②返回 验证集 validation 样本数

print “ va lidation d ata  size:”,mnist. validation .mun_examples

输出结果:validation data size:5000
③返回 测试集 test 样本数

print “test data size:”,mnist.test.mun_examples

输出结果:test data size:10000
√ 使用 train.labels 函数 返回mnist 数据集 标签

例如:
mnist 数据集中,若想要查看训练集中第 0 张图片的标签,则使用如下函数

mnist.train.labels[0]

输出结果:

array([0.,0.,0.,0.,0.,0.,1.,0.,0.,0])

√ 使用 train.images 函数 返回 mnist 数据集 图片 像素值

例如:
mnist 数据集中,若想要查看训练集中第 0 张图片像素值,则使用如下函数

mnist.train.images[0]

输出结果:

array([0. ,0. ,0. ,
0. ,0. ,0. ,
0. ,0. ,0. ,
… … …])

√ 使用 mnist.train.next_batch( () ) 函数将数据输入 神经网络
例如:

BATCH_SIZE = 200
xs,ys = mnist.train.next_batch(BATCH_SIZE)
print “xs shape:”,xs.shape
print “ys shape:”,ys.shape

输出结果:xs.shape(200,784)
输出结果:ys.shape(200,10)

其中,mnist.train.next_batch()函数包含一个参数 BATCH_SIZE,表示随机从训
练集中抽取 BATCH_SIZE 个样本输入神经网络,并将样本的像素值和标签分别赋
给 xs 和 ys。在本例中,BATCH_SIZE 设置为 200,表示一次将 200 个样本的像素
值和标签分别赋值给 xs 和 ys,故 xs 的形状为(200,784),对应的 ys 的形状为
(200,10)。

实现“ Mnist 数据集手写数字识别 ”的常用函数:

tf. . get_collection(“”) 函数表示从 从 collection 集合中取出全部变量生成
一个列表 。
tf. . add( ) ) 函数表示将参数 列表 中 对应元素相加 。

x=tf.constant([[1,2],[1,2]])
y=tf.constant([[1,1],[1,2]])
z=tf.add(x,y)
print z

输出结果:


[[2,3],[2,4]]

tf. . cast(x,dtype)

函数表示将参数 x 转换为指定 数据 类型 。
例如:

A = tf.convert_to_tensor(np.array([[1,1,2,4], [3,4,8,5]]))
print A.dtype
b = tf.cast(A, tf.float32)
print b.dtype

结果输出:

<dtype: 'int64'>
<dtype: 'float32'>

从输出结果看出,将矩阵 A 由整数型变为 32 位浮点型

tf.equal( ) ) 函数表示对比两个矩阵或者向量的元素。若对应元素相等,则返
回 回 True ;若对应元素不相等,则返回 False 。
例如:

A = [[1,3,4,5,6]]
B = [[1,3,4,3,2]]
with tf.Session( ) as sess:
    print(sess.run(tf.equal(A, B)))

输出结果:

[[ True True True False False]]

在矩阵 A 和 B 中,第 1、2、3 个元素相等,第 4、5 个元素不等,故输出结果中,
第 1、2、3 个元素取值为 True,第 4、5 个元素取值为 False。

tf.reduce_mean( x,axis) ) 函数表示求取矩阵或张量指定维度的平均值。 若 不
指定第二个参数, 则 在所有元素中取平均值 ;若 指定第二个参数为 0 0 ,则 在 第一
维元素 上 取平均值,即每一列求平均值 ;若 指定第二个参数为 1 1 ,则 在 第二维元
素 上 取平均值,即每一行求平均值 。

x = [[1., 1.]
[2., 2.]]
print(tf.reduce_mean(x))
输出结果:1.5
print(tf.reduce_mean(x, 0))
输出结果:[1.5, 1.5]
print(tf.reduce_mean(x, 1))
输出结果:[1., 1.]

tf. . argmax(x,axis) 函数表示 返回 指定维度 asxis 下,参数 x 中 最大值索引号 。
例如:

在 tf.argmax([1,0,0],1)函数中,axis 为 1,参数 x 为[1,0,0],表示在参数 x
的第一个维度取最大值对应的索引号,故返回 0。

os.path.join () 函数表示 把 参数 字符串按照路径命名规则拼接。

import os
os.path.join('/hello/','good/boy/','doiido')

输出结果:'/hello/good/boy/doiido'

⑧ 字符串. . split( ) ) 函数表示定 按照指定 “ 拆分符 ” 对字符串拆分, , 返回拆分列表 。

'./model/mnist_model-1001'.split('/')[-1].split('-')[-1]

在该例子中,共进行两次拆分。第一个拆分符为‘/’,返回拆分列表,并提取
列表中索引为-1 的元素即倒数第一个元素;第二个拆分符为‘-’,返回拆分列
表,并提取列表中索引为-1 的元素即倒数第一个元素,故函数返回值为 1001。

tf.Graph( ).as_default( ) ) 函数表示将当前图设置成为默认图,并返回一
个上下文管理器 。 该函数 一般与 w wh ith 关键字 搭配使用 ,应用于将 已经定义好
的 神经网络在计算图中复现。

例如:
with tf.Graph().as_default() as g,表示将在 Graph()内定义的节点加入到
计算图 g 中。

√ 神经网络模型的保存
在 反向传播过程中,一般会间隔一定轮数保存一次神经网络模型, 并产生三个
文件( 保存当前图结构 的 .meta 文件 、 保存当前参数名 的.index 文件 、 保存当
前参数 的.data 文件 ) ,在 T ensorflow 中如下表示:

saver = tf.train.Saver()
with tf.Session() as sess:
    for i in range(STEPS):
        if i %  轮数 == 0:
            saver.save(sess, os.path.join(MODEL_SAVE_PATH,
                MODEL_NAME), global_step=global_step)

其中,tf.train.Saver()用来实例化 saver 对象。上述代码表示,神经网络每循
环规定的轮数,将神经网络模型中所有的参数等信息保存到指定的路径中,并在
存放网络模型的文件夹名称中注明保存模型时的训练轮数。

√ 神经网络模型的加载
在测试网络效果时,需要将训练好的神经网络模型加载 ,在 T ensorflow 中 这
样 表示:

with tf.Session() as sess:
ckpt = tf.train.get_checkpoint_state( 存储路径) )
if ckpt and ckpt.model_checkpoint_path:
saver.restore(sess, ckpt.model_checkpoint_path)

在 with 结构中进行加载保存的神经网络模型,若 ckpt 和保存的模型在指定路
径中存在,则将保存的神经网络模型加载到当前会话中。
√ 加载模型中参数的滑动平均值
在保存模型时,若模型中采用滑动平均,则参数的滑动平均值会保存在相应文件
中。 通过实例化 saver r 对象 , 实现参数滑动平均值的加载,在 T Tw ensorflow 中 如
下表示:

ema = tf.train.ExponentialMovingAverage( ( 滑动平均基数) )
ema_restore = ema.variables_to_restore()
saver = tf.train.Saver(ema_restore)

√ 神经网络模型准确率评估方法
在网络评估时,一般通过计算在一组数据上的识别准确率 , 评估神经网络的 效
果 。在 Tensorflow 中 这样 表示:

correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean( tf.cast(correct_prediction, tf.float32))

在上述中,y 表示在一组数据(即 batch_size 个数据)上神经网络模型的预测
结果,y 的形状为[batch_size,10],每一行表示一张图片的识别结果。通过
tf.argmax()函数取出每张图片对应向量中最大值元素对应的索引值,组成长度
为输入数据 batch_size 个的一维数组。通过 tf.equal()函数判断预测结果张量
和实际标签张量的每个维度是否相等,若相等则返回 True,不相等则返回 False。
通 过 tf.cast() 函 数 将 得 到 的 布 尔 型 数 值 转 化 为 实 数 型 , 再 通 过
tf.reduce_mean()函数求平均值,最终得到神经网络模型在本组数据上的准确率。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK