• 利用TensorFlow识别手写的数字---基于Softmax回归


    1 MNIST数据集

    MNIST数据集主要由一些手写数字的图片和相应的标签组成,图片一共有10类,分别对应从0-9,共10个阿拉伯数字。原始的MNIST数据库一共包含下面4个文件,见下表。

    训练图像一共有60000张,供研究人员训练出合适的模型。测试图像一共有10000张,供研究人员测试训练的模型的性能。

    2 Softmax 回归

    Softmax回归是一个线性的多类分类模型,实际上它是直接从Logistic回归模型转化而来的。区别在于Logistic 回归模型为两类分类模型,而Softmax 模型为多类分类模型。

    在手写体识别问题中,一共有10个类别(0~9),我们希望对输入的图像计算它属于每个类别的概率。如属于9的概率为70%,属于1的概率为10%等。最后模型预测的结果就是概率最大的那个类别。

    先来了解什么是Softmax函数。Softmax函数的主要功能是将各个类别的“打分”转化成合理的概率值。例如,一个样本可能属于三个类别:第一个类别的打分为a,第二个类别的打分为b,第三个类别的打分为c。打分越高代表属于这个类别的概率越高,但是打分本身不代表概率,因为打分的值可以是负数,也可以很大,但概率要求值必须在0~1,并且三类的概率加起来应该等于1。那么,如何将(a,b,c)转换成合理的概率值呢?方法就是使用Softmax函数。例如,对(a,b,c)使用Softmax函数后,相应的值会变成如下所示的形式:

    这三个数值都在0~1之间,并且加起来正好等于1,是合理的概率表示。

    假设x是单个样本的特征,W、b是Softmax模型的参数。在MNIST数据集中,x就代表输入图片,它是一个784维的向量,而W是一个矩阵,它的形状为(784,10),b是一个10维的向量,10代表的是类别数。Softmax模型的第一步是通过下面的公式计算各个类别的Logit:

    Logit 同样是一个10维的向量,它实际上可以看成样本对应于各个类别的“打分”。接下来使用Softmax函数将它转换成各个类别的概率值:

    3 tensorflow 实现

    # -*- coding: utf-8 -*-
    
    import tensorflow as tf
    
    #导入mnist教学的模块
    from tensorflow.examples.tutorials.mnist import input_data
    
    #读入mnist数据
    mnist = input_data.read_data_sets("MNIST_data/",one_hot = True)
    
    #创建x,x是一个占位符,代表待识别的图片
    x = tf.placeholder(tf.float32,[None,784])
    
    # w是softmax模型的参数,将一个784的输入转换为一个10位的输出
    w = tf.Variable(tf.zeros([784,10]))
    
    # b是又一个softmax的参数,一般叫做“偏置项
    b = tf.Variable(tf.zeros([10]))
    
    # y表示模型的输出
    y = tf.nn.softmax(tf.matmul(x,w) + b)
    
    # y_是实际的图像标签,同样以占位符表示
    y_ = tf.placeholder(tf.float32,[None,10])
    
    #根据y和y_构造交叉熵
    cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y)))
    
    #有了交叉熵,就可以使用梯度下降法针对模型的参数(w和b)进行优化
    train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
    
    #创建一个Session。只有在Session中才能运行优化步骤train_step
    sess = tf.InteractiveSession()
    #运行之前必须要初始化所有的变量,分配内存
    tf.global_variables_initializer().run()
    
    # 进行1000步梯度下降
    for _ in range(1000):
        #在mnist.train中取100个训练数据
        #batch_xs是形状为(100,784)的图像数据,batch_ys是形如(100,10)的实际标签
        #batch_xs与batch_ys分别对应着x和y_两个占位符
        batch_xs,batch_ys = mnist.train.next_batch(100)
        #在Session中运行train_step,运行时要传入占位符的值
        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,tf.float32))
    #在Session中运行Tensor可以得到Tensor的值
    #这里是获取最终模型的准确率
    print(sess.run(accuracy,feed_dict={x:mnist.test.images,y_:mnist.test.labels}))
    

    注:

  • 相关阅读:
    图片尺寸批量resize的matlab并行代码
    Java使用QRCode.jar生成与解析二维码
    MySQL求两表的差集(非交集)
    sql笔记
    Oracle创建表空间创建用户授权
    身份证前6位地址码+码表+MySQL
    Jenkins时区设置为北京时间
    Oracle 使用MERGE INTO 语句 一条语句搞定新增编辑
    Oracle dd-m月-yy转yyyy-mm-dd
    docker 使用笔记
  • 原文地址:https://www.cnblogs.com/Terrypython/p/10805885.html
Copyright © 2020-2023  润新知