详解sigmoid与softmax, 多分类及多标签分类
激活函数介绍
对于熟悉机器学习或神经网络的读者来说,sigmoid与softmax两个激活函数并不陌生,但这两个激活函数在逻辑回归中应用,也是面试和笔试会问到的一些内容,掌握好这两个激活函数及其衍生的能力是很基础且重要的,下面为大家介绍下这两类激活函数。
sigmoid激活函数
从函数定义上来看,sigmoid激活函数的定义域能够取任何范围的实数,而返回的输出值在0到1的范围内。sigmoid函数也被称为S型函数,这是由于其函数曲线类似于S型,在下面的内容中可以看到。此外,该函数曲线也可以用于统计中,使用的是累积分布函数。
sigmoid激活函数的性质
- x: 输入
- float:表示浮点型数据
- exp:对其求指数
- f(x): 函数输出
从上述函数可以看到,x的取值范围可以是全实数,sigmoid函数返回一个实数值输出,此外,sigmoid函数的一阶导数是非负或非正:
- 非负: 如果输入数字大于或等于零;
- 非正: 如果输入数字小于或等于零;
sigmoid激活函数的使用
- Sigmoid函数用于逻辑回归模型中的二进制分类。
- 在创建人造神经元时,Sigmoid函数用作激活函数。
- 在统计学中,S形函数图像是常见的累积分布函数。
sigmoid激活函数python实现并画图
实现代码
# Required Python Package import numpy as np def sigmoid(inputs): """ Calculate the sigmoid for the give inputs (array) :param inputs: :return: """ sigmoid_scores = [1 / float(1 + np.exp(- x)) for x in inputs] return sigmoid_scores sigmoid_inputs = [2, 3, 5, 6] print "Sigmoid Function Output :: {}".format(sigmoid(sigmoid_inputs))
Sigmoid Function Output :: [0.78823, 0.24334, 0.57153, 0.33653]
画图
现在使用上面的函数来创建图像,以方便了解Sigmoid函数的性质。传递一个包含0到21范围内的数字的列表,计算输入列表的sigmoid分数,然后使用输出值来显示图像。
# Required Python Packages import numpy as np import matplotlib.pyplot as plt def sigmoid(inputs): """ Calculate the sigmoid for the give inputs (array) :param inputs: :return: """ sigmoid_scores = [1 / float(1 + np.exp(- x)) for x in inputs] return sigmoid_scores def line_graph(x, y, x_title, y_title): """ Draw line graph with x and y values :param x: :param y: :param x_title: :param y_title: :return: """ plt.plot(x, y) plt.xlabel(x_title) plt.ylabel(y_title) plt.show() graph_x = range(0, 21) graph_y = sigmoid(graph_x) print "Graph X readings: {}".format(graph_x) print "Graph Y readings: {}".format(graph_y) line_graph(graph_x, graph_y, "Inputs", "Sigmoid Scores")
Graph X readings: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] Graph Y readings: [0.5, 0.00049, 0.78823, 0.24334, 0.79085, 0.57153, 0.33653, 0.55994, 0.95336, 0.40137, 0.12976, 0.8152, 0.53978, 0.5702, 0.19722, 0.7773, 0.48379, 0.06244, 0.00205, 0.72036, 0.88463]

从上图可以看出,随着输入值的增加,sigmoid得分增加到1。
softmax激活函数
softmax激活函数的性质
- x: 输入
- exp:对其求指数
- f(x): 函数输出
从上述计算公式可以看出: - 计算出的概率将在0到1的范围内。
- 所有概率的和等于1。
softmax激活函数的使用
- 用于多重分类逻辑回归模型。
- 在构建神经网络中,在不同的层使用softmax函数。
softmax激活函数python实现并画图
实现代码
# Required Python Package import numpy as np def softmax(inputs): """ Calculate the softmax for the give inputs (array) :param inputs: :return: """ return np.exp(inputs) / float(sum(np.exp(inputs))) softmax_inputs = [2, 3, 5, 6] print "Softmax Function Output :: {}".format(softmax(softmax_inputs))
脚本输出:
Softmax Function Output :: [ 0.0 0.0 0. 0.]
从中可以观察到,输入值为6时,函数输出值的概率最高,这是可以从softmax函数预先知道的。之后在分类任务中,可以使用高概率值来预测给定输入特征的目标类别。
画图
# Required Python Packages import numpy as np import matplotlib.pyplot as plt def softmax(inputs): """ Calculate the softmax for the give inputs (array) :param inputs: :return: """ return np.exp(inputs) / float(sum(np.exp(inputs))) def line_graph(x, y, x_title, y_title): """ Draw line graph with x and y values :param x: :param y: :param x_title: :param y_title: :return: """ plt.plot(x, y) plt.xlabel(x_title) plt.ylabel(y_title) plt.show() graph_x = range(0, 21) graph_y = softmax(graph_x) print "Graph X readings: {}".format(graph_x) print "Graph Y readings: {}".format(graph_y) line_graph(graph_x, graph_y, "Inputs", "Softmax Scores")
脚本输出:
Graph X readings: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] Graph Y readings: [ 1.e-09 3.e-09 9.e-09 2.e-08 7.e-08 1.e-07 5.e-07 1.e-06 3.e-06 1.0e-05 2.e-05 7.e-05 2.e-04 5.e-04 1.e-03 4.e-03 1.e-02 3.e-02 8.e-02 2.e-01 6.e-01]

该图显示了softmax函数的基本属性,输入值越大,其概率越高。
多类分类及多标签分类
而对于多标签分类而言,一个样本的标签不仅仅局限于一个类别,可以具有多个类别,不同类之间是有关联的。比如一件衣服,其具有的特征类别有长袖、蕾丝等属性等,这两个属性标签不是互斥的,而是有关联的。
使用softmax和sigmoid激活函数来做多类分类和多标签分类
在实际应用中,一般将softmax用于多类分类的使用之中,而将sigmoid用于多标签分类之中,对于图像处理而言,网络模型抽取图像特征的结构基本相同,只是根据不同的任务改变全连接层后的输出层。下面介绍如何使用softmax和sigmoid完成对应的分类任务。
softmax激活函数应用于多类分类
tf.argmax(tf.softmax(logits))
首先用softmax将logits转换成一个概率分布,然后取概率值最大的作为样本的分类 。softmax的主要作用其实是在计算交叉熵上,将logits转换成一个概率分布后再来计算,然后取概率分布中最大的作为最终的分类结果,这就是将softmax激活函数应用于多分类中。
sigmoid激活函数应用于多标签分类
sigmoid一般不用来做多类分类,而是用来做二分类,它是将一个标量数字转换到[0,1]之间,如果大于一个概率阈值(一般是0.5),则认为属于某个类别,否则不属于某个类别。这一属性使得其适合应用于多标签分类之中,在多标签分类中,大多使用binary_crossentropy损失函数。它是将一个标量数字转换到[0,1]之间,如果大于一个概率阈值(一般是0.5),则认为属于某个类别。本质上其实就是针对logits中每个分类计算的结果分别作用一个sigmoid分类器,分别判定样本是否属于某个类别同样假设,神经网络模型最后的输出是这样一个向量logits=[1,2,3,4,5,6,7,8,9,10], 就是神经网络最终的全连接的输出。这里假设总共有10个分类。通过:
tf.sigmoid(logits)
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/201757.html原文链接:https://javaforall.net
