c# - 对于特定数据集,神经网络的工作配置是什么(层数、学习率等)?
问题描述
我尝试用神经网络(aforge-lib)解决一些简单的功能:
这就是我生成数据集的方式:
const int GesamtAnzahl = 200;
float[,] tempData = new float[GesamtAnzahl, 2];
float minX = float.MaxValue;
float maxX = float.MinValue;
Random rnd = new Random();
var granzen = new List<int>()
{
rnd.Next(1, GesamtAnzahl-1),
rnd.Next(1, GesamtAnzahl-1),
rnd.Next(1, GesamtAnzahl-1),
rnd.Next(1, GesamtAnzahl-1),
};
granzen.Sort();
for (int i = 0; i < GesamtAnzahl; i++)
{
var x = i;
var y = -1;
if ((i > granzen[0] && i < granzen[1]) ||
(i > granzen[2] && i < granzen[3]))
{
y = 1;
}
tempData[i, 0] = x;
tempData[i, 1] = y;
}
所以这很容易:如果输入在 2 个较低的随机生成的“边界”之间或在 2 个较高的数字之间,则输出为 1。否则输出为 1。
输入值是介于 -1 和 1 之间的标准值。所以 0 是 -1,200 是 1。
作为一个网络,我使用了带有 BipolarSigmoidFunction 的 BackPropagationLearning 和几个配置,例如:
Learning Rate: 0,1
Momentum: 0
Sigmoids alpha value: 2
Hidden Layer 1: 4 neurons
Hidden Layer 2: 2 neurons
Learning Rate: 0,1
Momentum: 0
Sigmoids alpha value: 2
Hidden Layer 1: 4 neurons
Hidden Layer 2: 2 neurons
Hidden Layer 3: 2 neurons
Learning Rate: 0,2
Momentum: 0
Sigmoids alpha value: 2
Hidden Layer 1: 4 neurons
Hidden Layer 2: 2 neurons
Hidden Layer 3: 2 neurons
等等。他们都没有工作。如此处所述:https ://towardsdatascience.com/beginners-ask-how-many-hidden-layers-neurons-to-use-in-artificial-neural-networks-51466afa0d3e应该足以拥有 2 个隐藏层。第一个有 4 个神经元,第二个有 2 个。
效果最好的配置是:
Learning Rate: 0,01
Momentum: 0
Sigmoids alpha value: 2
Hidden Layer 1: 4 neurons
Hidden Layer 2: 4 neurons
Hidden Layer 3: 4 neurons
Learning Rate: 0,02
Momentum: 0
Sigmoids alpha value: 2
Hidden Layer 1: 4 neurons
Hidden Layer 2: 2 neurons
这解决了大约 50% 的问题。
由于这是一个非常简单的问题,我想知道我是否做错了什么。我认为必须有一个具有更好结果的配置。
这个问题的最佳配置是什么,为什么?
编辑:新尝试
- 拥有更多数据并没有帮助。我创建了 5000 个 5000 个点的数据集(GesamtAnzahl = 5000)。然后网络的成功率甚至更差。
- 我尝试向数据集添加一个额外的常量输入(始终为 1),但这也降低了成功率
解决方案
我运行了很多随机创建的网络来解决这个问题,但是没有一个结构能够可靠地“解决”这个问题。
当然,其中一些能够解决一次,其中一些甚至两次,但只有一个解决了 3 次:
- 学习率:0,510141694690167
- 动量:0,962972165068133;
- 层数/神经元数:2 (14, 9)
- 西格蒙德阿尔法值:2;
推荐阅读
- python-3.x - FeatureTools:如何在数据集之间的关系是多对多的情况下使用特征工具?
- sql - 数据在那里,但计数返回 0
- python - 使用 strptime() 错误的日期时间类型转换
- reactjs - 如何使用 React js 复制 typeform
- symfony - 获取所有项目并在 Symfony 中对关系中使用的项目进行排序
- python - 如何优化 kwargs.values() 中的“字符串”:
- sas - 根据分布表为变量赋值
- android - Android - 在 AsyncTask 执行时显示进度对话框
- spring-boot - 可以在 keycloak 中使用基于 SMS 的 OTP 吗?
- git - 在分支和 ls-remote 中 git 不同的文件夹大小写