我正在使用 Tensorflow 在 python 3.6.6 中构建神经网络。我想知道,如何选择隐藏层的数量和这些层中的节点数量?这是一个货币预测机器人,对于我应该使用的网络类型有什么建议吗?
有许多经验法则可用于确定隐藏层中使用的可接受的神经元数量,如下所示:
这三个规则为您提供了考虑的起点。最终,神经网络架构的选择将取决于反复试验。
您可以参考这篇文章
不幸的是,NN 不是一种适合所有模型的模型。您必须尝试不同的设置。您可以尝试如下:
从第 1 层和 1 个神经元开始,逐渐增加该层中的神经元,然后增加层数。
参考此主题:估计人工神经网络的神经元数量和层数
我没有来源,但我编写了下面的函数来确定 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()