隐藏层数和节点数如何选择?

问题描述 投票:0回答:3

我正在使用 Tensorflow 在 python 3.6.6 中构建神经网络。我想知道,如何选择隐藏层的数量和这些层中的节点数量?这是一个货币预测机器人,对于我应该使用的网络类型有什么建议吗?

python-3.x tensorflow neural-network
3个回答
4
投票

有许多经验法则可用于确定隐藏层中使用的可接受的神经元数量,如下所示:

  1. 隐藏神经元的数量应在输入的大小之间 层和输出层的大小。
  2. 隐藏神经元的数量应为输入大小的 2/3 层,加上输出层的大小。
  3. 隐藏神经元的数量应小于 输入层。

这三个规则为您提供了考虑的起点。最终,神经网络架构的选择将取决于反复试验。

您可以参考这篇文章


0
投票

不幸的是,NN 不是一种适合所有模型的模型。您必须尝试不同的设置。您可以尝试如下:

从第 1 层和 1 个神经元开始,逐渐增加该层中的神经元,然后增加层数。

参考此主题:估计人工神经网络的神经元数量和层数


0
投票

我没有来源,但我编写了下面的函数来确定 MLP 或类似网络(在我的用例中为 KAN 网络)的形状。

build_width
将每一层的隐藏单元计算为平方根和前一层单元一半之间的值(初始层作为输入特征)。您可以将
min_out
设置为大于输出神经元的数量,然后添加等于该数量的最终层。其他可选参数是控制网络深度(直接或间接)的超参数。

import numpy as np

def metamean(a: np.ndarray, t=0.5, ignore_harm=True):
    """
    Inspired by xkcd's "Geothmetic Meandian" comic.
    Used to calculate hidden units.

    Examples:
    >>> x = np.arange(1, 10000)
    >>> metamean(x)
    4315.009714928236
    >>> metamean(x, ignore_harm=False)
    2609.9917293934404
    """
    if a.min() < 0:
        raise ValueError("All elements must be non-negative.")
    if a.min() == 0:
        msg = "Array contains zeros."
        if not ignore_harm:
            raise ValueError(msg)
        warnings.warn(msg)
        return 0.0
    amean = np.mean(a)
    gmean = np.exp(np.mean(np.log(a)))
    if ignore_harm:
        if abs(amean - gmean) < t:
            return amean
        return metamean(np.array([amean, gmean]), t)
    else:
        hmean = len(a) / np.sum(1 / a)
        if abs(amean - hmean) < t:
            return gmean
        return metamean(np.array([amean, gmean, hmean]), t, False)


def build_width(n_in, min_out=1, max_depth=None, power_of_2=False, ignore_harm=True):
    """
    Examples:
    >>> build_width(1000, min_out=20)
    [1000, 189, 44]
    >>> build_width(100, max_depth=3, power_of_2=True)
    [100, 32, 8]
    """
    width = [n_in]
    if max_depth == 1:
        return width
    n_in = metamean(np.array([np.sqrt(n_in), n_in / 2]), ignore_harm)
    n_next = 2 ** round(np.log2(n_in)) if power_of_2 else round(n_in)
    if n_next < min_out:
        return width
    if max_depth is not None:
        max_depth -= 1
    width += build_width(n_in, min_out, max_depth, power_of_2, ignore_harm)
    if power_of_2:
        width[1:] = 2 ** np.round(np.log2(width[1:]))
    else:
        width[1:] = np.round(width[1:])
    width = np.array(width, dtype=int)
    return width[width >= min_out].tolist()
© www.soinside.com 2019 - 2024. All rights reserved.