• TensorFlow入门(十九、softmax算法处理分类问题)


    softmax是什么?

            Sigmoid、Tanh、ReLU等激活函数,输出值只有两种(0、1,或-1、1或0、x),而实际现实生活中往往需要对某一问题进行多种分类。例如之前识别图片中模糊手写数字的例子,这个时候就需要使用softmax算法。

    softmax的算法逻辑

             如果判断输入属于某一个类的概率大于属于其他类的概率,那么这个类对应的值就逼近于1,其他类的值就逼近于0。它能将一个含任意实数的K维向量"压缩"到另一个K维向量中,使得每一个元素的范围都在0~1之间,并且使所有元素的和为1。同时,它可以将分类结果归一化,形成一个概率分布。

            softmax算法主要应用于多分类,而且是互斥的,即只能属于其中的一个类。而像Sigmoid这些一般的激活函数只能分两类,因此可以把softmax理解为是Sigmoid类的激活函数的扩展。

            其算法公式:

                    即把所有值用e的n次方计算出来,求和后算每个值占的比率,保证总和为1,一般就可以认为softmax得出的就是概率。这里的exp(logits)指的就是e^logits。

                    注意 : 对于要生成的多个类任务中不是互斥关系的任务,一般会使用多个二分类来组成。

    softmax的原理

            以下为一个简单的softmax网络模型图:

                    

            如图所示,输入的是x1和x2,识别输出的为y1、y2和y3三个类。

            对于属于y1类的概率,可以转化成输入x1满足某个条件的概率,与x2满足某个条件的概率的乘积,即y1 = (x1*w11)*(x2*w12)。在网络模型里把等式两边都取ln,ln后的属于y1类的概率就可以转化成,ln后的x1满足某个条件的概率加上ln后的x2满足某个条件的概率,即y1 = x1*w11+x2*w12等于ln后y1的概率。这也是softmax公式中要进行一次e的logits次方的原因。

            注意 : 等式两边取ln是神经网络中常用的技巧,主要用来将概率的乘法转变成加法,即ln(x*y) = lnx + lny。然后在后续计算中再将其转为e的x次方,还原成原来的值。

            举例 : 

                    假设三个数值A=5,B=1,C=-1,那么他们的softmax占比为:

                            P(A)=(e^5)/(e^5 + e + e^-1)

                            P(B)=(e^1)/(e^5 + e + e^-1)

                            P(C)=(e^-1)/(e^5 + e + e^-1)

                    计算结果为 : P(A) = 0.9817        P(B) = 0.0180        P(C) = 0.0003

                                         P(A) + P(B) + P(C) = 1

                    因为P(A)值最大,因此取最大的值A为最终的分类。

    softmax的一些特性

            ①归一化 : 每一个分类的概率之和为1,每一个分类都是一个小于1的数值。

            ②具有放大效果,比如上面例子中单纯从数值来看,5和1的差距并不大,但是通过指数运算后有明显的放大效果,5的占比能到98%以上。

            ③具有散列性质,每一个比率虽然最后都会进行归一化,但是他们放大之前的数值是可以相互不干扰的。

            基于上述这些特征,softmax在机器学习中的应用非常广泛,比如之前识别MNIST中每张图片中的数字是哪一个数字,就是一个使用softmax回归(softmax regression)模型的经典案例。

            注意 : 在实际使用中,softmax伴随的分类标签都为one_hot编码,而且这里还有个技巧,在softmax时需要将目标分成几类,就在最后这层放几个节点。

    常用的分类函数

            TensorFlow中常用的分类函数主要有两个:

                    ①tf.nn.softmax(logits,axis = None,name = None)

                            tf.nn.softmax函数最终返回的是一个tensor,与参数logits具有相同的类型和shape,这个tensor代表向量各个位置的得分(即概率)。所以通过tf.nn.softmax函数将logistic的预测二分类的概率的问题推广到了n分类的概率的问题。

                    ②tf.nn.log_softmax(logits,axis = None,name = None)

                            tf.nn.log_softmax函数是对tf.nn.softmax函数的结果取对数,即把softmax函数的结果再进行log计算一遍。使用它可以使得计算速度变快,数据更加稳定。同时,也可以直接用于计算softmax的交叉熵loss。

            每个参数的意义如下:

                    logits代表一个非空的tensor。类型必须是float32或float64

                    axis表示在哪个维度上执行softmax计算。默认值为-1,表示最后一个维度

                    name为操作的名称

    如何使用softmax函数

            示例代码如下:

    1. import tensorflow as tf
    2. var = tf.constant([2,3,6,10,4,5,1],dtype = tf.float32)
    3. pr = tf.nn.softmax(var)
    4. print(pr)
    5. #tf.argmax()函数用于找到张量(Tensor)中指定维度上的最大值的索引。它返回的是最大值所在位置的索引值
    6. print(tf.argmax(pr))

  • 相关阅读:
    RK主机 CPU、NPU使用频率查看和设置
    软件著作权在哪里查?
    HK32F030MF4P6 实现PAout(xx)/PAin(xx)
    Spring MVC使用SessionLocaleResolver实现用户自定义切换语言实例
    MATLAB 边界点排序(最近邻域搜索算法)
    网课查题公众号如何搭建查题系统
    轻松掌握线性代数-万字长文基础知识概览
    GitLab在YugabyteDB和TiDB For PostgreSQL上的兼容性对比
    如何打开html格式文件?Win11打开html文件的方法
    HDU-3549 Flow Problem 简单最大流
  • 原文地址:https://blog.csdn.net/Victor_Li_/article/details/133768387