一个神经网络有多少个神经元?

引言

神经网络是机器学习的一个迷人的领域,但是它们有时很难优化和解释。事实上,它们有几个超参数。要优化的最常见的超参数是隐藏层中的神经元数量。让我们看看如何为我们的数据集找到一个神经网络的最佳神经元数量。

什么是神经网络?

神经网络是一种特定模型,它可以根据一层神经元来捕捉特征与目标之间的相关性,从而转换数据集。一个神经网络是由几层神经元组成的。每个神经元获取一些输入,转换它们并返回输出。一个神经元的输出可以成为下一层神经元的输入等等,构建越来越复杂的架构。

第一层称为输入层,由返回特征值本身的神经元构成。然后,第一层的每个神经元连接到隐藏层的所有神经元,负责网络的学习能力。隐藏层后面可以跟几个其他隐藏层,这是深度学习网络的典型特征。最后,将最后一个隐藏层的输出提供给给出结果(即目标变量的值)的输出层。

在最简单的形式中,神经网络只有一个隐藏层,如下图所示。

输入层的神经元数目等于特征数目。根据目标变量定义输出层的神经元数。接下来的问题是如何为隐藏层找到正确的神经元数量。

数量太少可能会产生欠拟合,因为网络可能无法正确学习。但是数量太多有可能产生过拟合,因为从网络中学习了太多从而无法泛化。因此必须有合适数量的神经元来确保良好的训练。

如何优化神经元的数量

该过程非常简单,它使用交叉验证:

  • 设置一定数量的神经元

  • 在 k 折交叉验证中计算某些性能指标的平均值

  • 用不同数量的神经元重复这个过程

  • 选择神经元的数量,最大化 k 交叉验证的平均值

交叉验证很重要,因为使用它我们可以确保模型不会过拟合或欠拟合。

这个过程非常类似于超参数调优,因为隐藏层中的神经元数量实际上是一个要调优的超参数。

现在让我们看看如何在 Python 中实现这个过程。

在 Python 中的示例

在这个例子中,我将展示如何使用 scikit-learn 库优化 Python 中的神经元数量。事实上,你也可能会使用 Keras 来构建神经网络,但概念是完全相同的。

我将使用 scikit-learn 中包含的乳腺癌示例数据集。

首先,让我们导入一些有用的库。

import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.neural_network import MLPClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.metrics import roc_auc_score

然后,我们可以加载我们的数据集,并将其分成训练集和测试集。

X,y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

现在,我们必须定义我们的模型。在本例中,我将使用一个简单的带有单个隐藏层的多层感知器。为了简单起见,构造函数的所有参数都保留在它们的标准值中。我只是设置随机状态,以确保结果的可重复性。

在将数据集提供给神经网络之前,不要忘记缩放特征。为简单起见,我将在 scikit-learn 中使用 Pipeline 对象,然后应用标准化。

model = Pipeline([
                  ('scaler',StandardScaler()),
                  ('model',MLPClassifier(random_state=0))
])

现在,我们必须通过搜索最佳神经元数量来优化我们的网络。请记住,我们尝试了几种可能的数字并计算交叉验证中性能指标的平均值。最大化这样一个值的神经元数量就是我们正在寻找的数量。

为此,我们可以使用 GridSearchCV 对象。由于我们正在处理二元分类问题,因此我们要最大化的指标是 AUROC。我们将以 2 的步长跨越 5 到 100 个神经元。

search = GridSearchCV(model,
   {'model__hidden_layer_sizes':[(x,) for x in np.arange(5,100,2)]},
   cv = 5, scoring = "roc_auc", verbose=3, n_jobs = -1
                      
)

最后,我们可以寻找最佳的神经元数量。

search.fit(X_train, y_train)

搜索结束后,我们会得到最好的平均分,即:

search.best_score_
# 0.9947175348495965

神经元的最佳数量是:

search.best_params_
# {'model__hidden_layer_sizes': (75,)}

最后,我们可以在测试数据集上计算这样一个模型的 AUROC,以确保我们没有对数据集进行过多的处理。

