【TensorFlow】线性加权法-mnist手写体识别实践 笔记

〇、前情提要

在b站跟着up主 白手起家的百万富翁 学mnist手写体识别实践。
参考:

  1. 【mnist手写体识别实践】想知道手写体识别如何做吗?跟美女算法专家一起了解mnist数据集 并用python实践手写体识别吧
    https://www.bilibili.com/video/BV1YJ41137jy/?spm_id_from=333.788.videocard.0
  2. minist数据集 - THE MNIST DATABASE of handwritten digits
    http://yann.lecun.com/exdb/mnist/
  3. 我的笔记- 【TensorFlow】mac下出现from tensorflow.examples.tutorial.mnist import input_data无法导入
    https://blog.csdn.net/weixin_43210113/article/details/107671454
  4. 我的笔记-【TensorFlow】解决AttributeError: module ‘scipy.misc‘ has no attribute ‘toimage‘问题
    https://blog.csdn.net/weixin_43210113/article/details/107673559
  5. AttributeError: module ‘tensorflow’ has no attribute 'placeholder’等问题的解决
    https://blog.csdn.net/flowingfog/article/details/93597697?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param

一、写在前面

up的简介

之前一直讲算法理论,本期视频带大家用python动手实践mnist数据集,简单了解mnist数据集并进行手写体识别实践,希望可以让大家从最简单的入门,慢慢进入人工智能领域,我的初衷就是希望能帮助想进入人工智能领域的朋友快速了解AI,我所有视频的ppt都会发在专栏里,如果大家喜欢,请关注我,并点赞转发弹幕评论投币哦~ 如果非常喜欢我的话,请给我充电哦~我会一直更新的,你们的支持是我最大的动力

其他

目前做机器学习python,深度学习TensorFlow、Keras,用的softmax函数,一层神经网络的形式。

准备工作

下载

  • train-images-idx3-ubyte.gz: training set images (9912422 bytes)
  • train-labels-idx1-ubyte.gz: training set labels (28881 bytes)
  • t10k-images-idx3-ubyte.gz: test set images (1648877 bytes)
  • t10k-labels-idx1-ubyte.gz: test set labels (4542 bytes)

二、读入数据集并查看格式

一些提示

如果无法导入from tensorflow.examples.tutorials.mnist import input_data,可以看我写的笔记:

我的笔记- 【TensorFlow】mac下出现from tensorflow.examples.tutorial.mnist import input_data无法导入
https://blog.csdn.net/weixin_43210113/article/details/107671454

one_hot
one_hot是分类问题必用的一种手段
数字一共10类,就把
0转成(1,0,0,0,0,0,0,0,0,0),
1转成(0,1,0,0,0,0,0,0,0,0),
2转成(0,0,1,0,0,0,0,0,0,0),

这样可以匹配最后softmax层维数

下载数据集

# 如果tensorflow版本为1用第一种 版本为2用第二种
import tensorflow as tf
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
# 使用mnist数据集,要引用读取方式
from tensorflow.examples.tutorials.mnist import input_data
# from tensorflow.contrib.learn.python.learn.datasets.mnist import read_data_sets
# 后续可能要使用到的包
import numpy sa np
import os
# scipy.misc中存图片函数用PIL的代替
import scipy.misc
from PIL import Image

# 下载数据集
mnist = input_data.read_data_sets('mnist_data/', one_hot=True)

# 读取压缩包
print(mnist)

下载成功
在这里插入图片描述

查看图片的形式

# 查看images 55000张图片,每张图片784维向量表示。
print(mnist.train.images.shape)

55000张图片,每张图片784维向量表示。
在这里插入图片描述

查看标签的形式

# 查看label 55000个标签,每个标签10维向量表示。
print(mnist.train.labels.shape)

55000个标签,每个标签10维向量表示。
在这里插入图片描述

查看图片如何表示

print(mnist.train.images[0,:])

过长仅截取一段,784维向量。范围为0-1,所以在后面调用scipy.misc.toimage时,min(数据)变成黑色,max(数据)变成白色,cmin=0.0, cmax=1.0
在这里插入图片描述

查看标签如何表示

print(mnist.train.labels[0,:])

在7的位置上为1,则该数应该为1。
在这里插入图片描述

# 读取压缩包
print(mnist)

# 查看images 55000张图片,每张图片784维向量表示。
print(mnist.train.images.shape)

