一、 MNIST数据集简介
MNIST数据集官网:http://yann.lecun.com/exdb/mnist/
二、 神经网络构建
由于每张图片的像素个数为784,所以,输入层为784,先设计一个一层网络,0-9共有10个分类,所以,输出层有10个神经元,网络结构如下:
MNIST的结果是0-9,假设我们的模型推测出一张图片是数字9的概率是80%,是数字8的概率是10% ,然后其他数字的概率更小,总体概率加起来等于1。这是一个使用softmax回归模型的经典案例。softmax模型可以用来给不同的对象分配概率。其公式如下:
三、 代码
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data", one_hot=True) # 载入数据
batch_size = 100 # 每个批次大小
n_batch = mnist.train.num_examples // batch_size # 批次数目
x = tf.placeholder(tf.float32, [None, 784]) # 输入,输出占位符
y = tf.placeholder(tf.float32, [None, 10])
# 创建一个简单的神经网络
w = tf.Variable(tf.zeros([784, 10])) # 输入784,输出10
b = tf.Variable(tf.zeros([10]))
prediction = tf.nn.softmax(tf.matmul(x, w)+b) # 将数值转换成预测概率
loss = tf.reduce_mean(tf.square(y - prediction)) # 求预测平均误差
train_step = tf.train.GradientDescentOptimizer(0.3).minimize(loss) # 梯度下降法使误差减小,学习率为0.3
init = tf.global_variables_initializer() # 变量初始化
correct_prediction = tf.equal(tf.arg_max(y, 1), tf.arg_max(prediction, 1))
# arg_max返回一维张量中最大值所在位置,将预测值与真实值用equal进行是否相等判断,结果为True False
accuary = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
# cast将correct_prediction中数据转化为float型,并求均值,计算正确度
with tf.Session() as sess:
sess.run(init)
for epoch in range(20): # 共训练20次
for batch in range(n_batch): # 训练一次,进行的次数
batch_x, batch_y = mnist.train.next_batch(batch_size) # 取出待训练数字 batch_x为图像,batch_y为标签
sess.run(train_step, feed_dict={x: batch_x, y: batch_y}) # 进行训练
acc = sess.run(accuary, feed_dict={x: mnist.test.images, y: mnist.test.labels}) # 计算准确率
print("Iter" + str(epoch) + ",acc" + str(acc))
运行结果:
Iter0,acc0.858
Iter1,acc0.8822
Iter2,acc0.8926
Iter3,acc0.8958
Iter4,acc0.8997
Iter5,acc0.9035
Iter6,acc0.9057
Iter7,acc0.9077
Iter8,acc0.9093
Iter9,acc0.9101
Iter10,acc0.9115
Iter11,acc0.912
Iter12,acc0.9127
Iter13,acc0.9141
Iter14,acc0.9152
Iter15,acc0.9153
Iter16,acc0.9166
Iter17,acc0.9173
Iter18,acc0.9174
Iter19,acc0.9173
由运行结果可得,训练20次后,准确度达到了91.73%,这只是一个单层的网络!