手写数字识别(1)

数据库下载地址:mnist.pkl.gz

先来用一个神经网络

import tensorflow as tf
import numpy as np

from tensorflow.examples.tutorials.mnist import input_data
mnist=input_data.read_data_sets('MNIST_data/',one_hot=True)

X=tf.placeholder(tf.float32,[None,784])#输入占位符(每张手写数字784个像素点)
#placeholder(type,strucuct…)第一个参数是你要保存的数据的数据类型,大多数是tensorflow中的float32数据类型,后面的参数就是要保存数据的结构,

# 计算分类softmax会将xW+b分成10类,对应0-9
W=tf.Variable(tf.zeros([784,10])) #权重
#tf.Variable()返回一个tf.Variable类的实例。zeros初始值 。
b=tf.Variable(tf.zeros([10]))#偏置
init=tf.global_variables_initializer()#初始化 tf.initialize_all_variables()

Y=tf.nn.softmax(tf.matmul(tf.reshape(X,[-1,784]),W)+b)# 输入矩阵x与权重矩阵W相乘,加上偏置矩阵b,然后求softmax(sigmoid函数升级版,可以分成多类)
#tf.matmul实现了矩阵乘法的功能。

Y_=tf.placeholder(tf.float32,[None,10])#输入占位符(这张手写数字具体代表的值,0-9对应矩阵的10个位置)

cross_entropy=-tf.reduce_sum(Y_*tf.log(Y))# 计算偏差和
# 使用梯度下降法(步长0.01),来使偏差和最小
is_correct=tf.equal(tf.argmax(Y,1),tf.argmax(Y_,1))
#argmax( input, axis=None, name=None, dimension=None )
#argmax返回的是索引值,返回每一行或者每一列的最大值的索引,当选择axis=1时。表示每一行的最大值,0表示每列的最大值索引
accuracy=tf.reduce_mean(tf.cast(is_correct,tf.float32))
#求平均值tf.reduce_mean(input_tensor, reduction_indices=None, keep_dims=False, name=None)
#input_tensor:待求值的tensor。
#reduction_indices:在哪一维上求解。如果不指定第二个参数,那么就在所有的元素中取平均值
# 为0,则第一维的元素取平均值,即每一列求平均值。为1,则第二维的元素取平均值,即每一行求平均值

optimizer=tf.train.GradientDescentOptimizer(0.003)
train_step=optimizer.minimize(cross_entropy)
#最速下降法让交叉熵下降,步长为0.003. 返回的train_step操作对象,在运行时会使用梯度下降来更新参数。因此,整个模型的训练可以通过反复地运行train_step来完成。

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

for i in range(1000): #训练1000次
   batch_x,batch_y=mnist.train.next_batch(100)# 随机取100个手写数字图片
   train_data={ X:batch_x,Y_:batch_y}

   sess.run(train_step,feed_dict=train_data)# 执行梯度下降算法,输入值X:batch_x,输入值Y:batch_y

print(sess.run(accuracy, feed_dict={X: mnist.test.images, Y_: mnist.test.labels})) #运行精度图,X和Y_从测试手写图片中取值

猜你喜欢

转载自blog.csdn.net/qq_32841011/article/details/79058716
今日推荐