神经网络中如何确定隐藏层的层数和大小_LolitaAnn的博客-程序员宅基地_神经网络隐藏层个数确定

技术标签: 算法  机器学习  人工智能  排序算法  

在前馈神经网络中,隐藏层的数量和层数的确定尚无依据,一般是由经验决定。

查阅了大量相关的文章之后我对其进行了综合梳理。

这里需要明确的一点是,这些只是根据经验提出的一些参考的方法,具体的层数和大小还是要在实际实验中进行验证。

在此之前我们还需要理解一点,就是当我们神经元足够多,隐藏层足够多的时候我们甚至能完美拟合所有的点,但是也会带来过拟合的问题。因此我们要把握一个适中的度。

二分类问题

方法出自:Beginners Ask “How Many Hidden Layers/Neurons to Use in Artificial Neural Networks?”1

对于二分类比较好理解。但是我对这个方法持保留态度

先看下边这两类,我们只需要一条斜线就可以完成映射。所以不需要隐藏层,直接inputoutput即可。
在这里插入图片描述在这里插入图片描述
对于这样要靠两个方向的直线才能分开的这样想:一个神经元只能学习一条方向的直线,所以两个方向需要两个神经元,最后把两个方向的神经元拼起来获得最后的分割线。
在这里插入图片描述
以此类推,第一个隐藏层学到单方向的直线,第二个隐藏层将两条线拼接,以此类推直到最后都拼接起来。
在这里插入图片描述
但是对于这个我存在一个疑问,二分类问题本来就很简单了,需要那么多层隐藏层吗?我觉得根本没必要那么多层隐藏层。

虽然从理论上说,层数越多拟合函数越强,但是实际上更深的层数可能会带来过拟合的问题,同时也会增加训练难度,使模型难以收敛。

隐藏层数量

从上边我们可以得到一个结论:在神经网络中,当数据需要非线性分离的时候才需要隐藏层。

什么是线性?
image.png2

对于隐藏层的层数我找到一个说法:

Table: Determining the Number of Hidden Layers3

Num Hidden Layers Result
none Only capable of representing linear separable functions or decisions.
1 Can approximate any function that contains a continuous mapping from one finite space to another.
2 Can represent an arbitrary decision boundary to arbitrary accuracy with rational activation functions and can approximate any smooth mapping to any accuracy.
>2 Additional layers can learn complex representations (sort of automatic feature engineering) for layer layers.

翻译过来就是:

  • 没有隐藏层:仅能表示线性可分离函数或决策。‎
  • 1 ‎可以近似任何包含从一个有限空间到另一个有限空间的连续映射的函数。‎
  • 2 ‎可以使用有理激活函数将任意决策边界表示为任意精度,并且可以将任何平滑映射近似到任何精度。‎
  • >2 ‎可以学习的复杂特征。

多分类

如果二分类可以按照上述方法进行计算,那多分类如何搞?

现在比较常见的方法是根据输入层和输出层的大小进行估算。

现在假设:

  • 输入层大小为 n n n
  • 输出层分为 m m m
  • 样本数量为 s s s
  • 一个常数 c c c

常见的观点有隐藏层神经元个数 h h h

  • h = s c ( n + m ) c ∈ [ 2 , 10 ] h = \frac{s}{c(n+m)} \quad c \in [2,10] h=c(n+m)sc[2,10]
  • h = n + m + c c ∈ [ 1 , 10 ] h = \sqrt{n+m} + c \quad c \in [1,10] h=n+m +cc[1,10]
  • h = n m h = \sqrt{nm} h=nm
  • h = log ⁡ 2 n h = \log_2n h=log2n
  • h = 1.5 ∗ n h = 1.5*n h=1.5n
  • h = 1.5 ∗ ( n + m ) h = 1.5*(n+m) h=1.5(n+m)
  • h < 2 n h<2n h<2n
  • ……

还有一些其他的观点但是我个人不太同意:

  • m i n ( m , n ) < h < m a x ( m , n ) min(m,n)<h<max(m,n) min(m,n)<h<max(m,n)

因为看了这么一个文章4,文中提到这MINST么一篇论文:SCALABLE MUTUAL INFORMATION ESTIMATION USING DEPENDENCE GRAPHS5

在下边两幅图中,都是使用ReLU做激活函数的神经网络,横坐标从右到左表示压缩率,最右边表示网络第一层,最左边表示网络最后一层,越往左表示压缩效果越好。可以看出隐藏层先增大后减小的压缩效果比逐渐减小的压缩效果更好。

由于文中使用MNIST做的实验,我们可以知道增大的过程中明显大于输入层的大小( 1024 > 28 ∗ 28 1024>28*28 1024>2828),更大于输出层的类别数。

这不是个例,通常在CNN中都是使用先增大后减小的隐藏层数量,并且隐藏层的大小都大于 m a x ( n , m ) max(n,m) max(n,m)
在这里插入图片描述在这里插入图片描述


我是萝莉安,我好忙。


  1. Beginners Ask “How Many Hidden Layers/Neurons to Use in Artificial Neural Networks?”

  2. 《线性代数的几何意义》任广千

  3. Heaton Research: The Number of Hidden Layers

  4. 神经网络隐藏层的大小该如何取舍?

  5. SCALABLE MUTUAL INFORMATION ESTIMATION USING DEPENDENCE GRAPHS

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_36667170/article/details/123827584

智能推荐

c#object转数组_c# – 将Object [,]转换为String [,]_weixin_39720662的博客-程序员宅基地

