基础练习-mnist手写数据集识别

照着书实现了一下mnist手写数据集识别这个深度学习中的”hello,world”

基础概念

第一层接收输入信号,最后一层返回输出信号,这些网络通常都是前馈神经网络

传递函数:最常用的一种传递函数就是sigmoid函数,值域为(0,1)

一般情况下,前馈神经网络的最后一层会采用一个softmax函数,这样可以方便地用后验概率解释网络的输出

MNIST手写数字数据集

1
2
3
4
5
6
7
8
9
10
11
12
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.examples.tutorials.mnist import input_data
%matplotlib inline
mnist_data=input_data.read_data_sets("Data/data",one_hot=True)
print('输入数据:',mnist_data.train.images)
print('输入数据的shape',mnist_data.train.images.shape)
import pylab
im=mnist_data.train.images[1]
im=im.reshape(-1,28)
pylab.imshow(im)
pylab.show()
Extracting Data/data\train-images-idx3-ubyte.gz
Extracting Data/data\train-labels-idx1-ubyte.gz
Extracting Data/data\t10k-images-idx3-ubyte.gz
Extracting Data/data\t10k-labels-idx1-ubyte.gz
输入数据: [[0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 ...
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]]
输入数据的shape (55000, 784)

png

mnist数据集 输入图片是个550000x784的矩阵,第一个维度代表图片索引,第二个
维度代表图像像素,28x28像素的图片,共有10个类别

所以先创建一个[None,784]的占位符x和一个[None,10]的占位符y

交叉熵可在神经网络(机器学习)中作为损失函数,p表示真实标记的分布,q则为训练后的模型的预测标记分布,交叉熵损失函数可以衡量p与q的相似性。交叉熵作为损失函数还有一个好处是使用sigmoid函数在梯度下降时能避免均方误差损失函数学习速率降低的问题,因为学习速率可以被输出的误差所控制。 [

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist=input_data.read_data_sets("Data/data/",one_hot=True)
import pylab
tf.reset_default_graph()
x=tf.placeholder(tf.float32,[None,784])
y=tf.placeholder(tf.float32,[None,10])
#定义学习参数
W=tf.Variable(tf.random_normal([784,10])) #W设为随机值
b=tf.Variable(tf.zeros([10]))#b设为0
#构建模型
pred=tf.nn.softmax(tf.matmul(x,W)+b)#softmax分类
#定义反向传播结构,进行优化
#损失函数
cost=tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred),reduction_indices=1))
#定义参数
learning_rate=0.01
#使用梯度下降优化器
optimizer=tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
#开始训练模型
#定义训练迭代次数
training_epochs=25
#定义在训练过程中一次取100条数据进行训练
batch_size=100
#显示训练中间状态的间隔
display_step=1

#保存模型
saver=tf.train.Saver()
model_path="log/521model.ckpt"

#启动session
with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess:
sess.run(tf.global_variables_initializer())
#启动循环开始训练
for epoch in range(training_epochs):
avg_cost=0.0
total_batch=int(mnist.train.num_examples/batch_size)
#循环所有数据集
for i in range(total_batch):
batch_xs,batch_ys=mnist.train.next_batch(batch_size)
#运行优化器
[opti,c]=sess.run([optimizer,cost],feed_dict={x:batch_xs,y:batch_ys})
#计算平均loss值
avg_cost+=c/total_batch
#显示训练中的详细信息
if (epoch+1)%display_step==0:
print("Epoch:","%04d" % (epoch+1),"cost=","{:.9f}".format(avg_cost))
print("Finshed!")
#保存模型
save_path=saver.save(sess,model_path)
print("Model saved in file:{}".format(save_path))
if tf.test.gpu_device_name():
print('Default GPU Device:{}'.format(tf.test.gpu_device_name()))
else:
print('Please install GPU version or TF')

#读取模型并将两张图片放进去让模型预测结果


print("Starting 2nd session...")
with tf.Session() as sess:
#初始化变量
sess.run(tf.global_variables_initializer())
#恢复模型变量
saver.restore(sess,model_path)
#测试 model
correct_prediction=tf.equal(tf.arg_max(pred,1),tf.arg_max(y,1))
#计算准确率
accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
print("Accuracy:",accuracy.eval({x:mnist.test.images,y:mnist.test.labels}))
output=tf.arg_max(pred,1)
output = tf.argmax(pred, 1)
batch_xs, batch_ys = mnist.train.next_batch(2)
outputval,predv = sess.run([output,pred], feed_dict={x: batch_xs})
print(outputval,predv,batch_ys)
im = batch_xs[0]
im = im.reshape(-1,28)
pylab.imshow(im)
pylab.show()
im = batch_xs[1]
im = im.reshape(-1,28)
pylab.imshow(im)
pylab.show()
Extracting Data/data/train-images-idx3-ubyte.gz
Extracting Data/data/train-labels-idx1-ubyte.gz
Extracting Data/data/t10k-images-idx3-ubyte.gz
Extracting Data/data/t10k-labels-idx1-ubyte.gz
Epoch: 0001 cost= 8.901484704
Epoch: 0002 cost= 4.491928911
Epoch: 0003 cost= 3.105935341
Epoch: 0004 cost= 2.460903181
Epoch: 0005 cost= 2.088093793
Epoch: 0006 cost= 1.843727299
Epoch: 0007 cost= 1.670136872
Epoch: 0008 cost= 1.539499564
Epoch: 0009 cost= 1.437489002
Epoch: 0010 cost= 1.355080850
Epoch: 0011 cost= 1.287055298
Epoch: 0012 cost= 1.229517875
Epoch: 0013 cost= 1.180266858
Epoch: 0014 cost= 1.137388955
Epoch: 0015 cost= 1.099723647
Epoch: 0016 cost= 1.066415745
Epoch: 0017 cost= 1.036452132
Epoch: 0018 cost= 1.009471819
Epoch: 0019 cost= 0.985050059
Epoch: 0020 cost= 0.962679997
Epoch: 0021 cost= 0.942112822
Epoch: 0022 cost= 0.923188624
Epoch: 0023 cost= 0.905731321
Epoch: 0024 cost= 0.889469135
Epoch: 0025 cost= 0.874153477
Finshed!
Model saved in file:log/521model.ckpt
Default GPU Device:/device:GPU:0
Starting 2nd session...
INFO:tensorflow:Restoring parameters from log/521model.ckpt
Accuracy: 0.8259
[2 8] [[5.4470024e-06 1.0342207e-14 9.9999440e-01 8.0820775e-12 4.5177516e-12
  3.1603236e-16 6.3706992e-08 3.8312063e-15 7.3337933e-11 3.1762011e-18]
 [2.8309601e-04 9.6081327e-05 1.4640624e-03 3.5183481e-10 1.6233769e-03
  3.4435538e-03 1.4779908e-02 9.2782180e-08 9.7314465e-01 5.1651290e-03]] [[0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]]

png

png


基础练习-mnist手写数据集识别
https://shanhainanhua.github.io/2019/10/20/基础练习-mnist手写数据集识别/
作者
wantong
发布于
2019年10月20日
许可协议