Mnist手写数字识别
前言
Mnist数据集可以从官网下载,网址: http://yann.lecun.com/exdb/mnist/ 下载下来的数据集被分成两部分: 55000行的训练数据集(mnist.train) 和10000行的测试数据集(mnist.test) 。每一个MNIST数据单元有两部分组成: 一张包含手写数字的图片和一个对应的标签。我们把这些图片设为“xs",把这些标签设为"ys"。训练数据集和测试数据集都包含xs和ys,比如训练数据集的图片是mnist.train.images,训练数据集的标签是mnist.train.labels.
分析
我们可以知道图片是黑白图片,每一张图片包含28像素X28像素。我们把这个数组展开成一个向量,长度是28x28= 784。因此,在MNIST训练数据集中,mnist.train.images 是一个形状为[55000, 784]的张量。(55000张图片,784个特征值)
MNIST中的每个图像都具有相应的标签,0到9之间的数字表示图像中绘制的数字。用的是one-hot编码nn[0, 0,0, 1, 0,0, 0, 0,0, 0] mnist. train. labels [55000, 10](10个目标数据,“0”,“1”,…,“9”)
代码演示
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
from tensorflow.examples.tutorials.mnist import input_data
def full_connect():
'''
利用mnist数据集,实现手写数字识别
:return: None
'''
# 获取数据
mnist = input_data.read_data_sets("./data/mnist/input_data", one_hot=True)
# 建立数据的占位符 x[None,784](特征值) y_true[None,10](目标值)
with tf.variable_scope("data"):
x = tf.placeholder(tf.float32,[None,784])
# one-hot编码类型
y_true = tf.placeholder(tf.int32,[None,10])
# 建立全连接层的神经网络 weight [784,10](权重) bias[10](偏置)
with tf.variable_scope("fc_model"):
# 随机初始化权重和偏置
weight = tf.Variable(tf.random_normal([784,10],mean=0.0,stddev=1.0),name="weight")
bias = tf.Variable(tf.constant(0.0,shape=[10]))
# 预测None个样本输出结果(matrix) [None,784] * [784,10]+ [10] = [None,10]
y_predict = tf.matmul(x,weight) + bias
# 求出所有样本损失,计算平均值
with tf.variable_scope("soft_cros"):
# 计算平均交叉熵损失
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true,logits=y_predict))
# 梯度下降求出损失
with tf.variable_scope("optimizer"):
train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
# 计算准确率
with tf.variable_scope("accuracy"):
# 进行比较
equal_list = tf.equal(tf.argmax(y_true,1),tf.argmax(y_predict,1))
# 求平均值 equal_list None个样本 类似:【1,0,1,1,1,0....,1,0】
accuracy = tf.reduce_mean(tf.cast(equal_list,tf.float32))
# 定义一个初始化变量的op
init_op = tf.global_variables_initializer()
#开启会话训练
with tf.Session() as sess:
# 初始化变量
sess.run(init_op)
# 迭代,进行训练,更新参数预测
for i in range(2000):
# 从数据中取出真实存在的特征值和目标值
mnist_x , mnist_y = mnist.train.next_batch(50)
# 进行训练
sess.run(train_op,feed_dict={
x:mnist_x,y_true:mnist_y})
print("训练第%d步,准确率为%f" % (i, sess.run(accuracy,feed_dict={
x:mnist_x,y_true:mnist_y})))
# print("训练第%d步,准确率为:%f" % (i, sess.run(accuracy, feed_dict={x: mnist_x, y_true: mnist_y})))
return None
if __name__ == "__main__":
full_connect()
因为数据太多,我们不可能在控制台打印出所有数据,所以我们只在控制台打印出准确率,其他数据通过tensorboard观察。
收集变量,并添加如下代码,在会话开启之前:
# 收集变量 单个数值收集
tf.summary.scalar("losses",loss)
tf.summary.scalar("accuracy",accuracy)
#高纬度变量收集
tf.summary.histogram("weight",weight)
tf.summary.histogram("bias",bias)
#定义一个合并变量的op
merged = tf.summary.merge_all()
并在会话中添加如下代码:
#写入每一步训练的值
summary = sess.run(merged,feed_dict={
x:mnist_x,y_true:mnist_y})
filewriter.add_summary(summary,i)
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
from tensorflow.examples.tutorials.mnist import input_data
def full_connect():
'''
利用mnist数据集,实现手写数字识别
:return: None
'''
# 获取数据
mnist = input_data.read_data_sets("./data/mnist/input_data", one_hot=True)
# 建立数据的占位符 x[None,784](特征值) y_true[None,10](目标值)
with tf.variable_scope("data"):
x = tf.placeholder(tf.float32,[None,784])
# one-hot编码类型
y_true = tf.placeholder(tf.int32,[None,10])
# 建立全连接层的神经网络 weight [784,10](权重) bias[10](偏置)
with tf.variable_scope("fc_model"):
# 随机初始化权重和偏置
weight = tf.Variable(tf.random_normal([784,10],mean=0.0,stddev=1.0),name="weight")
bias = tf.Variable(tf.constant(0.0,shape=[10]))
# 预测None个样本输出结果(matrix) [None,784] * [784,10]+ [10] = [None,10]
y_predict = tf.matmul(x,weight) + bias
# 求出所有样本损失,计算平均值
with tf.variable_scope("soft_cros"):
# 计算平均交叉熵损失
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true,logits=y_predict))
# 梯度下降求出损失
with tf.variable_scope("optimizer"):
train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
# 计算准确率
with tf.variable_scope("accuracy"):
# 进行比较
equal_list = tf.equal(tf.argmax(y_true,1),tf.argmax(y_predict,1))
# 求平均值 equal_list None个样本 类似:【1,0,1,1,1,0....,1,0】
accuracy = tf.reduce_mean(tf.cast(equal_list,tf.float32))
# 定义一个初始化变量的op
init_op = tf.global_variables_initializer()
# 收集变量 单个数值收集
tf.summary.scalar("losses",loss)
tf.summary.scalar("accuracy",accuracy)
#高纬度变量收集
tf.summary.histogram("weight",weight)
tf.summary.histogram("bias",bias)
#定义一个合并变量的op
merged = tf.summary.merge_all()
#开启会话训练
with tf.Session() as sess:
# 初始化变量
sess.run(init_op)
# 建立events文件,然后写入
filewriter = tf.summary.FileWriter("./tmp/summary/test/",graph=sess.graph)
# 迭代,进行训练,更新参数预测
for i in range(2000):
# 从数据中取出真实存在的特征值和目标值
mnist_x , mnist_y = mnist.train.next_batch(50)
# 进行训练
sess.run(train_op,feed_dict={
x:mnist_x,y_true:mnist_y})
#写入每一步训练的值
summary = sess.run(merged,feed_dict={
x:mnist_x,y_true:mnist_y})
filewriter.add_summary(summary,i)
print("训练第%d步,准确率为%f" % (i, sess.run(accuracy,feed_dict={
x:mnist_x,y_true:mnist_y})))
# print("训练第%d步,准确率为:%f" % (i, sess.run(accuracy, feed_dict={x: mnist_x, y_true: mnist_y})))
return None
if __name__ == "__main__":
full_connect()
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
from tensorflow.examples.tutorials.mnist import input_data
FLAGS = tf.app.flags.FLAGS
tf.app.flags.DEFINE_integer("is_train", 1, "指定程序是预测还是训练")
def full_connect():
'''
利用mnist数据集,实现手写数字识别
:return: None
'''
# 获取数据
mnist = input_data.read_data_sets("./tmp/data/mnist/input_data", one_hot=True)
# 建立数据的占位符 x[None,784](特征值) y_true[None,10](目标值)
with tf.variable_scope("data"):
x = tf.placeholder(tf.float32,[None,784])
# one-hot编码类型
y_true = tf.placeholder(tf.int32,[None,10])
# 建立全连接层的神经网络 weight [784,10](权重) bias[10](偏置)
with tf.variable_scope("fc_model"):
# 随机初始化权重和偏置
weight = tf.Variable(tf.random_normal([784,10],mean=0.0,stddev=1.0),name="weight")
bias = tf.Variable(tf.constant(0.0,shape=[10]))
# 预测None个样本输出结果(matrix) [None,784] * [784,10]+ [10] = [None,10]
y_predict = tf.matmul(x,weight) + bias
# 求出所有样本损失,计算平均值
with tf.variable_scope("soft_cros"):
# 计算平均交叉熵损失
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true,logits=y_predict))
# 梯度下降求出损失
with tf.variable_scope("optimizer"):
train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
# 计算准确率
with tf.variable_scope("accuracy"):
# 进行比较
equal_list = tf.equal(tf.argmax(y_true,1),tf.argmax(y_predict,1))
# 求平均值 equal_list None个样本 类似:【1,0,1,1,1,0....,1,0】
accuracy = tf.reduce_mean(tf.cast(equal_list,tf.float32))
# 定义一个初始化变量的op
init_op = tf.global_variables_initializer()
# 收集变量 单个数值收集
tf.summary.scalar("losses",loss)
tf.summary.scalar("accuracy",accuracy)
#高纬度变量收集
tf.summary.histogram("weight",weight)
tf.summary.histogram("bias",bias)
# 定义一个合并变量的op
merged = tf.summary.merge_all()
# 创建一个saver
saver = tf.train.Saver()
#开启会话训练
with tf.Session() as sess:
# 初始化变量
sess.run(init_op)
# 建立events文件,然后写入
filewriter = tf.summary.FileWriter("./tmp/summary/test/",graph=sess.graph)
if FLAGS.is_train ==1:
# 迭代,进行训练,更新参数预测
for i in range(10000):
# 从数据中取出真实存在的特征值和目标值
mnist_x, mnist_y = mnist.train.next_batch(50)
# 进行训练
sess.run(train_op, feed_dict={
x: mnist_x, y_true: mnist_y})
# 写入每一步训练的值
summary = sess.run(merged, feed_dict={
x: mnist_x, y_true: mnist_y})
filewriter.add_summary(summary, i)
print("训练第%d步,准确率为%f" % (i, sess.run(accuracy, feed_dict={
x: mnist_x, y_true: mnist_y})))
# 保存模型
saver.save(sess, "./tmp/ckpt/fe_model.ckpt")
else:
# 加载模型
saver.restore(sess, "./tmp/ckpt/fe_model.ckpt")
# 如果是0,做出预测
for i in range(100):
# 每次测试一张图片 [0,0,0,0,0,1,0,0,0,0]
x_test, y_test = mnist.test.next_batch(1)
print("第%d张图片,手写数字图片目标是:%d, 预测结果是:%d" % (
i,
tf.argmax(y_test, 1).eval(),
tf.argmax(sess.run(y_predict, feed_dict={
x: x_test, y_true: y_test}), 1).eval()
))
return None
if __name__ == "__main__":
full_connect()
先运行程序进行训练,小编这里采用if判断是进行训练还是测试。
训练完之后,输入 python xxx.py --is_train=0,进行测试