MNIST__数字识别__SOFTMAX
时间:2022-06-05
本文章向大家介绍MNIST__数字识别__SOFTMAX,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本次MNIST的手写数字识别未采用input_data.py文件,想尝试一下用原始的数据集来运行这个DEMO。
需要注意的一点是,源码中的图片标签采用的的ONE-HOT编码,而数据集中的标签用的是具体的数字。
例如:图片上的数字和标签的值是5,其对应的ONT-HOT编码为[0,0,0,0,0,1,0,0,0,0](分别对应数值【0,1,2,3,4,5,6,7,8,9】) ,也就是长度为10的一维数组的第6个元素为1,其余的全为0。
源码结构:
1.读取MNIST
2.创建占位符(用读取的数据填充这些空占位符)
3.选用交叉熵作为损失函数
4.使用梯度下降法(步长0.02),来使损失函数最小
5.初始化变量
6.开始计算
7.输出识别率
源码:
import tensorflow as tf
import numpy as np
import struct
# 解析IDX文件格式的MNIST数据集,需要用struct模块对二进制文件进行读取操作
# struct模块中最重要的三个函数是pack() , unpack() 和calcsize()
# calculate 英 [ˈkælkjuleɪt] vt.计算
# 按照给定的格式(fmt)解析字节流string,返回解析出来的tuple
# tuple = unpack(fmt, string)
# format 英 [ˈfɔ:mæt] 格式;使格式化 (format在代码中简化为fmt)
# tuple 英 [tʌpl] 美 [tʌpl] n.元组,数组
# 按照给定的格式化字符串,把数据封装成字符串(实际上是类似于c结构体的字节流)
# string = struct.pack(fmt, v1, v2, ...)
# 计算给定的格式(fmt)占用多少字节的内存
# offset = calcsize(fmt)
import matplotlib.pyplot as plt
# matplotlib.pyplot是一个命令型函数集合,功能齐全的绘图模块
#------------------------------------ 1 ------------------------------------------
def images_load(filename):
# def image_load(filename)用于读取图片数据
# file_name表示要访问的文件名
with open(filename, 'rb') as contents:
#rb表示该文件以只读方式打开,使用with open()as 的好处在于:读取文件内容后会
#自动关闭文件,无需手动关闭。
data_buffers = contents.read()
# 从一个打开的文件读取数据
# buffer 英 [ˈbʌfə(r)]
# n. 缓冲器; 起缓冲作用的人或物; [化] 缓冲液,缓冲剂; [计] 缓冲区
# vt. 缓冲 (个人感觉,了解单词的意思,代码会变的亲切一些)
magic,num,rows,cols = struct.unpack_from('>IIII',data_buffers, 0)
# 读取图片文件前4个整型数字
bits = num * rows * cols
# 整个images数据大小为60000*28*28
images = struct.unpack_from('>' + str(bits) + 'B', data_buffers, struct.calcsize('>IIII'))
# 读取images数据
images = np.reshape(images, [num, rows * cols])
# 转换为[60000,784]型数组
return images
#--------------------------------------- 2 --------------------------------------
def labels_load(filename):
contants = open(filename, 'rb')
#这里用open()打开文件,读取结束后要用close()关闭
data_buffers = contants.read()
magic,num = struct.unpack_from('>II', data_buffers, 0)
# 读取label文件前2个整形数字,label的长度为num
# magic翻译成“魔数”,用于校验下载的文件是否属于MNIST数据集
labels = struct.unpack_from('>' + str(num) + "B", data_buffers, struct.calcsize('>II'))
# 读取labels数据
contants.close()
# 关闭文件
labels = np.reshape(labels, [num])
# 转换为一维数组
return labels
#---------------------------------------- 3 ----------------------------------------
#读取训练和测试文件
filename_train_images = 'E:\MNIST\train-images.idx3-ubyte'
filename_train_labels = 'E:\MNIST\train-labels.idx1-ubyte'
filename_test_images = 'E:\MNIST\t10k-images.idx3-ubyte'
filename_test_labels = 'E:\MNIST\t10k-labels.idx1-ubyte'
train_images=images_load(filename_train_images)
train_labels=labels_load(filename_train_labels)
test_images=images_load(filename_test_images)
test_labels=labels_load(filename_test_labels)
#------------------------------------- 4 ------------------------------------------
x = tf.placeholder("float", [None, 784]) #输入占位符(每张手写数字有28X28个像素点)
y_ = tf.placeholder("float", [None,10]) #输入占位符(用one-hot编码表示标签的值)
w = tf.Variable(tf.zeros([784,10])) #权重
b = tf.Variable(tf.zeros([10])) #偏置
y = tf.nn.softmax(tf.matmul(x,w) + b)
# 输入矩阵x与权重矩阵w相乘,加上偏置矩阵b,然后求softmax(sigmoid函数升级版,可以分成多类)
# softmax会将xW+b分成10类,对应数字0-9
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
# 计算交叉熵
train_step = tf.train.GradientDescentOptimizer(0.02).minimize(cross_entropy)
# 使用梯度下降法(步长0.02),来使偏差和最小
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
# 初始化变量
def train_num(n_t):
xst=train_images[:n_t,:]
zst=train_labels[:n_t]
yst=np.zeros((n_t,10))
for i in range(0,n_t-1):
yst[i][zst[i]]=1
return xst,yst
#训练图片的数量,标签转换为ONE-HOT编码
def test_num(n_t):
xst=test_images[:n_t,:]
zst=test_labels[:n_t]
yst=np.zeros((n_t,10))
for i in range(0,n_t-1):
yst[i][zst[i]]=1
return xst,yst
#测试图片的数量,标签转换为ONE-HOT编码
#======================================= 5 ===========================
xs_t,ys_t=test_num(10000)
#测试图片10000张
xs,ys=train_num(1300)
#用1300张图片进行训练
sess.run(train_step, feed_dict={x:xs,y_:ys })
correct_prediction_1 = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy_1 = tf.reduce_mean(tf.cast(correct_prediction_1, "float"))
# 计算训练精度
print(sess.run(accuracy_1, feed_dict={x: xs_t, y_: ys_t}))
#输出识别的准确率
#=========================================================
print('GOOD WORK')
# 点个赞
0.7147
GOOD WORK
#运行结果 0.7147,看起来很糟糕……
将训练数据的值由1300提高到60000,结果是0.6803,居然降低了。好吧,总感觉哪里不太对,可又说不上来~
参考资料:
ONE-HOT使用体会 : https://blog.csdn.net/lanhaier0591/article/details/78702558
训练Tensorflow识别手写数字 : https://www.cnblogs.com/tengge/p/6363586.html
- Java中实现找到两个数组交集的2种方法,开发实用
- Java Web中JSP的include 指令知识点总结——每日一语法学习
- Java反序列化漏洞从理解到实践
- ORM查询语言(OQL)简介--高级篇(续):庐山真貌
- Java中使用Hibernate系列之映射关联启动工作学习(第五节)
- Java中使用Hibernate系列之单向Set-based的关联学习(第四节)
- Java中使用Hibernate系列之加载并存储对象学习(第三节)
- Java中使用Hibernate系列之启动方法学习(第二节)
- Java中使用Hibernate系列之映射文件学习(第一节)
- Java中为图片添加水印效果的方法——实例代码
- Java中使用Hibernate系列之过滤器(filters)学习
- Node.js中的内存泄漏分析
- Java实现把整数转换为英语单词的方法,实用代码
- Chrome XSS审计之SVG标签绕过
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- ESP8266和ROS收发消息读取模拟量控制LED亮度
- 纯 CSS 实现下拉菜单尖角图标(实心+空心)
- 3分钟短文:书接上回,Laravel数据库迁移的那些个小技巧
- 解密 Docker 挂载文件,宿主机修改后容器里文件没有修改
- SAP Spartacus的单元测试目录结构
- 突击并发编程JUC系列-并发工具 CyclicBarrier
- 详解 | Linux系统是如何实现存储并读写文件的?
- Angular单元测试的一个错误消息
- Python进行特征提取
- dotnet OpenXML 元素 cNvPr NonVisual Drawing Properties 的属性作用
- Java 对象相关面试题
- 【每日一题】【vue2源码学习】VUE中模版编译原理
- 【每日一题】【vue2源码学习】对VUE响应式数据的理解
- ApacheCN 深度学习译文集 2020.9
- 当Docker遇到Intellij IDEA,再次解放了生产力~