1 回答
TA贡献1906条经验 获得超3个赞
一个很好的问题。首先,您必须了解网络的实际工作原理。Dense层是一个完全连接的层,因此每个神经元都将与前一层的神经元建立连接。现在您提到的网络性能变慢1000x与您的训练数据无关,而与您的网络有关。你的第二个网络太大了,我无法将它放入我的 RAM 中,也无法放入 Google Colab 中。因此,出于演示目的,我会认为您的训练数据是有(500, 100)形状的。
对于您发布的采用上述形状的第一个网络,您的模型网络如下所示:
model = Sequential()
model.add(Dense(300, activation="relu", input_shape=(100,)))
model.add(Dense(300, activation="relu"))
model.add(Dense(100, activation="relu"))
model.add(Dense(1, activation='linear'))
model.compile(optimizer='adam', loss='mse', metrics=['mean_absolute_error'])
Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_2 (Dense) (None, 300) 30300
_________________________________________________________________
dense_3 (Dense) (None, 300) 90300
_________________________________________________________________
dense_4 (Dense) (None, 100) 30100
_________________________________________________________________
dense_5 (Dense) (None, 1) 101
=================================================================
Total params: 150,801
Trainable params: 150,801
Non-trainable params: 0
_________________________________________________________________
记下 Total 参数,它是150,801. 现在,如果我们以你的第二个例子为例。
model1 = Sequential()
model1.add(Dense(300, activation="relu", input_shape=(100,1)))
model1.add(Flatten())
model1.add(Dense(300, activation="relu"))
model1.add(Dense(100, activation="relu"))
model1.add(Dense(1, activation='linear'))
model1.compile(optimizer='adam', loss='mse', metrics=['mean_absolute_error'])
Model: "sequential_4"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_14 (Dense) (None, 100, 300) 600
_________________________________________________________________
flatten_2 (Flatten) (None, 30000) 0
_________________________________________________________________
dense_15 (Dense) (None, 300) 9000300
_________________________________________________________________
dense_16 (Dense) (None, 100) 30100
_________________________________________________________________
dense_17 (Dense) (None, 1) 101
=================================================================
Total params: 9,031,101
Trainable params: 9,031,101
Non-trainable params: 0
_________________________________________________________________
您的总参数增加到9,031,101. 当您使用具有 length 的实际数据时,您可以想象20020。你的模型像任何东西一样增加,我什至无法在我的 RAM 中安装该模型。
因此总而言之,与第一个模型相比,您的第二个模型具有大量参数。这可能是训练缓慢而性能更好的原因?更多的参数使学习更好。如果不实际查看您的数据,就不能说是什么让它变得更好。但是更多的参数可以带来更好的性能。
注意:如果您删除该Flatten层,您的网络参数将减少,这是示例。
model1 = Sequential()
model1.add(Dense(300, activation="relu", input_shape=(100,1)))
model1.add(Dense(300, activation="relu"))
model1.add(Dense(100, activation="relu"))
model1.add(Dense(1, activation='linear'))
model1.compile(optimizer='adam', loss='mse', metrics=['mean_absolute_error'])
Model: "sequential_5"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_18 (Dense) (None, 100, 300) 600
_________________________________________________________________
dense_19 (Dense) (None, 100, 300) 90300
_________________________________________________________________
dense_20 (Dense) (None, 100, 100) 30100
_________________________________________________________________
dense_21 (Dense) (None, 100, 1) 101
=================================================================
Total params: 121,101
Trainable params: 121,101
Non-trainable params: 0
_________________________________________________________________
我希望我的回答能帮助您了解正在发生的事情以及两种模型之间的区别。
更新:20/07 对于您的评论,我认为最好更新答案以便更清楚。您的问题是——参数的数量与网络的形状有何关系?
老实说,我不太清楚你的意思。我仍然会尝试回答它。添加的层或神经元越多,网络和可训练参数的数量就会增加。
所以你的实际问题是为什么层会Flatten增加你的参数。为此,您需要了解如何计算参数。
model.add(Dense(300, activation="relu", input_shape=(100,)))
units *(input_size + 1)考虑这是你的第一层参数的数量30300。现在你加层的时候Flatten,其实这本身并没有增加你的参数,而是层的输出Flatten输入到下一层。因此请考虑以下示例。
_________________________________________________________________
flatten_2 (Flatten) (None, 30000) 0
_________________________________________________________________
dense_15 (Dense) (None, 300) 9000300
_________________________________________________________________
在这里你可以看到层的输出大小Flatten是30000. 现在考虑上面的公式,您可以看到300 *(30000 + 1)将产生9000300本身很重要的参数。更多数量的参数可以帮助学习更多的特征,并可能有助于获得更好的结果。但这始终取决于数据,您将不得不对其进行试验。
我希望以上解释可能已经消除了您的疑虑。
添加回答
举报