您的位置:首页 > 编程语言

TensorFlow手写字识别mnist入门篇(代码及详解)

2018-03-18 12:35 393 查看
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('/2017/python/',one_hot=True)

x = tf.placeholder("float",[None,784])
#先占个位,占个tensor,等着喂图片数据
#X的行可以任意取值,表示图片数量,可以1张1张取,也可100张100张取,很显然,每次取100张效率高一些

W = tf.Variable(tf.zeros([784,10]))#权重参数
#每一列784个像素点,共10列,每一列代表0~9数字,每一列的W1~W784像素点分别用于表示每个像素点对应该数字的权重值Weight,即每个数字都有784个权重值
b = tf.Variable(tf.zeros([10]))#每个数字对应的一个偏置值bias

y = tf.nn.softmax(tf.matmul(x,W)+b)#softmax函数将算出的10个数转换成每个数字的概率值,总和为1,即最后那个概率值高,即为该数字(我理解就是归一化)
#softmax概率化函数

y_ = tf.placeholder("float",[None,10])#占个tensor,等着喂数据,图片的label
#如果是数字1,y_=[0,1,0,0,0,0,0,0,0,0],one-hot vector

#交叉熵,衡量预测的标签y与真是标签y_的关系,描述真相的低效性
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
#因为本次学习,是以100张图片为一个batch,所以这里描述的是每100张图片预测性能的总和

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
#最核心的一个步骤,这里选取了梯度下降优化器,目标是将交叉熵最小化
#可以选择很多种优化器

init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)

#argmax函数,argmax(input,axis,name,dimension)
#axis=0按列fetch最大值下标向量(=1按行),dimension功能与其相同,以axis优先

#equal函数,两个矩阵对应值相同,则返回布尔型True,否则返回布尔型False,返回与第一个矩阵维度相同
#这里返回预测数字标签和真实数字标签的对比情况

#cast函数,类型转换,cast(input,dtype,name),将输入数据转换成目标类型数据

#reduce_mean()函数,求平均值,这里相当于求分类的正确率
#每训练50次,对测试数据进行预测一次
for i in range(1000):
    batch_xs,batch_ys = mnist.train.next_batch(100)#每次fetch100张图片
    sess.run(train_step,feed_dict={x : batch_xs,y_ : batch_ys})
    correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(y_,1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction,"float"))
    if i%50==0:
        print(i,sess.run(accuracy,feed_dict={x:mnist.test.images,y_:mnist.test.labels})) 

最后的准确率91%

        
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  TensorFlow