Python反向传播隐藏层比例

Python Back propagation hidden layer ratio

我正在尝试在 Python 中创建反向传播网络。 我有 14 个输入特征和 1 个输出特征。我打算使用多层神经网络。

我有以下问题

1) i/p和隐藏层的比例应该是多少?

我对隐藏层数有点困惑。

谁能帮帮我。

谢谢,

更新:

输入和我的标签

[[235, 2, -16.033171734306542, -828.0208534934904, 232965.81361002076, 2000.0, 11182359.053280996, 8565.232332709325, 4000.0, 0.019363246307941673, 1052153, 11313.47311827957, 105.79752842706958, 94],[10]],
[[-604, -6, 8.086235575302165, 380.8373042348658, 41190.53784866458, 2000.0, 1977145.8167358998, 420.30048579171057, 4000.0, 0.02123278230725872, 3436716, 36953.93548387097, 191.20880866382254, 94],[10]],
[[1825, 19, 14.022865897726179, -713.1319698367766, 97114.42605383566, 2000.0, 4661492.450584112, 1033.7486227812578, 4000.0, -0.019663774014977573, 3648687, 39233.1935483871, 197.01730672439965, 94],[10]],
[[-281, -2, -1.5372950205773066, 454.058413755312, 26895.611774858942, 2000.0, 1290989.3651932292, 765.2497914458995, 4000.0, -0.0033856767631790675, 5459685, 58706.290322580644, 241.00156704708152, 94],[10]],
[[1254, 13, 7.42946537169472, 236.81791472792207, 37351.8426913391, 2000.0, 1792888.4491842769, 923.863841127187, 4000.0, 0.03137205806507656, 5618776, 60416.94623655914, 244.48765360638856, 94],[10]],
[[55, 0, -6.799835826239174, -297.6057130887548, 7874.250847696101, 2000.0, 377964.04068941285, 66.64091494961357, 4000.0, 0.022848472079604405, 4150489, 44628.913978494624, 210.12886117302483, 94],[10]],
[[97, 1, 9.01187671470769, -55.32899089341877, 8218.299323445417, 2000.0, 394478.36752538, 127.66669905739745, 4000.0, -0.16287802414592073, 5331935, 57332.63440860215, 238.16530554628952, 94],[10]],
[[229, 2, 1.9250596458545362, -137.23162431944527, 16672.65593718128, 2000.0, 800287.4849847014, 130.52997477489504, 4000.0, -0.014027813599097374, 6905755, 74255.43010752689, 271.045159933551, 94],[10]],
[[107, 1, 6.470150940664045, 29.918507467688016, 26956.56324395225, 2000.0, 1293915.035709708, 165.12995290667556, 4000.0, 0.21625914820957587, 5269967, 56666.31182795699, 236.77727661962044, 94],[10]],
[[500, 5, 8.286114608469786, 122.0075128161886, 35446.863937609196, 2000.0, 1701449.4690052415, 253.11481415842877, 4000.0, 0.06791478997652628, 4669072, 50205.07526881721, 222.86986948307808, 94],[10]],
[[414, 4, 27.324467984592186, 485.55010485356297, 27500.260236682432, 2000.0, 1320012.4913607568, 214.55557670874316, 4000.0, 0.05627527975271053, 2489806, 26772.107526881722, 162.74918700976798, 94],[10]],
[[1044, 11, 4.238057309288552, -292.40132784218787, 8680.945668556162, 2000.0, 416685.3920906958, 475.7867593841577, 4000.0, -0.014493974225643315, 7271678, 78190.08602150538, 278.1335589168353, 94],[10]],
[[-528, -5, -10.252042152315722, 129.48476543188406, 20929.59991855366, 2000.0, 1004620.7960905757, 137.63411934477546, 4000.0, -0.07917566300653991, 7299292, 78487.01075268818, 278.6611608265341, 94],[10]]

    ]

所以重构问题w/r/t实用objective:你只需要用一个整数值来表示构成隐藏层的神经元的数量,这样:

  • 你的求解器(梯度下降、共轭梯度等) 在训练期间收敛;和

  • 总误差(例如 RMSE)低于您认为可以接受的某个阈值。

几乎可以肯定有几个值可以同时满足这两个标准;更重要的是,你没有理由不能在训练期间手动调整这个值。

其实这是一种常见的做法,通常称为剪枝

哪些节点是修剪的候选节点?那些与他们相关联的权重值最小的人 (记住,权重适用于节点之间的连接而不是节点本身)。如果它们是 接近零,那么您就知道它们对结果的影响很小。 (一种常用的技术 目视检查这些权重是 Hinton 图(matplotlib 库中有一个代码片段 主页)。

特别是后者,我建议先选择一些略大于 你的输入层。为什么?很明显,这些层的大小不能相等,否则您的网络不会 具有非线性,因此留下更多或更少的神经元(相对于输入层)。作为初步猜测 交互(即在迭代过程中进行调整)前者是可取的,因为多余的 容量将帮助您的网络收敛,而这正是您想要的。一旦收敛,然后向下调整 隐藏层中的节点数,并查看这样做对总误差的影响。

总之,在这种情况下,从 16 或 18 个神经元开始,观察迭代过程并相应地进行修剪。

如果您更喜欢经验较少的方法(即,背后有一些数字理由并试图确定最佳网络大小 事前 而不是通过迭代和修剪) ,请参阅 accepted answer(我的)类似问题。