手写数字识别问题——softmax的TensorFlow实现

上一篇文章是使用了神经网络实现手写数字识别,在这里,我们使用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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值