上一篇文章是使用了神经网络实现手写数字识别,在这里,我们使用tensorflow的softmax这个模块实现手写数字识别
首先先上代码
import numpy as np
import tensorflow as tf
#2.0的tensorflow没有placeholder板块,只有把2.0的版本降低到1.0的版本,才可以使用placeholder,此处为降低版本的代码
tf = tf.compat.v1
tf.disable_v2_behavior()
from tensorflow.examples.tutorials.mnist import input_data
n_input=28*28
n_class=10
X=tf.placeholder(tf.float32,shape=(None,n_input))
w=tf.Variable(tf.zeros([n_input,10]))
y=tf.placeholder(tf.int64,shape=(None,n_class))
y_pred=tf.matmul(X,w)
cross_entropy=tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=y_pred)
loss=tf.reduce_mean(cross_entropy)
optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.01)
train_op=optimizer.minimize(loss)
correct_mask=tf.equal(tf.argmax(y,1),tf.argmax(y_pred,1))
accuracy_score=tf.reduce_mean(tf.cast(correct_mask,tf.float32))
with tf.Session() as sess:
tf.global_variables_initializer().run()
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
X_train,y_train=mnist.train.images,mnist.train.labels
X_test,y_test=mnist.test.images,mnist.test.labels
for i in range (50000):
i=np.random.randint(0,len(X_train))
X_i=X_train[i].reshape(1,-1)
y_i=y_train[i].reshape(1,-1)
sess.run(train_op,feed_dict={X:X_i,y:y_i})
accuracy=accuracy_score.eval(feed_dict={X:X_test,y:y_test})
print("accuracy={}".format(accuracy))
在这段代码里面,我们对其中每一行的意思做一个简要的分析
导入库和初始化变量就不说了
X=tf.placeholder(tf.float32,shape=(None,n_input))
y=tf.placeholder(tf.int64,shape=(None,n_class))
w=tf.Variable(tf.zeros([n_input,10]))
y_pred=tf.matmul(X,w)
placeholder:占位符 Variable:变量
变量是由计算所操控的对象,占位符是触发该计算时所需要的对象
matmul():矩阵相乘
cross_entropy=tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=y_pred)
loss=tf.reduce_mean(cross_entropy)
optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.01)
train_op=optimizer.minimize(loss)
第一行:计算交叉熵
第二行:将交叉熵的平均值作为损失函数
第三行:定义学习率为0.01的梯度下降算子
第四行:定义梯度下降操作(最小化均方误差)
correct_mask=tf.equal(tf.argmax(y,1),tf.argmax(y_pred,1))
accuracy_score=tf.reduce_mean(tf.cast(correct_mask,tf.float32))
这一段代码主要是对图进行计算
第一行:用最大概率分类函数判断是否预测正确
第二行:计算准确率
(其中的cast函数是进行类型转换 ,我们可以输出一下上下的类型
print(correct_mask.dtype)
print(accuracy_score.dtype)
发现,运行结果为:
因此,上下两行进行了从布尔类型到浮点类型的类型转换
with tf.Session() as sess:
tf.global_variables_initializer().run()
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
X_train,y_train=mnist.train.images,mnist.train.labels
X_test,y_test=mnist.test.images,mnist.test.labels
for i in range (50000):
i=np.random.randint(0,len(X_train))
X_i=X_train[i].reshape(1,-1)
y_i=y_train[i].reshape(1,-1)
sess.run(train_op,feed_dict={X:X_i,y:y_i})
accuracy=accuracy_score.eval(feed_dict={X:X_test,y:y_test})
print("accuracy={}".format(accuracy))
这一段代码主要是开始训练,首先是计算图的开始,初始化所有参数,其次进行读数据,注意:第一个位置是将数据下载到这个文件夹中,并且这个文件夹就在python所放置的位置。
for循环中主要是实现了随机梯度下降算法,进行训练
最后,还需要计算准确率,准确率计算方式除了上述以外,还可以使用一下方式
ans=sess.run(accuracy_score,feed_dict={X:X_test,y:y_test})
参考文献:《TensorFlow学习指南》-Tom Hope