roc_auc_score(y_test,search.predict_proba(X_test)[:,1])
# 0.9982730973233008

我们得到的值仍然很高,所以我们很确定优化后的模型已经泛化了训练数据集,从它携带的信息中学习。

总结

优化神经网络可能是一个复杂的任务。在这篇文章中,我已经解释了一种优化神经元数量的可能方法,但是同样的概念甚至可以应用到其他超参数(比如激活函数、小批量大小、时代数量、学习速度)。记住,超参数的数量越多,优化的速度就越慢。

·  END  ·

HAPPY LIFE

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C语言标准库没有专门针对神经网络的库函数,所以要用C语言写一个神经网络需要自己实现网络结构和算法。可以使用数组来模拟网络中的节点和权值,使用标准库中的数学函数来计算各层的输出。也可以使用第三方库,如OpenBLAS,来帮助进行矩阵运算。 ### 回答2: 要使用C标准库编写一个神经网络,你需要了解神经网络的基本原理和C语言的编程知识。 第一步是定义神经网络的结构。你需要确定神经网络的层数、每层的神经元数量以及它们之间的连接方式。在C语言中,你可以使用结构体来定义神经网络的每一层,然后使用指针进行连接。 第二步是初始化神经网络。你需要为每个神经元分配内存,并为它们的权重和偏差随机初始化。C语言中,你可以使用动态内存分配函数(例如malloc)来为神经元分配内存,然后使用随机数函数(例如rand)来初始化权重和偏差。 第三步是实现前向传播算法。这意味着将输入数据传递给神经网络,并计算每个神经元的输出。在C语言中,你可以使用循环来遍历每一层的神经元,并使用公式计算输出值。 第四步是实现反向传播算法。这意味着根据网络的输出与真实值之间的差异来更新权重和偏差。在C语言中,你可以使用梯度下降算法来更新权重和偏差。 最后,你还可以实现一些辅助功能来帮助你训练和测试神经网络,例如数据加载函数、损失函数和准确率计算函数。 需要注意的是,使用C标准库编写神经网络可能相对复杂和繁琐。你会需要处理内存分配和释放、数组操作、矩阵运算等底层细节。因此,建议你在开始之前对C语言的基本概念和编程技巧有一定的了解。 希望这些回答能对你的问题有所帮助! ### 回答3: 要使用C标准库编写一个神经网络,需要了解神经网络的基本原理和C语言的基本知识。下面将逐步解释如何使用C标准库编写一个简单的神经网络。 首先,需要定义神经网络的结构。神经网络是由多个层组成的,每个层都有多个神经元。我们可以使用C中的结构体表示神经网络神经元神经网络结构体中包含了输入层、隐藏层和输出层,而神经元结构体中包含了权重和偏置(两个浮点数)。 接下来,需要编写函数来初始化神经网络神经元。通过这些函数,可以设置神经网络的层数和每层的神经元数量,以及随机初始化神经元的权重和偏置。 然后,定义函数来实现神经网络的前向传播和反向传播算法。前向传播算法将输入数据输入神经网络,通过一系列线性变换和非线性激活函数,得出输出结果。反向传播算法根据实际输出和期望输出的误差,通过链式法则来更新神经元的权重和偏置。 在实现这些函数的过程中,可以使用C标准库提供的数学函数和数据结构,如矩阵操作、指数函数和随机数生成等。 最后,可以编写一个简单的主函数,来测试神经网络的功能。在主函数中,可以使用训练集来训练神经网络,并使用测试集来测试神经网络的性能。 在实际编写过程中,还需要考虑内存管理、边界条件检查和算法优化等方面的问题。此外,如果希望实现更复杂的神经网络,可以使用一些第三方库,如OpenCV和TensorFlow等,来简化开发过程和提高性能。 总结起来,使用C标准库编写一个神经网络需要深入了解神经网络原理和C语言知识,并合理地设计数据结构和算法。尽管使用C标准库可能相对繁琐,但它可以提供足够的灵活性和可定制性,以实现各种复杂的神经网络模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值