我试图将对象[,]数组(例如其中的一些整数)转换为字符串[,]数组.我写了这段代码,但Visual Studio给了我一个错误说:Cannot implicitly convert String[] to String[,].我应该给Array.ConvertAll函数什么参数?非常感谢.object[,] input = GetSelectedRange();string[,] dst = Ar...

XUtils_guoyf123321的博客-程序员宅基地

最近搜了一些框架供初学者学习,比较了一下XUtils是目前git上比较活跃 功能比较完善的一个框架,是基于afinal开发的,比afinal稳定性提高了不少,下面是介绍:xUtils简介xUtils 包含了很多实用的android工具。xUtils 最初源于Afinal框架,进行了大量重构,使得xUtils支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的O

android之网格布局GridLayout_chengshang5025的博客-程序员宅基地

TableLayout(网格布局) 需要注意的: 网格布局需要最低版本支持: API 14 也就是最低andriod4.0 :layout/activity_main.xml &lt;LinearLayout xmlns:android="http://schemas.android...

笔记-git-git服务器安装及配置_akuibpt23191的博客-程序员宅基地

笔记-git-git服务器安装及配置1. GIT服务器简介Git 可以使用四种主要的协议来传输数据:本地传输,SSH 协议,Git 协议和 HTTP 协议。下面分别介绍一下哪些情形应该使用(或避免使用)这些协议。值得注意的是,除了 HTTP 协议外,其他所有协议都要求在服务器端安装并运行 Git1. 本地克隆一个本地版本库,可以执行如下的命令:...

ucos操作系统(1)——OSTCBY,OSRdyGrp,OSRdyTbl_脱掉三千烦恼丝的博客-程序员宅基地

OSRdyGrp相当于列,有多少组,是一个变量OSRdyTbl是一个数组,每个数组元素是8位的,每一位代表一个优先级转载自https://blog.csdn.net/d521000121/article/details/53678252关于这三个系统变量,研究了好一阵子,也在网上查了不少资料,感觉挺乱的,就按自己的理解写得详细一点。希望能让人只看一篇博文就能搞懂这个是怎么用的。首先给出这三个变量的定义:INT8U const OSUnMapTbl[256] = {0, 0, 1, 0, 2,

python查看图片lux值_【20200930】Python的图像处理库Pillow使用教程_hwasion的博客-程序员宅基地

介绍介绍福哥今天要详情的跟大家讲讲图像处理库Pillow的使用技巧,Pillow是一个非常强大的图像处理库,基本可以满足日常使用当中的所有图片加工的需求。学会Pillow库的使用技巧,就可以对我们的照片进行自动化的加工处理了。格式转换可以使用convert方法转换图片模式参数说明1 (1-bit pixels, black and white, stored with one pixel per ...

随便推点

GDI处理图片透明(使用区域类CRgn实现)_xwenkai的博客-程序员宅基地

GDI全称图形设备接口,没什么好介绍的,自己去百度,下面我要做的是如何使用GDI去将一张图片的部分处理成透明。待处理的图片:将该图片下载下来或者你自己有其他的bitmap也行,首先用vs(本例用的是vs2017)创建一个win32的默认工程。删除其他代码,只保留包含的头文件和入口函数wWinMain,结果如下图:然后工程切换至资源视图,鼠标右键-》添加资源-》选择Dialog-...

ubuntu 必備_b10l07的博客-程序员宅基地

1.切换到Ubuntu gnome 经典桌面注销unity桌面环境,然后选择登录环境为“经典桌面”即可进入。若是你喜欢Unity,可是你的显卡不给力3D不支持,怎么办呢?安装Unity-2D:sudo apt-add-ppa repository: unity-2d-team/unity-2d-dailysudo apt-get updatesudo apt-get install qt-u...

python ndarray合并_Python干货-Numpy的ndarray的合并与分割_weixin_39679718的博客-程序员宅基地

# 导入numpyimport numpy as npndarray的合并定义要使用的数据源a = np.array([1, 1, 1])b = np.array([2, 2, 2])print('a', a)print('b', b)a [1 1 1]b [2 2 2]numpy.vstack()函数语法:vstack(tup),参数是一个元组,它可将元组中指定的数组进行合并# 将a与b合并c ...

精易模块中普通填表初始化失败的解决方案_gouphigh2的博客-程序员宅基地_易语言网页填表初始化失败

很多新手在开始使用精易模块时,会遇到初始化失败,原因很简单,必须在超文本浏览框载入网页成功之后,才能初始化成功。所以简单的做些处理就可以避免这类错误的发生。.版本 2.程序集 窗口程序集_启动窗口.程序集变量 ok, 逻辑型.版本 2.子程序 _超文本浏览框1_载入完毕ok = 真.版本 2.支持库 HtmlView

《人月神话》阅读笔记02_weixin_30827565的博客-程序员宅基地

今天我阅读了人月神话-贵族专制和民主政治。 以前呢,我总觉得软件开发的时候只要每个人把自己要做的功能实现了,然后随意整合起来就够了,其他的架构什么的都不重要。 但读了这一章,在这个章里面一个最重要的关键词就是概念完整性,不论你软件项目规模的大小都,不论你采取的软件生命周期方法论,我们都不要忽视了总体架构设计这个过程,而总体设计的一个重点就是概念完整性。概念完整性是系统设计...

java内存满卡死_jvm内存不足导致应用僵死问题咨询_未来大街的博客-程序员宅基地

页面上操作无反应 应用好像僵死在服务器上执行TopPID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND2299 root 20 0 2621076 727936 16544 S 99.9 38.6 67:08.05 java看到CPU100% 都是mongo 查询和插入的操作 没有计算密集...

推荐文章

热门文章

相关标签