softmax函数的作用

  对于分类方面,softmax函数的作用是从样本值计算得到该样本属于各个类别的概率大小。例如手写数字识别,softmax模型从给定的手写体图片像素值得出这张图片为数字0~9的概率值,这些概率值之和为1。预测的结果取最大的概率表示的数字作为这张图片的分类。

可以从下面这张图理解softmax

x1,x2,x3代表输入的值,b1,b2,b3代表类别1,2,3的偏置量,是因为输入的值可能存在无关的干扰量。
将上图写成等式
$$
\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时写的笔记,欢迎评论探讨!

参考网址:tensorflow中文社区

Softmax用于手写数字识别(Tensorflow实现)-个人理解的更多相关文章

  1. Mnist手写数字识别 Tensorflow

    Mnist手写数字识别 Tensorflow 任务目标 了解mnist数据集 搭建和测试模型 编辑环境 操作系统:Win10 python版本:3.6 集成开发环境:pycharm tensorflo ...

  2. MNIST手写数字识别 Tensorflow实现

    def conv2d(x, W): return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME') 1. strides在官方定义中是一 ...

  3. 基于多层感知机的手写数字识别(Tensorflow实现)

    import numpy as np import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_dat ...

  4. 手写数字识别 ----Softmax回归模型官方案例注释(基于Tensorflow,Python)

    # 手写数字识别 ----Softmax回归模型 # regression import os import tensorflow as tf from tensorflow.examples.tut ...

  5. Android+TensorFlow+CNN+MNIST 手写数字识别实现

    Android+TensorFlow+CNN+MNIST 手写数字识别实现 SkySeraph 2018 Email:skyseraph00#163.com 更多精彩请直接访问SkySeraph个人站 ...

  6. 手写数字识别 ----在已经训练好的数据上根据28*28的图片获取识别概率(基于Tensorflow,Python)

    通过: 手写数字识别  ----卷积神经网络模型官方案例详解(基于Tensorflow,Python) 手写数字识别  ----Softmax回归模型官方案例详解(基于Tensorflow,Pytho ...

  7. 手写数字识别 ----卷积神经网络模型官方案例注释(基于Tensorflow,Python)

    # 手写数字识别 ----卷积神经网络模型 import os import tensorflow as tf #部分注释来源于 # http://www.cnblogs.com/rgvb178/p/ ...

  8. 第三节,TensorFlow 使用CNN实现手写数字识别(卷积函数tf.nn.convd介绍)

    上一节,我们已经讲解了使用全连接网络实现手写数字识别,其正确率大概能达到98%,这一节我们使用卷积神经网络来实现手写数字识别, 其准确率可以超过99%,程序主要包括以下几块内容 [1]: 导入数据,即 ...

  9. 第二节,TensorFlow 使用前馈神经网络实现手写数字识别

    一 感知器 感知器学习笔记:https://blog.csdn.net/liyuanbhu/article/details/51622695 感知器(Perceptron)是二分类的线性分类模型,其输 ...

随机推荐

  1. 洛谷 题解 P5015 【标题统计】 NOIP2018 普及组 T1

    没有人用 scanf("%c", &ch) != EOF 吗? scanf 和 EOF 会伤心的. 思路:逐个读入字符,遇到EOF中止,对于每个读入的字符进行判断. 附上考 ...

  2. protobuf-rpm

    ############################################################## # http://www.rpm.org/max-rpm/ch-rpm-i ...

  3. Linux搭建Java环境(JDK+Tomcat+MySQL)

    目录 一.项目环境: 二.安装JDK1.8 三.安装Tomcat8.5 四.安装MySQL数据库 五.配置JAVA项目 一.项目环境: 开发环境 生产环境 测试环境 硬件环境: web服务器:cpu: ...

  4. Js 与浮点数

    同步发表在我的博客:jmingzi 当你学习一个知识点没有方向时,可以尝试以解决问题的角度来理解它. 例如这个知识点我们可以从以下问题开始: 你看的到 1 真的是整数 1 吗? 为什么0.1 + 0. ...

  5. ETL子系统

    最近在看<Pentaho Kettle 解决方案>,看到 ETL子系统,发现信息量比较大,用简短的语句做一下笔记. ETL子系统有34种子系统,被分成4个部分:抽取.清洗和更正.发布.管理 ...

  6. Nginx在开发中常用的基础命令

    场景 Ubuntu Server 16.04 LTS上怎样安装下载安装Nginx并启动: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/detai ...

  7. 加快C++代码的编译速度方法【转载】

    C++代码一直以其运行时的高性能高调面对世人, 但是说起编译速度,却只有低调的份了.比如我现在工作的源代码,哪怕使用Incredibuild调动近百台机子,一个完整的build也需要四个小时,恐怖!! ...

  8. Spring Boot 静态资源能加载css 不能加载js

    Spring Boot 配置拦截器的时候默认 是放行 静态资源 , 也就是说不需要进行配置 registry.addResourceHandler("/**") .addResou ...

  9. (一)初识NumPy库(数组的创建和变换)

    在学习数据分析时,NumPy作为最基础的数据分析库,我们能够熟练的掌握它是学习数据分析的必要条件.接下来就让我们学习该库吧. 学习NumPy库的环境: python:3.6.6 编辑器:pycharm ...

  10. 数据安全管理:RSA加密算法,签名验签流程详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.RSA算法简介 1.加密解密 RSA加密是一种非对称加密,在公开密钥加密和电子商业中RSA被广泛使用.可以在不直接传递密钥的情况下,完成加 ...