使用mnist数据集实现手写数字识别

    mnist数据集中数字是0到9,要求实现多分类,需要使用softmax函数。此次实现单隐层神经网络即只有一个输入层和一个输出层的神经网络来训练并实现手写数字识别。

    softmax只作用在输出层,要求输出层输出一个1*10维的向量,向量中每一个元素的位置代表相应的0到9数字,而元素值代表是该数字的概率。

    实现手写数字识别分为两步,第一步是建立神经网络模型,第二步是运行该模型。

    mnist中图片是28*28维的,展开来就是784个特征值,mnist.train.images()得到的是60000*784维的向量,由于使用随机梯度下降来实现反向传播,所以需要将每一次回归的输入向量是None*784维的向量,而参数w和b,使用0来初始化。每一次的回归运算都会得到更新过后的参数,在进行了N次回归即N次训练之后,得到了最新的参数,再根据最新的参数来输入测试集的所有数据来进行测试并计算正确率。

from tensorflow.examples.tutorials.mnist import input_data
mnist=input_data.read_data_sets('./MNIST_data/',one_hot=True)
import tensorflow as tf
X=tf.placeholder("float",[None,784])
W=tf.Variable(tf.zeros([784,10]))
b=tf.Variable(tf.zeros([10]))
y_hat=tf.nn.softmax(tf.matmul(X,W)+b)
y=tf.placeholder("float",[None,10])
loss=-tf.reduce_sum(y*tf.log(y_hat))
train=tf.train.GradientDescentOptimizer(0.01).minimize(loss)
init=tf.initialize_all_variables()
session=tf.Session()
session.run(init)
for i in range(1000):
    batch_xs,batch_ys=mnist.train.next_batch(100)
    session.run(train,feed_dict={X:batch_xs,y:batch_ys})
prediction=tf.equal(tf.argmax(y,1),tf.argmax(y_hat,1))
accuracy=tf.reduce_mean(tf.cast(prediction,"float"))
print(session.run(accuracy,feed_dict={X:mnist.test.images,y:mnist.test.labels}))
    其中,用于代表将数据集喂入神经网络的变量使用placeholder来进行占位,而需要被训练的参数使用Variable可变张量来初始化,
inti=tf.initialize_all_variables()
session=tf.Session()
session.run(init)
    上面这段代码的意思是tensorflow必须的,因为tensorflow是用计算图来运算的,需要一个源op,tensorflow有一个默认源op,tf.Session()就是得到了这个默认的源op,其中run(init)就是来进行初始化计算图。

猜你喜欢

转载自blog.csdn.net/qq_26593465/article/details/81028321