Softmax用于手写数字识别(Tensorflow实现)-个人理解
程序员文章站
2022-03-07 16:03:25
softmax函数的作用 对于分类方面,softmax函数的作用是从样本值计算得到该样本属于各个类别的概率大小。例如手写数字识别,softmax模型从给定的手写体图片像素值得出这张图片为数字0~9的概率值,这些概率值之和为1。预测的结果取最大的概率表示的数字作为这张图片的分类。 可以从下面这张图理解 ......
softmax函数的作用
对于分类方面,softmax函数的作用是从样本值计算得到该样本属于各个类别的概率大小。例如手写数字识别,softmax模型从给定的手写体图片像素值得出这张图片为数字0~9的概率值,这些概率值之和为1。预测的结果取最大的概率表示的数字作为这张图片的分类。
\[ \left[\begin{matrix}temp_1\\temp_2\\temp_3\end{matrix}\right] =\left(\begin{matrix}w_{1,1}x_1+w_{1,2}x_2+w_{1,3}x_3+b_1\\ w_{2,1}x_1+w_{2,2}x_2+w_{2,3}x_3+b_2\\ w_{3,1}x_1+w_{3,2}x_2+w_{3,3}x_3+b_3\end{matrix}\right)\\ \left[\begin{matrix}y_1\\y_2\\y_3\end{matrix}\right] =softmax\left(\begin{matrix}temp_1\\ temp_2\\ temp_3\end{matrix}\right)\\ 其中y_i = softmax(temp_i) = \frac{exp(temp_i)}{\sum_{j=0}^{n}exp(temp_j)}\\ y_1,y_2,y_3分别表示该样本属于类别1,2,3的概率值。 \]
在神经网络中,通过训练集训练模型中的权重值w和偏置值b,来提高分类的准确性。
(训练方法是定义一个损失函数(代表预测值与真实值之间的差异),然后采用梯度下降法(通过对w,b求偏导)来最小化这个损失函数,具体过程有点复杂,下面只是直接拿tensorflow的函数来实现,后面有空的话再来补充原理)
用tensorflow实现手写数字识别
首先从tensorflow导入mnist数据集,里面包含了手写数字图片的像素矩阵,以及这些图片所对应的数字类别:
import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("mnist_data/", one_hot=true)
说明一下图片的像素矩阵是将28x28压平为[1x784]大小的向量;标签是[1x10]的向量,其中某一个数是1,其余全为0,比如说如果标签表示的是数字5,那么这个标签向量为[0,0,0,0,1,0,0,0,0,0]。
构建模型:
x = tf.placeholder("float",[none,784]) #一个二维向量的占位符,none表示第一位可以是任意长度,784表示一张图片压平后的长度 w = tf.variable(tf.zeros([784,10])) b = tf.variable(tf.zeros([10])) #temp = x*w + b #softmax(temp)得到一个[none,10]的向量,表示none个图片可能代表0~9的概率。 y = tf.nn.softmax(tf.matmul(x,w)+b)
构建模型训练过程:定义损失函数,最小化这个损失函数,从而得到w,b
y_ = tf.placeholder("float",[none,10]) #这里用占位符来代表y_(每个图片的真实类别),后面运行时会将真实类别填给占位符。 cross_entropy = -tf.reduce_sum(y_*tf.log(y)) #y是模型的预测类别,y_是真实类别,用交叉熵来代表损失函数(说明预测值和真实值之间的差异) train_step = tf.train.gradientdescentoptimizer(0.01).minimize(cross_entropy) #用梯度下降法来最小化损失函数
运行之前构造的模型:
init = tf.initialize_all_variables()#init表示初始化所有变量 sess = tf.session()#启动会话,用于运行模型 sess.run(init)#运行init才真正的使所有变量初始化 for i in range(1000):#训练模型1000遍 batch_xs,batch_ys = mnist.train.next_batch(100) #从数据集中取出100个样本 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")) #tf.cast将bool型转化为float型,reduce_mean计算平均值(即正确率) print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels})) #将测试集填入之前的占位符,运行之前的模型,得到正确率
输出结果为:0.9181
总结
tensorflow让用户先从更大的层面上构建模型,其中需要的数据先由占位符代替,然后在运行模型时再填入对应的数据。用户不需要对具体运算过程一步步编程实现,使得神经网络的构建简便了许多。
正在学习tensorflows时写的笔记,欢迎评论探讨!
参考网址:
推荐阅读
-
python tensorflow基于cnn实现手写数字识别
-
手写数字识别 ----Softmax回归模型官方案例注释(基于Tensorflow,Python)
-
Python(TensorFlow框架)实现手写数字识别系统的方法
-
tensorflow实现MNIST手写数字识别
-
利用tensorflow实现MNIST手写数字识别(单层神经网络)
-
基于Tensorflow, OpenCV. 使用MNIST数据集训练卷积神经网络模型,用于手写数字识别
-
Softmax用于手写数字识别(Tensorflow实现)-个人理解
-
TensorFlow教程Softmax逻辑回归识别手写数字MNIST数据集
-
tensorflow实战第三章——用Softmax Regression识别手写数字
-
学习笔记TF024:TensorFlow实现Softmax Regression(回归)识别手写数字