输出层所用的激活函数,要根据求解问题的性质决定。一般地,

  • 回归问题可以使用恒等函数,也就是说会将输入按原样输出;
  • 二元分类问题可以使用 sigmoid 函数;
  • 多元分类问题可以使用 softmax 函数;

1. softmax 函数定义


用图表示 softmax 函数的话,如图 3-22所示。图 3-22中,softmax 函数的输出通过箭头与所有的输入信号相连。这是因为,从式(3.10)可以看出,输出层的各个神经元都受到所有输入信号的影响。

2. softmax 函数实现

在 IPython 中实现过程:

In [1]: import numpy as npIn [2]: a = np.array([0.3, 2.9, 4.0])In [3]: exp_a = np.exp(a)In [4]: exp_a
Out[4]: array([ 1.34985881, 18.17414537, 54.59815003])In [5]: sum_exp_a = np.sum(exp_a)In [6]: sum_exp_a
Out[6]: 74.1221542101633In [7]: y = exp_a/sum_exp_aIn [8]: y
Out[8]: array([0.01821127, 0.24519181, 0.73659691])In [9]:

将其封装成函数显示为:

In [9]: def softmax(x):...:     exp_x = np.exp(x)...:     sum_exp_x = np.sum(exp_x)...:     y = exp_x/sum_exp_x...:     return y...:     In [10]: a = np.array([0.3, 2.9, 4.0])In [11]: softmax(a)
Out[11]: array([0.01821127, 0.24519181, 0.73659691])In [12]:

3. softmax 函数缺陷

softmax 函数的实现中要进行指数函数的运算,但是此时指数函数的值很容易变得非常大。比如,e10 的值会超过 20000,e100 会变成一个后面有 40 多个 0 的超大值,e1000 的结果会返回一个表示无穷大的 inf 。如果在这些超大值之间进行除法运算,结果会出现“不确定”的情况,也就是人们常说的发生溢出问题。

4. softmax 函数改进


式(3.11)说明,在进行 softmax 的指数函数的运算时,加上(或者减去)某个常数并不会改变运算的结果。这里的 C 可以使用任何值,但是为了防止溢出,一般会使用输入信号中的最大值。我们来看一个具体的例子。

In [13]: a = np.array([1010, 1000, 990])In [14]: np.exp(a)/ np.sum(np.exp(a))
Out[14]: array([nan, nan, nan])In [16]: c = np.max(a)In [17]: c
Out[17]: 1010In [18]: a - c
Out[18]: array([  0, -10, -20])In [19]: np.exp(a-c)/np.sum(np.exp(a-c))
Out[19]: array([9.99954600e-01, 4.53978686e-05, 2.06106005e-09])In [20]:

如该例所示,通过减去输入信号中的最大值(上例中的 c ),我们发现原本为 nannot a number,不确定)的地方,现在被正确计算了。综上,我们可以像下面这样实现 softmax 函数。

In [22]: def softmax(a):...:     c = np.max(a)...:     exp_a = np.exp(a-c)...:     sum_exp_a = np.sum(exp_a)...:     y = exp_a / sum_exp_a...:     return y...:     In [23]:

5. softmax 函数特征

使用 softmax() 函数,可以按如下方式计算神经网络的输出。

In [5]: a = np.array([0.3, 2.9 ,4.0])In [6]: y = softmax(a)In [7]: y
Out[7]: array([0.01821127, 0.24519181, 0.73659691])In [8]: np.sum(y)
Out[8]: 1.0In [9]:

如上所示,softmax 函数的输出是 0.0 到 1.0之间的实数。并且,softmax 函数的输出值的总和是 1。输出总和为 1 是 softmax 函数的一个重要性质。正因为有了这个性质,我们才可以把 softmax 函数的输出解释为“概率”。

比如,上面的例子可以解释成 y[0] 的概率是 0.018(1.8%),y[1] 的概率是 0.245(24.5%),y[2] 的概率是0.737(73.7%)。

这里需要注意的是,即便使用了 softmax 函数,各个元素之间的大小关系也不会改变。这是因为指数函数(y = exp(x))是单调递增函数。实际上,上例中 a 的各元素的大小关系和 y 的各元素的大小关系并没有改变。比如,a 的最大值是第 2 个元素,y 的最大值也仍是第 2 个元素。

一般而言,神经网络只把输出值最大的神经元所对应的类别作为识别结果。并且,即便使用 softmax 函数,输出值最大的神经元的位置也不会变。

因此,神经网络在进行分类时,输出层的 softmax 函数可以省略。在实际的问题中,由于指数函数的运算需要一定的计算机运算量,因此输出层的 softmax 函数一般会被省略。

6. 输出层神经元数量

输出层的神经元数量需要根据待解决的问题来决定。

对于分类问题,输出层的神经元数量一般设定为类别的数量。比如,对于某个输入图像,预测是图中的数字 0 到 9 中的哪一个的问题(10 类别分类问题),可以像图3-23 这样,将输出层的神经元设定为 10 个。

如图 3-23 所示,在这个例子中,输出层的神经元从上往下依次对应数字 0, 1, . . ., 9。此外,图中输出层的神经元的值用不同的灰度表示。这个例子中神经元 y2 颜色最深,输出的值最大。这表明这个神经网络预测的是 y2 对应的类别,也就是“2”。

