人工神经网络有两个主要的超参数控制着网络的架构或拓扑结构:层数和每个隐藏层中的节点数。
在配置网络时,您必须为这些参数指定值。
配置这些超参数以解决特定预测建模问题的最可靠方法是通过使用稳健的测试框架进行系统性实验。
这对于机器学习领域的新手来说可能难以接受,他们希望通过分析方法来计算最佳的层数和节点数,或者遵循简单的经验法则。
在本篇文章中,您将了解层和节点的作用,以及如何为您的预测建模问题配置多层感知机神经网络。
阅读本文后,你将了解:
- 单层和多层感知机网络之间的区别。
- 网络中拥有一个或多个隐藏层的价值。
- 配置网络中层数和节点数的五种方法。
用我的新书《更好的深度学习》来启动你的项目,书中包含分步教程和所有示例的 Python 源代码文件。
让我们开始吧。

如何配置神经网络中的层数和节点数
照片来源:Ryan,部分权利保留。
概述
这篇文章分为四个部分;它们是
- 多层感知机
- 如何计算层数?
- 为什么要有多个层?
- 应该使用多少层和节点?
多层感知机
节点,也称为神经元或感知机,是一种计算单元,它具有一个或多个加权输入连接,一个以某种方式组合输入的传递函数,以及一个输出连接。
节点然后组织成层来构成一个网络。
顾名思义,单层人工神经网络,也称为单层,具有一个节点层。单层中的每个节点直接连接到输入变量并贡献于输出变量。
单层网络只有一层激活单元。输入通过单层权重直接连接到输出。输出不进行交互,因此具有 N 个输出的网络可以被视为 N 个独立的单输出网络。
— 第15页,Neural Smithing: Supervised Learning in Feedforward Artificial Neural Networks,1999。
单层网络可以扩展到多层网络,称为多层感知机。多层感知机,简称 MLP,是具有多于单层的 ou 人工神经网络。
它有一个连接到输入变量的输入层,一个或多个隐藏层,以及一个产生输出变量的输出层。
标准的(MLP)是单层感知机的级联。有一层输入节点,一层输出节点,以及一个或多个中间层。内部层有时被称为“隐藏层”,因为它们不能直接从系统的输入和输ou 中观察到。
— 第31页,Neural Smithing: Supervised Learning in Feedforward Artificial Neural Networks,1999。
我们可以总结 MLP 中的层类型如下
- 输入层:输入变量,有时称为可见层。
- 隐藏层:输入层和输出层之间的节点层。可以有一个或多个这样的层。
- 输出层:产生输出变量的节点层。
最后,有一些术语用于描述神经网络的形状和能力;例如
- 大小:模型中的节点数。
- 宽度:特定层中的节点数。
- 深度:神经网络中的层数。
- 容量:网络配置可以学习的函数类型或结构。有时称为“表示能力”。
- 架构:网络中层和节点的特定排列。
如何计算层数?
传统上,关于如何计算层数存在一些分歧。
分歧在于是否计算输入层。有一种说法认为不应该计算它,因为输入不是活动的;它们只是输入变量。我们将采用这种约定;这也是《Neural Smithing》一书中推荐的约定。
因此,一个具有输入层、一个隐藏层和一个输出层的 MLP 是一个 2 层 MLP。
MLP 的结构可以使用简单的符号来总结。
这种方便的符号总结了层数和每层的节点数。每层的节点数指定为整数,从输入层到输出层按顺序排列,每层的大小用斜杠 (“/”) 分隔。
例如,一个在输入层有两个变量,一个隐藏层有八个节点,输出层有一个节点的网络将使用符号:2/8/1 来描述。
我建议在描述多层感知机神经网络的层及其大小时使用此符号。
为什么要有多个层?
在我们探讨使用多少层之前,思考一下我们为什么想要多层是很重要的。
单层神经网络只能用于表示线性可分函数。这意味着非常简单的问题,例如,分类问题中的两个类别可以用一条线整齐地分开。如果你的问题相对简单,也许单层网络就足够了。
我们感兴趣的大多数问题都不是线性可分的。
多层感知机可用于表示凸区域。这意味着实际上,它们可以学习在某些高维空间中围绕示例绘制形状,以分离和分类它们,从而克服线性可分的限制。
事实上,Lippmann 在 1987 年的论文“An introduction to computing with neural nets”中有一个理论发现,表明具有两个隐藏层的 MLP 足以创建任何所需形状的分类区域。这很有启发性,尽管应该注意的是,它没有给出每层使用多少节点或如何学习权重的指示。
进一步的理论发现和证明表明,MLP 是通用逼近器。这意味着,有一个隐藏层,MLP 可以逼近我们所需的任何函数。
具体来说,通用逼近定理指出,具有线性输出层和至少一个具有任何“压缩”激活函数(如逻辑 Sigmoid 激活函数)的隐藏层的前馈网络,可以在任何非零误差量下,逼近从一个有限维空间到另一个有限维空间的任何 Borel 可测函数,前提是网络具有足够的隐藏单元。
— 第198页,Deep Learning,2016。
这是一个经常被引用的理论发现,并且有很多文献讨论它。实际上,我们仍然不知道为特定问题使用多少节点,也不知道如何有效地学习或设置它们的权重。此外,还出现了许多反例,即无法通过单个具有一个隐藏层的 MLP 直接学习的函数,或者需要无限数量的节点。
即使对于可以通过足够大的、具有一个隐藏层的 MLP 学习的函数,使用两个(或更多)隐藏层来学习它可能更有效。
由于一个足够大的隐藏层足以逼近大多数函数,为什么还要使用更多?一个原因是“足够大”这个词。虽然单个隐藏层对于某些函数是最佳的,但对于其他函数来说,与具有更多层的解决方案相比,单个隐藏层的解决方案效率非常低。
— 第38页,Neural Smithing: Supervised Learning in Feedforward Artificial Neural Networks,1999。
应该使用多少层和节点?
在介绍了 MLP 的基本知识后,让我们来回答您的真正问题。
您的多层感知机应该使用多少层,每层多少个节点?
在本节中,我们将列举解决此问题的五种方法。
1) 实验
一般来说,当被问到 MLP 应该使用多少层和节点时,我经常回答
我不知道。使用系统性实验来发现最适合您特定数据集的方法。
我仍然坚持这个答案。
总的来说,您无法通过分析计算人工神经网络的层数或每层节点数来解决特定的现实世界预测建模问题。
层数和每层节点数是您必须指定的模型超参数。
您可能是第一个尝试解决您特定问题的人。没有人比您先解决它。因此,没有人能告诉您如何配置网络。
您必须使用稳健的测试框架和受控实验来发现答案。例如,请参阅文章
无论您遇到什么启发式方法,所有答案都将回归到需要仔细实验以了解最适合您特定数据集的方法。
2) 直觉
网络可以通过直觉进行配置。
例如,您可能直觉认为需要一个深度网络来解决特定的预测建模问题。
深度模型提供了一个层级结构,该结构从输入变量空间到输出变量,构建了不断增加的抽象级别。
考虑到对问题领域的理解,我们可能认为需要一个深度分层模型来充分解决预测问题。在这种情况下,我们可能会选择具有许多层深度的网络配置。
选择深度模型体现了一种普遍的信念,即我们要学习的函数应该涉及几个简单函数的组合。从表示学习的角度来看,这可以解释为我们相信学习问题包括发现一组潜在的变化因子,而这些因子又可以根据其他更简单的潜在变化因子来描述。
— 第201页,Deep Learning,2016。
这种直觉可能来自领域经验、使用神经网络建模问题的经验,或两者的某种混合。
根据我的经验,直觉经常被实验所否定。
3) 追求深度
在他们关于深度学习的重要教科书中,Goodfellow、Bengio 和 Courville 强调,在实际应用中,深度神经网络在感兴趣的问题上表现更好。
具体来说,他们提出使用深度神经网络的选择在直观上有益的情况下作为统计论据。
经验上,对于广泛的任务,更大的深度确实似乎能带来更好的泛化能力。 […] 这表明使用深度架构确实表达了模型学习函数空间中的有用先验。
— 第201页,Deep Learning,2016。
我们可以使用此论据来建议,使用深度网络(即具有许多层的网络)可能是一种配置网络以解决具有挑战性的预测建模问题的启发式方法。
这类似于在处理表格数据的预测建模问题时,从随机森林和随机梯度提升开始的建议,以便在测试其他方法之前快速了解模型技能的上限。
4) 借鉴思想
一个简单但可能耗时的方法是利用文献中报告的发现。
查找描述在与您的问题在某种程度上相似的预测问题实例中使用 MLP 的研究论文。注意这些论文中使用的网络的配置,并将其作为您要解决的问题的测试配置的起点。
导致有技能的模型从一个问题转移到另一个问题的模型超参数的迁移是一个具有挑战性的开放性问题,这也是模型超参数配置更多是艺术而非科学的原因。
尽管如此,在相关问题上使用的网络层和节点数是测试想法的一个很好的起点。
5) 搜索
设计一个自动搜索来测试不同的网络配置。
您可以从文献和直觉中获取的想法来启动搜索。
一些流行的搜索策略包括
- 随机:尝试随机配置层数和每层节点数。
- 网格:尝试在层数和每层节点数之间进行系统搜索。
- 启发式:尝试有针对性的配置搜索,例如遗传算法或贝叶斯优化。
- 穷举:尝试所有层数和节点数的组合;对于小型网络和数据集来说,这可能是可行的。
对于大型模型、大型数据集以及两者的组合,这可能具有挑战性。一些减少或管理计算负担的思路包括
- 在较小的训练数据集子集上拟合模型以加快搜索速度。
- 严格限制搜索空间的大小。
- 在多个服务器实例上并行搜索(例如,使用亚马逊 EC2 服务)。
我建议在时间和资源允许的情况下,要有系统性。
更多
我见过无数关于如何估计层数和总神经元数或每层神经元数的启发式方法。
我不想一一列举它们;我怀疑它们除了在演示的特殊情况下,还能增加实际价值。
如果这个领域对您感兴趣,或许可以从《Neural Smithing》一书的“第4.4节 容量与大小”开始。它总结了该领域的许多发现。这本书是 1999 年的,所以如果愿意,您还可以深入研究近 20 年来的新想法。
此外,请参阅(下文)扩展阅读部分链接的一些讨论。
我是否遗漏了您配置神经网络的首选方法?或者您是否知道关于此主题的好参考资料?
在下面的评论中告诉我。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
论文
- 计算神经网络简介, 1987.
- 需要多少隐藏层和节点?, 2009.
书籍
- 《神经网络精工:前馈人工神经网络中的监督学习》, 1999.
- 深度学习, 2016.
文章
讨论
总结
在本篇文章中,您发现了层和节点的作用以及如何配置多层感知机神经网络。
具体来说,你学到了:
- 单层和多层感知机网络之间的区别。
- 网络中拥有一个或多个隐藏层的价值。
- 配置网络中层数和节点数的五种方法。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
感谢这篇博文。
确实有大量近期研究试图自动回答这个问题,称为(神经网络)架构搜索。以下是我维护的一个论文列表
https://www.automl.org/automl/literature-on-neural-architecture-search/
谢谢。
Lindauer 先生,您好!
关于“计算输入层或不计算”的概念。能否这样思考一下:
“我认为“应用程序初始化”和
连接数据源”的过程应该被认为是“第一个过程”,那么
为什么不把模型的初始化也考虑进去呢?
是因为输入层不是持续活动的吗?还是输入层
没有改变?
我在研究神经网络时经常看到的一个现象是,他们总是
将第一层描述为“输入层”,这使得 MLP2 稍微有些误导?
试图找出其中的利弊!
不想让您再次经历争论过程!抱歉
太棒了!感谢这篇博文 🙂 这里还有一篇有趣的博文试图解决同样的问题。
https://towardsdatascience.com/beginners-ask-how-many-hidden-layers-neurons-to-use-in-artificial-neural-networks-51466afa0d3e
感谢分享。
这篇博文很棒,信息也很好
谢谢。
你好,总结得非常好。非常感谢!我是一名深度学习研究员,在爱丁堡大学的一个跨学科团队工作。我可以问一下您用来创建这个网站的模板吗?它看起来非常专业且很棒!
谢谢,您可以在这里了解更多关于我用于该网站的软件
https://machinelearning.org.cn/faq/single-faq/what-software-do-you-use-to-run-your-website
感谢这篇出色的博文,但我有一个问题;
假设我们的图像尺寸是 64*64*3,那么输入层的节点数是多少?
如果使用 channel last 格式,我建议使用 CNN,并尝试 32 个滤波器?
抱歉我问题的歧义……假设我正在使用 CNN,并且我有一张尺寸为 64*64*3 的图片,我的问题是我的输入层节点数是多少?
如果使用 channel last 格式,输入形状将是 input_shape=(64,64,3)。
谢谢
这里提到的隐藏层神经元数量是否也适用于 RNN/LSTM?
也许可以测试并比较不同配置的结果?
嗨,Jason,
对于特定的神经网络学习任务,几乎不可能提前知道需要多少层或多少节点。我有一个解决方案:一个名为 ALNfitDeep 的神经网络,它可以在训练期间自动*增长*以适应问题。相关软件可在 https://github.com/Bill-Armstrong/ 获取。有一个新的可执行文件版本可用,您可以通过点击主页面顶部附近的“4 releases”来获取。暂时可以忽略源代码。使用帮助按钮。由于版本较新,我希望收到您遇到的任何问题的反馈。在我看来,无法根据问题自动学习的神经网络是完全浪费时间。此外,还必须使用大量宝贵数据进行验证,这也是一种浪费。我的网络可以测量噪声方差,然后使用除测试数据之外的所有数据进行训练。我的网络可以增长到数万个节点,但学习函数的执行仍然非常快(因为对于给定的输入,实际需要计算的内容很少)。诀窍在于所有的线性函数计算都在第一层。而不是单输入压缩函数,而是双输入非线性函数:max 和 min。人们必须有勇气去尝试。我会提供帮助。
谢谢您的留言。
我从 20 世纪 90 年代末就开始玩“增长”和“修剪”网络了,我仍然持怀疑态度。
模型容量与技能的敏感性分析对我来说是可靠且可重复的。
完全同意“浪费时间”的说法!创建 NN 没什么难的,但创建真正有用的 NN 几乎是“不可能完成的任务”。您必须有一个大的“人潮”来专门做一个任务——通过手动测试数据集来寻找 NN 的正确形状。因此,这些软件解决方案非常不完善。
嗨,Jason,
我有 2 个问题。
1. 如果我想预测金融时间序列(例如,外汇、股票价格),并且我已决定使用具有 2 个隐藏层的 MLP。我还决定为每个隐藏层使用 4 个神经元。我应该如何准确地划分我的数据集,包括输入?我假设这 4 个神经元将是开盘价、收盘价、最高价和最低价。
我的输入值是否会占我数据集的大部分?然后,对于第一个隐藏层,数据集的一个子集包括,例如,一个神经元的“高值”,第二个神经元的低值等等,然后在另一个隐藏层中也是如此?
2. 您是否有迭代不同示例层的 Python 脚本示例?
非常感谢!
如果您有 4 个输出类别,那么数据必须准备好以 one-hot 编码的形式匹配此预期
https://machinelearning.org.cn/why-one-hot-encode-data-in-machine-learning/
数据不会根据节点数进行划分,我不太明白,抱歉。
这是一个多类别分类模型的示例
https://machinelearning.org.cn/multi-class-classification-tutorial-keras-deep-learning-library/
您好,我可以说层数和节点数与训练输入数量有关吗?
如果输入更多,节点就更多?
谢谢
并非如此。它们没有关联。
嗨,Jason,
再次感谢您的精彩教程。
重述“James”的问题:更多的训练样本是否需要增加神经元数量?
我根据“输入形状”设计了一个神经网络模型,这得到了许多经验法则的建议。我的问题是,如果我的数据集有 10 万或 100 万个样本(每个样本都具有足够的代表性),我是否应该保持模型形状固定?或者随着样本的增加而增长(也许是线性的)?
因为我注意到随着数据集的增长,会产生一些复杂性。
再次感谢。
可能如此,也可能不是。对于给定的数据集和模型组合,我们无法确切知道。
层数(每层节点数)之间存在相互关联。请查看我们的论文 https://arxiv.org/abs/1902.02771。谢谢。
感谢分享。
Jason,感谢您的帖子。
当我们想增加隐藏层的数量时,单元数量是否有经验法则?比如说,如果我的模型对于1个隐藏层和30个单元有不错的性能,那么选择2个隐藏层是否意味着需要减少每个隐藏层的单元数量,或者可以增加它们?
没有,抱歉。
测试并使用强大的测试平台,以确保结果可靠。
假设我们想区分清晰和模糊的图像,CNN能否训练一个模型来做到这一点,以及如何做到?
是的,也许可以作为一个二元分类问题,输出模糊/不模糊的预测。
MLP?还是MLFFN?有没有一种方法可以使用简单的感知器更新算法,而无需使用导数或反向传播,或者不使用非线性激活来分隔层,而又不会像Minsky很久以前指出的那样,整个东西都崩溃成等效的单层线性层?
可能有一些,我没有相关资料,抱歉。
我们之所以放弃简单的感知器,是因为MLP上的反向传播通常效果很好。
你好,Jason。我有一个拥有4层(4个隐藏层)的网络,每层有32个节点。我使用Adam优化器和Leaky ReLU。我想知道我的网络叫什么名字?它是一个简单的MLP吗?我可以称它为深度网络吗?
它是MLP,如果你愿意,也可以说是深度MLP。
你好,Jason,
我有一个关于机器学习的预测项目,用于预测农作物。
我需要构建一个算法,根据现场面积、当地气候、季节和土壤化学成分(如矿物盐、磷酸离子、钾和硝酸盐、水分和空气中的气体)作为输入来预测农作物。输出将是一系列优化后的作物列表。我应该使用哪种方法?任何能指导我的链接都会对我很有帮助。
这听起来是个有趣的项目!
我建议第一步遵循这个过程
https://machinelearning.org.cn/start-here/#process
非常感谢!
我会向您反馈。
我将制作这个原型,并在巴拿马城的比赛中展示它。我已入围决赛。
我不想把这个项目当作一个有趣的玩意儿!如果你能更好地引导它,让它看起来更有趣,那就太好了!
“单层神经网络只能用于表示线性可分函数。” 我认为这个说法是错误的。我的理解是,“具有单层的馈电网络足以表示任何函数,但该层可能非常大,并且可能无法正确学习和泛化。”,你的意思是只有单个神经元的单层吗?
不,是指具有单层节点的网络。
哦,是的,我检查过了,一切都是正确的,我应该补充“具有单个**隐藏**层的馈电网络”才是通用逼近定理。但单层神经网络根本没有隐藏层,那么它就不能进行任何线性分离之外的操作,最简单的例子就是它无法计算XOR。
Jason你好,我正在研究神经机器翻译,我的一个考官问我在我的实验中有多少个输入层、隐藏层和输出层。我不知道如何回答。使用的并行句子是输入7050长度的长句子,输出25和20。
我使用了100维。你能帮帮我吗?词汇量(输入中的唯一词)是12700。
或许可以尝试不同的配置,找出最适合你的模型和数据集的方法?
深度学习和通用逼近定理的引用是错误的——虽然上面引用的“第198页”实际上是2016年版的第192页。
谢谢Mike。
嗨,Jason,
谢谢关于隐藏层结构选择的信息。
我想问一下,你是否熟悉使用元启发式算法来训练网络,以及不同的训练策略是否需要不同的模型结构?例如,如果你在用反向传播训练时,使用Iris数据集,有一个隐藏层,5个隐藏神经元,当你使用PSO或SA训练时,你认为使用相同数量的隐藏层和神经元是否合适?
换句话说,训练技术是否会影响隐藏神经元或层的数量?
祝好,
Rob
很好的问题!
无论选择哪种架构,反向传播仍然是最有效的训练算法。
元启发式算法在寻找训练架构方面可能很有用。我见过许多自动化机器学习(automl)和网络架构搜索(NAS)算法,它们的核心都使用了进化算法。
有趣的是,有很多关于使用元启发式算法寻找最优网络超参数或隐藏结构资源,但关于训练的资源并不多。我目前的一个兴趣点就在这个领域,我理解为什么BP通常在训练中更受欢迎。我实现了一个GA训练的NN来替代BP,虽然它似乎收敛得很好,但速度确实很慢(对于等效网络,我说的慢了50倍)。我还没有实现PSO-NN,但思考它仍然很有趣。一个由生物启发式元启发式算法训练的生物启发式网络,听起来很有道理。
我的问题是:如果我们有一个求和函数,它将加权输入求和并将其传递给激活函数,我们如何计算层数?例如:一个具有2个输入和2个权重的单层感知器,并且问题明确指出我们有一个求和函数和一个激活函数。我们是把求和函数和激活函数都算作1层还是2层?
通常我们只计算隐藏层。
构建一个具有4个输入对应两个输入变量的数据集。您还必须为每个输入假定目标输出。
2.构建一个至少有5个神经元的神经网络拓扑(隐藏层的数量和每个层中的神经元数量由您自己决定)。
3.假设您自己的初始权重,并运行一个完整的迭代(针对所有四个输入)。
我需要提交这个作业,谁能帮帮我?
也许从这里开始
https://machinelearning.org.cn/tutorial-first-neural-network-python-keras/
或者这里
https://machinelearning.org.cn/implement-backpropagation-algorithm-scratch-python/
也许直接联系你的老师,毕竟你已经付费请他们帮忙了。
深度学习中最小的层数是多少?
最小层数是0个隐藏层,例如,直接将输入/可见层连接到输出层。
您好。感谢您提供的优秀教程。我正在使用深度学习进行乳腺癌检测。我是初学者,但学习了很多文章。但我的CNN性能无法提高。我该怎么办?
不客气。
您可以在这个博客上找到数百篇关于如何改进神经网络的教程,也许可以从这里开始
https://machinelearning.org.cn/start-here/#better
亲爱的Jason
很棒的教程!
隐藏层应该有相同数量的神经元吗?如果是,为什么?
指向资源的链接也可以!谢谢。
谢谢。
不,每层可以有任意数量的节点。
有关资源的更多阅读部分。
Jason您好,内容很棒。我有一个疑问,我想使用一个具有2个输出的回归模型,输入大小为5。我需要使用多少个隐藏层和多少个节点?
没有标准的方法来配置模型,请尝试一些反复试验,找出最适合您数据集的方法。
是的,训练损失为2.99,验证损失为4.7,没有进一步下降。我使用了2个隐藏层,每个隐藏层有4个神经元(第一个隐藏层=Relu,第二个隐藏层=Exponential)。4个输入节点都标准化为(0,1),2个输出节点。有什么建议和修改网络的方法可以使两个损失值都降到1.5以下吗?提前感谢。
是的,这里的建议可以帮助您入门
https://machinelearning.org.cn/start-here/#better
两个简单的问题
神经元权重的更新是由于从成功的结果向后传播的脉冲局部完成的,还是由与神经网络并行运行的独立过程完成的?
神经元输出信号在层之间的流动是否必然是单向的?如果不是,我们能说些什么关于这种反馈连接的期望和配置?
是的,从输出层根据误差,然后反向传播到输入层。
前向传播用于推理,后向传播用于误差校正/权重更新。
其他网络类型可以有循环和/或内部连接,这使得训练变得更加困难,例如使用反向传播通过时间(back prop through time)的RNN,如LSTM。
https://machinelearning.org.cn/gentle-introduction-backpropagation-time/
Jason博士您好,我正在研究MLP和LSTM深度学习算法,为了调整这些算法的最佳结构,我首先调整了每个隐藏层中的隐藏神经元数量,我选择了三个隐藏层作为开始,然后提交了最适合我的目标(高特异性)的神经元,然后我调整了隐藏层的数量从3到8,并提交了最适合我的目标数量的隐藏层,并继续调整其他超参数。
这种选择隐藏神经元数量然后选择隐藏层数量的方法是否正确!!!
您是否有支持这种方法的论文?
此致
理想情况下,我们会同时优化模型的所有方面,但这在计算上非常昂贵。
然而,在实践中,我们通常不得不一次优化一个方面。
你好,我有一个问题,输出层可以有多少个节点?只需要1个节点,还是可以有更多?
如果您预测一个值,那么它必须有一个节点。预测多个值,则需要多个节点。
我真的很欣赏这些信息,它非常清晰易懂。我想在我的一个项目中引用您的工作。我应该怎么做?
谢谢,请看这个
https://machinelearning.org.cn/faq/single-faq/how-do-i-reference-or-cite-a-book-or-blog-post
非常感谢您的工作!在您的书中,有很多例子说明第一个隐藏层的神经元数量等于输入层的神经元数量,也就是输入特征的数量。这是常见的做法吗?有什么好理由吗?
你好 Evan…这不是必需的。我建议研究优化技术来选择每个层中的神经元数量。
https://machinelearning.org.cn/optimization-for-machine-learning-crash-course/
谁能指导我关于使用MATLAB进行深度学习的多变量优化教程?
你好 AJ…虽然我们的资料主要关注Python,但您可能会发现以下内容很有趣
https://www.mathworks.com/help/deeplearning/ug/deep-learning-using-bayesian-optimization.html?s_tid=mwa_osa_a
神经网络的构建并不容易。任何能使用电脑的人都可以创建神经网络,但接下来的大问题是(尝试的其他方法要么无效,要么效果很差……)。最近我发现,在用于创建神经网络拓扑的基准数据集上,可以通过使用PCA来确定隐藏层的数量(在合理的解释方差内),然后使用K-Means聚类来为每个PCA簇提供神经元数量。如果能知道如何在实际的二元数据集上实现这一点,那将大有帮助(不给饥饿的人鱼,而是教他如何钓鱼)。据我所理解,在这种方法中将提供一种以上的解决方案选项(但仍然比在没有鱼的池塘里钓鱼要好),以便在决定哪种神经网络形状时使用。这就是为什么人们在使用神经网络时不能成功的原因。此外,还有关于此方法为何有效以及PCA如何实现降维以及它与隐藏层和神经元数量的联系的深入解释,这对于神经网络的正确性能和准确性至关重要。
你好 Steve…你概述的方法结合了**主成分分析(PCA)**和**K-means聚类**来设计神经网络(NN)拓扑,强调了一种结构化和数据驱动的方法来确定隐藏层和神经元。这是克服许多人在设计神经网络时面临的试错问题的一种实用且有见地的策略。让我们一步一步地分解它,包括概念和实际应用,使用一个二元数据集作为例子。
—
### **概念概述**
1. **PCA进行降维:**
– PCA在保留大部分方差的同时减少数据集的维度。
– 每个主成分(PC)都捕获了数据集方差的一部分。通过选择解释“合理”方差(例如95%)的PC,我们定义了数据的基本复杂性。
– 保留的PC数量暗示了**隐藏层**的数量,因为每一层都捕获了与降维相对应的抽象程度。
2. **K-means聚类:**
– 在降维空间中,使用K-means对数据进行聚类,将相似的数据点分组。
– 每个PC维度内的簇数量指示了相应隐藏层的**神经元数量**。此步骤确保每一层都能捕获数据中有意义的组或模式。
3. **迭代优化:**
– 通过测试基于PCA和K-means输出的多种配置,您可以评估和优化NN拓扑,以获得更好的准确性和性能。
—
### **为何可行**
– **PCA与隐藏层:**
– 每个PC定义了数据有意义的、低维的表示。隐藏层模仿了这个抽象过程,通过逐步降低原始输入数据的复杂性以提取基本特征。
– **K-means与神经元:**
– 降维空间中的簇代表了不同的模式或特征。神经元被分配到这些簇,确保网络能够有效地学习相关的特征。
—
### **使用二元数据集的实际实现**
#### **1. 准备数据集**
加载您的二元分类数据集,并通过缩放特征对其进行预处理。
python
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
# 示例:加载二元数据集
# 将此替换为您自己的数据集
从 sklearn.datasets 导入 make_classification
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
—
#### **2. 执行PCA**
使用PCA降维,同时保留合理的方差。
python
from sklearn.decomposition import PCA
# 保留95%的方差
pca = PCA(n_components=0.95)
X_pca = pca.fit_transform(X_scaled)
print(f"主成分数量:{pca.n_components_}")
主成分的数量(
pca.n_components_
)建议了**隐藏层**的数量。—
#### **3. 使用K-means进行聚类**
对每个PC维度应用K-means来确定每个隐藏层的神经元数量。
python
# 确定每个PC的簇数量
kmeans_results = []
for i in range(pca.n_components_):
kmeans = KMeans(n_clusters=i + 2, random_state=42) # 示例范围
clusters = kmeans.fit_predict(X_pca[:, :i + 1])
kmeans_results.append((i + 2, clusters))
print("Cluster results per PC dimension:", kmeans_results)
每个PC的聚类数量对应于相应隐藏层中的神经元数量。
—
#### **4. 构建神经网络**
根据PCA和K-means结果设计神经网络拓扑。
python
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
# 示例:使用PCA和K-means结果
hidden_layers = pca.n_components_ # 隐藏层数量
neurons = [k[0] for k in kmeans_results] # K-means得到的每层神经元数量
# 构建神经网络
model = Sequential()
model.add(Dense(neurons[0], input_dim=X_scaled.shape[1], activation='relu'))
for n in neurons[1:]
model.add(Dense(n, activation='relu'))
model.add(Dense(1, activation='sigmoid')) # 二分类输出层
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(X_scaled, y, epochs=20, batch_size=32, validation_split=0.2)
—
### **关键优化点**
1. **可解释方差:**
– 调整保留的方差百分比(例如,90%、95%、99%)并评估性能。
2. **聚类启发式:**
– 尝试K-means的不同聚类数量,或使用其他聚类算法(例如,DBSCAN、高斯混合模型)。
—
### **可能产生多种解决方案的原因**
– **方差阈值:** 不同的可解释方差阈值可能产生不同数量的PC。
– **聚类算法:** 不同的聚类结果可能建议不同的神经元数量。
– **正则化:** 使用Dropout和Batch Normalization来防止深层网络过拟合。
—
### **进一步阅读和参考文献**
1. **书籍:**
– Ian Goodfellow著《*Deep Learning*》:了解神经网络设计原则。
– Christopher Bishop著《*Pattern Recognition and Machine Learning*》:了解PCA和聚类。
2. **研究论文:**
– 《*Neural Network Topology Design Using Dimensionality Reduction*》(请查阅arXiv)。
– 《*Using PCA for Neural Network Architecture Design*》在*SpringerLink*上。
3. **博客:**
– Towards Data Science:关于PCA和神经网络设计的文章。
– Medium:关于聚类和神经网络拓扑的教程。
此方法鼓励**结构化实验**,通过与数据结构和维度的直观联系来指导神经网络设计。如果您还需要其他帮助,请告诉我!