tensorflow使用softmax regression算法实现手写识别

Posted 需要重生的鹰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tensorflow使用softmax regression算法实现手写识别相关的知识,希望对你有一定的参考价值。

最近在学习黄文坚的TensorFlow书籍,希望对学习做一个总结。

softmax regression算法原理:当我们对一张图片进行预测时,会计算每一个数字的可能性,如3的概率是3%,5的概率是6%,1的概率是80%,则返回1.

TensorFlow版本:0.8.0

# 导入手写识别数据,TensorFlow提供了手写识别库
from
tensorflow.examples.tutorials.mnist import input_data
# 读取手写识别数据 mnist
= input_data.read_data_sets("MNIST_data/", one_hot=True)
# 训练集数据的维度是(55000,784),训练集标签的维度是(55000,10)
# 测试集数据的维度是(10000,784),测试集标签的维度是(10000,10)
# 验证集数据的维度是(5000,784),验证集标签的维度是(5000,10)
# 为什么训练数据的维度是784?因为tensorflow提供的数据集的图片像素是28*28=784
# 为什么标签的维度是10,标签做了处理,每个预期结果变成了只包含0和1的10维数据。
# 例如标签5就表示为[0,0,0,0,0,1,0,0,0,0],这种方法叫one-hot编码
print(mnist.train.images.shape,mnist.train.labels.shape) print(mnist.test.images.shape,mnist.test.labels.shape) print(mnist.validation.images.shape,mnist.validation.labels.shape)

# 导入TensorFlow库
import tensorflow as tf
# 将session注册为默认的session,运算都在session里跑。placeholder为输入数据的地方
# placeholder的第一个参数表示数据类型,第2个参数表示数据的维度,None表示任意长度的数据 sess
=tf.InteractiveSession() x = tf.placeholder(tf.float32,[None,784])
# Variable用于存储参数,它是持久化的,可以长期存在,每次迭代都会更新 # 数据的维度是784,类别的维度经过one-hot编码后变成了10维,所以W的参数为[784,10]
# b为[10]维,W和b全部初始化为0,简单模型的初始值不重要
W
= tf.Variable(tf.zeros([784,10])) b=tf.Variable(tf.zeros([10])) # softmax函数用于定义softmax regression算法
# matmul用于向量乘法
y
=tf.nn.softmax(tf.matmul(x,W)+b)
# 求损失函数cross-entropy,先定义一个placeholder,输入的真实label
# cross_entropy定义了损失函数的计算方法,通过reduce_sum求熵的和,reduce_mean求每个batch的熵的平均值 y_
=tf.placeholder(tf.float32,[None,10]) cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y),reduction_indices=[1]))
# 定义一个优化器,GradientDescentOptimizer为优化器,学习率为0.5,优化目标设定为cross_entropy train_step
= tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
# 全局参数初始化并执行run tf.initialize_all_variables().run()
# 每次取100个样本,并feed给placeholder,执行1000次,train_step对数据进行训练
for i in range(1000): batch_xs,batch_ys = mnist.train.next_batch(100) train_step.run({x:batch_xs,y_:batch_ys})
# 求出概率最大的数字,判断是否与实际标签相符合,y是预测数据,y_是实际数据 correct_prediction
= tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
# 求计算精度 accuracy
=tf.reduce_mean(tf.cast(correct_prediction,tf.float32)) print(accuracy.eval({x:mnist.test.images,y_:mnist.test.labels})

总的来说,TensorFlow感觉还是比较简单的,也许这只是个最简单的模型吧。
涉及的概念也只有session,variable,placeholder,GradientDescentOptimizer。
梯度下降等复杂的方法都进行了封装,用python不到30行的代码就实现了手写识别,虽然识别正确率只有92%左右。


 

以上是关于tensorflow使用softmax regression算法实现手写识别的主要内容,如果未能解决你的问题,请参考以下文章

TensorFlow 的 sparse_softmax_cross_entropy 中的 Logits 表示

如何在 Keras 模型中使用 TensorFlow 的采样 softmax 损失函数?

tensorflow使用softmax regression算法实现手写识别

Softmax回归(使用tensorflow)

如何在 Tensorflow 中用 Logistic 层替换 Softmax 输出层?

使用 tensorflow 进行语义分割 - 损失函数中的 ValueError (sparse-softmax)