我想训练神经网络进行信号分类。
网络有50个输入格式:[ - 1] 1
50个隐藏层(不受限制)
10个输出
双曲正切(不受限制)
我被限制在图书馆(hnn)进行培训。
我的问题是我不知道什么是适当的学习率和培训迭代次数
我在该范围内尝试了许多可能的设置:
[1K - 10K]训练迭代
[0.001 - 1.5]学习率
但是当我将训练数据再次提供给训练好的神经网络时,我得到了非常糟糕的结果(以混淆矩阵的形式) - 最多2个类别被正确分类。
输入数据的这两个参数的适当集合是什么?
在文献中搜索类似的案例时,我发现不同的案例使用不同的参数设置而没有真正解释推理。
实验: 提到的库有一个函数 trainUntilErrorBelow (不言自明)。我已经使用这个函数来看看通过改变激活函数和隐藏层数来达到某个错误的速度有多快。
我选择了以下内容:
最小错误:300
学习率:0.01
结果: 双曲正切:
1个隐藏层(50个神经元) - 32.12秒
2个隐藏层(50/50个神经元) - 31.51秒
3个隐藏层(50/50/50个神经元) - 12.18秒
4个隐藏层(50/50/50/50个神经元) - 42.28秒
乙状结肠:
1个隐藏层(50个神经元) - 21.32秒
2个隐藏层(50/50神经元) - 274.29秒
3个隐藏层(50/50/50个神经元) - ∞sec
4个隐藏层(50/50/50/50个神经元) - ∞sec
假设具有3个隐藏层(50/50/50神经元)的双曲正切激活函数是网络架构的不错选择是否合理?
答案 0 :(得分:0)
(意图是评论,但是太大了:P)
我认为这里最有用的工具是查看learning curves以查看重量是否在移动(你应该看到一条曲线像那里的蓝色那样下降。从那里,你可以玩需要考虑的事项:学习率可能太大或太低,意味着权重的变化在每次迭代中都会变大或变小。前者可能导致不收敛,后者收敛慢。如果权重变化太大,那么你可能会错过一些不错的错误最小值。无论如何,这些情节肯定会给你一些关于发生了什么的提示。这也适用于动量(如果你使用它):有时你会在那里放一个太大的值,权重获得动力并且也会错过最小值。
训练迭代:我总是训练200到500个时期,并查看学习情节。如果我决定使用特定的配置,我会训练很多(10,000)个时代,去吃点东西,然后再看看这些情节,以确定在我离开时没有什么奇怪的事情;)大部分时间我看到1000年后的变化很小(至少,趋势仍以同样的速度下降)。
另一条评论(非常谨慎):我不知道你的问题,但我一直只使用一个隐藏的输入而且它有效。在这里,我看到隐藏节点数量的一些变化,这本身就是一个问题。第一次尝试时,我主要选择num_hidden = num_inputs
。我会谦虚地建议先开始寻找更小,更简单的网络。 ;)