参考:《深度学习入门:基于Python的理论与实现》

机器学习入门(06)— 输出层多元分类、softmax 归一化指数函数以及输出层的神经元数量相关推荐

  1. 机器学习入门(13)— Affine 仿射层、Softmax 归一化指数函数层实现

    1. 一维 Affine 仿射层 我们回顾下之前为了计算加权信号的总和,使用了矩阵的乘积运算 NumPy 中是 np.dot() , 参照代码如下: In [7]: X = np.random.ran ...

  2. 机器学习入门(03)— 激活函数分类(阶跃函数和 sigmoid 函数的理论、实现、显示以及区别、非线性函数、ReLU 函数、tanh 函数)

    各种激活函数介绍,请参考下面链接: https://en.wikipedia.org/wiki/Activation_function 1. 阶跃函数 1.1 理论 式(3.3)表示的激活函数以阈值为 ...

  3. 机器学习入门案例:鸢尾花数据集分类 绘制PR曲线

    案例使用鸢尾花数据集进行分类预测,并绘制评价分类性能的PR曲线图 认识分类任务和数据集 Iris(鸢尾花)数据集 案例演示中使用的是有监督的机器学习算法:SVM 支持向量机 建立模型的流程如下: 训练 ...

  4. 机器学习入门 ————》 一元及多元线性回归

    1.线性回归(line Regression) 回归,指研究一组随机变量(Y1 ,Y2 ,-,Yi)和另一组(X1,X2,-,Xk)变量之间关系的统计分析方法,又称多重回归分析.通常Y1,Y2,-,Y ...

  5. 机器学习入门 --- 贝叶斯 - 中文新闻分类任务

    文本分析 停用词 语料中大量出现,但没有大的用处 Tf-idf 关键词提取 TF−IDF=词频(TF)∗逆文档频率(IDF)TF-IDF = 词频(TF)*逆文档频率(IDF)TF−IDF=词频(TF ...

  6. 机器学习入门 01 —— 机器学习概述

    文章目录 系列文章 机器学习概述 1.1.人工智能概述 1 人工智能应用场景 2 人工智能小案例 3 人工智能发展必备三要素 4 人工智能.机器学习和深度学习 5 小结 1.2.人工智能发展历程 1. ...

  7. 机器学习入门 笔记(二) 机器学习基础概念

    第二章 机器学习基础概念 1.机器的数据 2.机器学习的主要任务 3.监督学习和非监督学习 4.批量.在线学习.参数.非参数学习 5.哲学思考 6.环境的搭建 1.机器的数据 我们以鸢尾花的数据为例. ...

  8. 添加softmax层_PyTorch入门之100行代码实现softmax回归分类

    本文首发于公众号[拇指笔记] 1. 使用pytorch实现softmax回归模型 使用pytorch可以更加便利的实现softmax回归模型. 1.1 获取和读取数据 读取小批量数据的方法: 首先是获 ...

  9. 机器学习入门(05)— 使用 NumPy 实现 3 层简单神经网络

    我们以图 3-15 的3 层神经网络为对象,实现从输入到输出的(前向)处理.在代码实现方面,使用上一节介绍的 NumPy 多维数组. 1. 符号定义 2. 各层之间信号传递 从输入层到第 1 层的 第 ...

最新文章

  1. MPB:生态环境中心韩丽丽等-土壤病毒组富集及DNA提取
  2. 烟雾检测电路c语言程序,烟雾报警器电路图大全(六款模拟电路设计原理图详解)...
  3. 职场不设限:真正的AI产品经理太少了……
  4. comsol显示电场计算结果_在 COMSOL 中构建磁流体动力学多物理场模型
  5. flask 中文编码解码
  6. css布局模型(摘抄自慕课)
  7. centos7添加用户并授权root权限
  8. 简单的爬虫爬取教务网获取成绩
  9. Nginx+Tomcat负载平衡
  10. 学习笔记(03):2020软考数据库系统工程师-基础知识培训视频-计算机系统--安全性可靠性与性能评测(一)...
  11. QCIF、CIF、DCIF、D1分辨率
  12. 华三OSPF多区域配置实例
  13. 【信息系统项目管理师】重点整理:高项知识地图
  14. 有关结合律和优先规律
  15. 国科大学习资料--高级软件工程-复习题设计题答案
  16. android源码分析
  17. python绘制缓和曲线_autocad绘制缓和曲线
  18. 【分区助手】如何扩大C盘容量?
  19. C语言字符串使用指南
  20. App个人开发者已末路穷途

热门文章

  1. python 位运算与等号_Python 运算符
  2. 2022-2028年中国复合软管行业市场行情动态及发展趋向分析报告
  3. bert推理速度太慢如何解决
  4. 各种优化算法公式快速回忆优化器-深度学习
  5. 独家 | TensorFlow 2.0将把Eager Execution变为默认执行模式,你该转向动态计算图了...
  6. 理解和实现分布式TensorFlow集群完整教程
  7. GStreamer 1.18.4稳定的错误修复版本
  8. 全卷积目标检测:FCOS
  9. js生成随机数函数,倒计时函数
  10. Android 监听多个Spinner 的点击事件