基于tensorflow-神经网络MNIST数据集分类

MNIST数据集下载的官网:Yann LeCun’s website。
MNIST下载下来的数据集被分成两部分:60000行的训练数据集(mnist.train)和10000行的测试数据集(mnist.test),每一张图片都包含2828个像素,把这一个数组展开成一个向量,长度是2828=784。在MNIST训练数据集中mnist.train.images是一个形状为[60000,784]的张量,第一个维度数字用来索引图片,第二个维度数字用来索引每张图片中的像素点。图片中的某个像素的强度介于0-1之间。如:
基于tensorflow-神经网络MNIST数据集分类_第1张图片
MNIST数据集的标签是介于0-9的数字,我们要把标签转化为"one-hot vectors".一个one-hot向量除了某一个数字是1以外,其余维度的数字都是0,比如标签0将表示为([1,0,0,0,0,0,0,0,0,0]),标签3将表示为([0,0,0,1,0,0,0,0,0,0])。因此,mnist.train.labels是一个[60000,10]的数字矩阵。MNIST的结果是0-9,模型1推测出一张图片是数字9的概率为80%,是数字8的概率为10%,其他数字的概率会更小,总体概率加起来等于1,这是一个使用softmax回归模型的经典案例,softmax模型可以用来给不同的对象分配概率:
在这里插入图片描述
接下来做MNIST手写数字识别

#导入相关的库
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

#定义两个Placeholder
x=tf.placeholder(tf.float32,[None,784])
y=tf.placeholder(tf.float32,[None,10])

#创建一个简单的神经网络
W=tf.Variable(tf.zeros([784,10]))    #权值
b=tf.Variable(tf.zeros([10]))       #偏置值
prediction=tf.nn.softmax(tf.matmul(x,W)+b)

#交叉熵函数
loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction))
#使用梯度下降法(可使用其他的优化方法提高准确率)
train_step=tf.train.GradientDescentOptimizer(0.2).minimize(loss)

init=tf.global_variables_initializer()
#结果存放在一个布尔型列表中
correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))   #argmax返回一维张量中最大的值所在的位置
#求准确率
accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

with tf.Session() as sess:
    sess.run(init)
    for epoch in range(21):
        for batch in range(n_batch):
            batch_xs,batch_ys=mnist.train.next_batch(batch_size)
            sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys})
        acc=sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels})
        print("Iter"+str(epoch)+",Testing Accuracy"+str(acc))

运行结果:
基于tensorflow-神经网络MNIST数据集分类_第2张图片

你可能感兴趣的:(笔记)