# 查看图片如何表示
print(mnist.train.images[0,:])

# 查看label 55000个标签,每个标签10维向量表示。
print(mnist.train.labels.shape)

# 查看标签如何表示
print(mnist.train.labels[0,:])

三、 读取图片

一些提示

如果scipy版本在1.1.0以上出现报错,请参考:

我的笔记-【TensorFlow】解决AttributeError: module ‘scipy.misc‘ has no attribute
‘toimage‘问题
https://blog.csdn.net/weixin_43210113/article/details/107673559

读取前五张图片并保存

# 读取五张数据集并保存为图片
# 定义存储路径前缀
dir_data = 'mnist_data/raw/'
# 检测是否已存在该文件夹
if os.path.exists(dir_data) is False:
    os.makedirs(dir_data)

for i in range(5):
    # 向量矩阵的存储格式
    image_array = mnist.train.images[i,:]
    # 784向量转化为28*28的矩阵形式
    image_array = image_array.reshape(28,28)
    # 定义图片名字 文件夹格式+图片名字
    image_file = dir_data + 'mnist_train_%d.jpg' % i
    # 转化为图片并存储 cmin cmax图片格式 min(数据)变成黑色,max(数据)变成白色
    # scipy.misc.toimage(image_array, cmin=0.0, cmax=1.0).save(image_file)
    # scipy.misc.toimage方法弃用,可用PIL中的函数代替
    Image.fromarray((image_array * 255).astype('uint8'), mode='L').convert('RGB').save(image_file)

显示标签

	# 输出标签值
	image_label = mnist.train.labels[i,:]
	# argmax使one_hot转换成数值的形式
	label = np.argmax(image_label)
	print('image_train_%d label is : %d' % (i, label))

在这里插入图片描述
在这里插入图片描述


四、手写体识别

一些提示

如果出现AttributeError: module 'tensorflow' has no attribute 'placeholder'报错,请参考以下文档中的方法。

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

AttributeError: module ‘tensorflow’ has no attribute 'placeholder’等问题的解决
https://blog.csdn.net/flowingfog/article/details/93597697?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param

y=WX+b变量与参数构建

# 逻辑回归模型 y=WX+b 必须要加上这个偏置项b,才能保证分类器可以在空间的任何位置画决策面
# tensorflow 中在运行时动态设置某个变量的值,先使用placeholder占位
x = tf.placeholder(tf.float32, [None, 784])
# 使用softmax函数需要先定义变量 初始化为zero 784-10 神经网络一层结构
W = tf.Variable(tf.zeros([784,10]))
# b为偏置向量
b = tf.Variable(tf.zeros([10]))
# 真实的y值 10维向量
y_ = tf.placeholder(tf.float32,[None,10])

# 输出值y = softmax(W*x+b) 矩阵相乘已封装
y = tf.nn.softmax(tf.matmul(x,W)+b)

构建损失函数

# 交叉熵损失函数 构建真实y与输出的y的交叉熵 labels和logits的值不要搞反
cross_entrpy = tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))
# 梯度下降方式一步步迭代使损失函数最小 随机梯度下降方式 初始化学习率 最小化损失函数
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entrpy)

# 以上定义了TensorFlow数据流图的框架

查看准确率

# 想让数据跑起来要定义一个session
with tf.Session() as sess:
	# 初始化所有变量
	tf.global_variables_initializer().run()
	# 迭代一千次 随机梯度下降 每次只取一个batch的数据集
	for _ in range(1000):
		# 直接读取batch 只取100个进行迭代
		batch_xs, batch_ys = mnist.train.next_batch(100)
		# 使数据留起来 feed_dict喂数据
		sess.run(train_step, feed_dict={x:batch_xs, y_:batch_ys})
	# 查看准确率 argmax函数与1比较
	curr_pre = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
	acc = tf.reduce_mean(tf.cast(curr_pre, tf.float32))
	# 准确率也需要sess.run得到 否则只是摆设 用测试集的数据来验证准确率 所以feed数据是mnist测试集的数据,测试集的数据每个都进行测试
	print(sess.run(acc, feed_dict={x:mnist.test.images, y_:mnist.test.labels}))

五、测试结果

输出准确率

在这里插入图片描述

总结

非常简单使用了线性加权再用softmax函数套了一下,后续使用卷积神经网络会增加准确度。
简单了解TensorFlow的算法和框架。


©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页