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

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

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

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

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

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

二分类问题

方法出自: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)
在这里插入图片描述在这里插入图片描述


6


  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

  6. 我是萝莉安,我好忙我居然还在写博客。点个赞再走吧。让更多人看到这个文章。

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

智能推荐

处理线程未捕获的异常UncaughtExceptionHandler_thread.java:748_叶光尘的博客-程序员宅基地

为什么需要UncaughtExceptionHandler?1.主线程可以轻松发现异常,子线程却不行(比如子线程抛出了RuntimeException异常,而主线程start子线程后后续还有很多逻辑,子线程的异常可能夹杂在日志里无法轻松发现)。2.子线程异常无法用传统方法捕获(比如在主方法里try/catch不能捕获到子线程里面的异常,他只能捕获主线程的异常)。处理多线程子线程的异常有两种方式:第一种是手动在每个run方法里进行try/catch,不推荐这种方式,写起来繁琐。第二种是利用Uncau

410. Split Array Largest Sum 分割数组的最大值__大峰_的博客-程序员宅基地

给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组。设计一个算法使得这 m 个子数组各自和的最大值最小。注意:数组长度 n 满足以下条件:1 ≤ n ≤ 10001 ≤ m ≤ min(50, n)示例:输入:nums = [7,2,5,10,8]m = 2输出:18解释:一共有四种方法将nums分割为2个子数组。其中最好的方式是将其分为[7,2,5] 和 [10,8],因为此时这两个子数组各自的和的最大值为18,在所有情况中最小。动态规划看到「

网易数据分析笔试题_yangyuxianerer的博客-程序员宅基地

1、答案:A只要A可以让2队一直剩4的倍数个,那么A就可以获胜。A先取13个宝石中的一个,之后B取1个,A取同堆中的3个,B取2个,A取同堆中的2个,B取3个,A取同堆中的1个。则A可以获胜。2、排列组合答案:A插空法:将4个数字插到16个数字组成的17个空格中。C17 4=23803、支持度和置信度4、呜呜呜,希望多一点这样简单的编程题,我太菜了。def num(s): l=len(set(s)) if l==2: print(2) elif l

Android的TextView中文gravity="right"看不到效果的问题_yanjing_mail的博客-程序员宅基地

TextView中的文本需要右对齐,添加了android:gravity="right"后,发现在Graphical Layout中无法看到效果。<TextView android:text="北京市" android:width="90dp" android:textSize="20dp" android:gravity="right" android:textColor="#fff

android java获取string.xml_如何从android中的string.xml读取值?_孙建华2008的博客-程序员宅基地

如何从android中的string.xml读取值?我写了这句话:String Mess = R.string.mess_1 ;获取字符串值,但它不是返回字符串,而是给我类型为整数的id。 我怎样才能得到它的字符串值? 我在string.xml文件中提到了字符串值。16个解决方案722 votes试试这个String mess = getResources().getString(R.string...

以电源IC RT8059为例建立封装_qq_20043187的博客-程序员宅基地

1、打开Pad Designer 2、file->new   新建焊盘 设置保存路径和焊盘名称3、先把单位改成Millimeter(毫米)4、切换到single layes mode(因为是表贴元件)5、设置焊盘图形hermal Relief与Anti Pad

随便推点

第一章:初探Spring Cloud Config配置集中管理_S1ow的博客-程序员宅基地

前路艰难,但谨记,你并不孤独。Spring Cloud如火如荼,抽空研究研究Spring大家族中的新份子。具体的介绍不会粗线在本系列博文中,如需要理论等知识直接百度or谷歌。Spring Cloud中保护N多已构建好的微服务,可以做到即插即用,其中大致包含几种服务:Config、Eureka、Ribbon、Hystrix、Feign、Bus等,具体介绍及开源地址请见:Spring Cloud中文官

pycharm上安装库(以pandas为例)_another静静的博客-程序员宅基地

pycharm上安装库(以pandas为例)网上有些反应安装pandas库时会出现问题,提示好像是pip的原因。 这时候大概是自己的pip版本太久啦。所以最好先在cmd更新一下pip好了。在cmd输入命令:python -m pip install -U pip出现成功信息:Requirement already up-to-date 即可。之后打开pycharm 1、点击右上角 file/se

安防系统助力公安办事 更需公安视听技术专业人才_weixin_33827965的博客-程序员宅基地

2017年全国高考于6月7日正式拉开大幕,这两天正是高考紧张时刻。根据教育部的消息,2017年全国有940万考生参加高考。从招生数量上看,教育部此前表示,2017年将确保各地高考录取率不降低,确保省际高考录取率差距进一步缩小,确保重点高校招收农村和贫困地区的学生人数进一步增加。  安防系统助力公安办事 更需公安视听技术专业人才而从专业角度看,根据教...

常用品牌交换机端口镜像(Port Mirroring)配置_weixin_34217773的博客-程序员宅基地

用品牌交换机端口镜像(port mirroring)配置 端口镜像(port mirroring)可以让用户将所有的流量从一个特定的端口复制到一个镜像端口。&gt;如果您的交换机提供端口镜像功能,则允许管理人员自行设置一个监视管理端口来监视被监视端口的数据。监视到的数据可以通过pc上安装的网络分析软件来查看,通过对数据的分析就可以实时查看被监视...

计算机视觉相关资源_intelligence1994的博客-程序员宅基地

转自http://www.cnblogs.com/objectDetect/p/5607146.html1.  多伦多大学计算机科学系2.  普林斯顿大学计算机视觉和机器人实验室3.  牛津大学Torr Vision Group4.  伯克利视觉和学习中心Prof. Trevor DarrellCS280 Computer VisionObject Detection and Segmentati...

Mybatis学习之mapper映射文件中属性的含义_会飞的河马的博客-程序员宅基地

xml version="1.0" encoding="UTF-8" ?> DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> mapper namespace="com.dy.dao.UserD

推荐文章

热门文章

相关标签