TensorFlow&&Mnist

利用TensorFlow实现mnist数据集的分类预测,推荐使用jupyter,这应该是我目前接触到的编程体验最好的一个平台了,很考验代码编程基础,因为不会很明显的告诉你在哪出错,需要仔细去研究每一行代码,形式上和python自带的idle有点类似,但是功能却强大了很多,Markdown很实用,很适合用来做教程。

(一)获取TensorFlow自带的mnist数据集

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data',one_hot =True)
print(mnist.train.images.shape,mnist.train.labels.shape)

MNIST(Mixed National Institute of Standards and Technology database)是一个计算机视觉数据集,它包含70000张手写数字的灰度图片,其中每一张图片包含 28 X 28 个像素点。可以用一个数字数组来表示这张图片:

每一张图片都有对应的标签,也就是图片对应的数字,例如上面这张图片的标签就是 1,数据集被分成两部分:60000 行的训练数据集(mnist.train)和10000行的测试数据集(mnist.test)。其中:60000 行的训练集分拆为 55000 行的训练集和 5000 行的验证集。60000行的训练数据集是一个形状为 [60000, 784] 的张量,第一个维度数字用来索引图片,第二个维度数字用来索引每张图片中的像素点。在此张量里的每一个元素,都表示某张图片里的某个像素的强度值,值介于 0 和 1 之间。

 

60000 行的训练数据集标签是介于 0 到 9 的数字,用来描述给定图片里表示的数字。称为 "one-hot vectors"。 一个 one-hot 向量除了某一位的数字是 1 以外其余各维度数字都是 0。所以在此教程中,数字 n 将表示成一个只有在第 n 维度(从 0 开始)数字为 1 的 10 维向量。比如,标签 0 将表示成 ( [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] )。因此,其标签是一个 [60000, 10] 的数字矩阵。

(二)生成session,并利用梯度下降法做参数调整

xs=tf.placeholder(tf.float32,[None,784])
ys=tf.placeholder(tf.float32,[None,10])
Weights=tf.Variable(tf.random_normal([784,10]))
biases=tf.Variable(tf.zeros([1,10]))
y_pre=tf.nn.softmax(tf.matmul(xs,Weights)+biases)
corrt=tf.reduce_mean(-tf.reduce_sum(ys*tf.log(y_pre),reduction_indices=[1]))
train = tf.train.GradientDescentOptimizer(0.5).minimize(corrt)
init=tf.global_variables_initializer()
sess=tf.Session()
sess.run(init)
for i in range(100000):
    batch_xs,batch_ys=mnist.train.next_batch(100)
    sess.run(train,feed_dict={xs:batch_xs,ys:batch_ys})
    if i %500==0:
        print(sess.run(corrt,feed_dict={xs:batch_xs,ys:batch_ys}))

利用corrt作为参数调整的依据,将其最小化即可,调用TensorFlow自带的GradientDescentOptimizer来实现,如代码所示,将迭代次数设置为100000,并在没五百次迭代的时候输出一次corrt,如下列表所示:

13.2071
0.815156
0.429824
0.650368
0.606181
0.500842
、、、次数省略若干
0.291332
0.0838442
0.248869
0.269196
0.407901
0.267232
0.302781
0.0739179
0.120335
0.188338
0.184529
0.0621442
0.141085
0.340058
0.212902

可以看到震荡性相对较大,可以通过减少步长来减缓震荡,在实现的时候参数的初始化不是很重要,可以初始化为均匀分布的值,也可以初始化成正态分布,但是由于现实世界的一般分布都是正太分布,此处采取标准正太分布来初始化权重。

(三)输出准确率

pre=tf.equal(tf.argmax(y_pre,1),tf.argmax(ys,1))
accuracy = tf.reduce_mean(tf.cast(pre, "float"))
print(sess.run(accuracy,feed_dict={xs:mnist.test.images,ys:mnist.test.labels}))

利用mnist数据集自带的测试集来测试准确率,最终得到的正确率为92%。

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值