深度学习:初始层中的节点多于输入是否有意义——对于表格数据

数据挖掘 神经网络 深度学习 喀拉斯
2022-02-20 11:12:58

我正在看几个 keras 教程,有些东西让我觉得很奇怪。所以在这两个教程中,都是关于住房数据的,网络第一层的节点数大于数据集本身的列数。注意:我说的是表格数据,而不是图像数据或自动编码器。我知道自动编码器会在解码阶段变宽,我知道分割模型会在反卷积阶段变宽。这两个示例似乎都与我在这些教程中看到的不同。

第一个教程使用加利福尼亚州金斯县的房价数据来创建一个简单的神经网络。在这种情况下,Kings County 数据只有 19 个变量,但网络本身具有大小为 100 个节点的初始密集层。这是代码:

def basic_model_1(x_size, y_size):
    t_model = Sequential()
    t_model.add(Dense(100, activation="tanh", input_shape=(x_size,)))
    t_model.add(Dense(50, activation="relu"))
    t_model.add(Dense(y_size))
    print(t_model.summary())
    t_model.compile(loss='mean_squared_error',
        optimizer=Adam(),
        metrics=[metrics.mae])
    return(t_model)

在第二个示例中,我查看了 Aurelion Geron 最近关于 Keras 和 Tensorflow 的书。在第 10 章中,他使用一些不同的加利福尼亚住房数据来估计 keras 神经网络。同样在这种情况下,他在数据集中有 8 个变量,但他从 30 的密集层开始。

需要注意的是,我没有看到任何列被转换为单热编码或一些稀疏公式。

这种网络开始比数据更宽的情况对我来说似乎很奇怪,但也许这只是我来自统计界。谁能解释一下?谢谢。

2个回答

这似乎有点令人困惑,尤其是对于新手来说。但这里的问题基本上是在一些术语上达成一致。

根据定义,典型的神经网络有 3 种类型的层,即输入、隐藏和输出。由于 Input 层除了将输入值传递给下一层之外没有特定的功能,所以很多时候没有提及。该层没有任何权重、偏差或激活,并且在绝大多数框架(例如 Keras)中,您不必在代码中编写它。input_shape=(x_size,)您只需要使用第一个隐藏层中的参数指定该输入层的大小。

您在示例中调用的 100 个节点的初始层实际上是第一个隐藏层。可以是任何尺寸。你的直觉是完全正确的:输入层中的节点数量当然必须与输入的大小相匹配。

希望这可以澄清。

在此处输入图像描述

这种网络开始比数据更宽的情况对我来说似乎很奇怪,但也许这只是我来自统计界。谁能解释一下?

第一个值不代表输​​入神经元的数量。它代表该层的输出。input_shape 被输入到第一层。因此,它是正确的,并且您的怀疑是真实的,但是如果您阅读下面的解释,您会发现我们误解了该论点。 在此处输入图像描述

您可能知道,这里我们使用了一个多层感知器:我们有一个输入层、一些隐藏层和一个输出层。当我们制作模型时,重要的是第一层需要明确输入形状,即模型需要知道预期的输入形状,例如input_shape=(x_size,)

t_model.add(Dense(100, activation="tanh", input_shape=(x_size,)))

在第一个密集层中,激活参数采用来自该密集层之前的输入层的 input_shape 值 tanh。 注意:我们看到第一层有100 作为 Dense() 的单位参数的第一个值,这是输出空间的维数,实际上是 100 个隐藏单元。这意味着模型将输出形状为 (*, 100) 的数组:这是输出空间的维度,而不是输入类似地,第二层的输入为 100(无需提及,因为 keras 会自动映射,第二层的输出为 50。)

t_model.add(Dense(50, activation="relu"))

中间层(第 2 层)使用 relu 激活函数。该层的输出将是形状为 (*,50) 的数组,将作为最后一层的输入。

t_model.add(Dense(y_size))