1 回答

TA貢獻1906條經(jīng)驗 獲得超3個贊
一個很好的問題。首先,您必須了解網(wǎng)絡的實際工作原理。Dense層是一個完全連接的層,因此每個神經(jīng)元都將與前一層的神經(jīng)元建立連接?,F(xiàn)在您提到的網(wǎng)絡性能變慢1000x與您的訓練數(shù)據(jù)無關,而與您的網(wǎng)絡有關。你的第二個網(wǎng)絡太大了,我無法將它放入我的 RAM 中,也無法放入 Google Colab 中。因此,出于演示目的,我會認為您的訓練數(shù)據(jù)是有(500, 100)形狀的。
對于您發(fā)布的采用上述形狀的第一個網(wǎng)絡,您的模型網(wǎng)絡如下所示:
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 參數(shù),它是150,801. 現(xiàn)在,如果我們以你的第二個例子為例。
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
_________________________________________________________________
您的總參數(shù)增加到9,031,101. 當您使用具有 length 的實際數(shù)據(jù)時,您可以想象20020。你的模型像任何東西一樣增加,我什至無法在我的 RAM 中安裝該模型。
因此總而言之,與第一個模型相比,您的第二個模型具有大量參數(shù)。這可能是訓練緩慢而性能更好的原因?更多的參數(shù)使學習更好。如果不實際查看您的數(shù)據(jù),就不能說是什么讓它變得更好。但是更多的參數(shù)可以帶來更好的性能。
注意:如果您刪除該Flatten層,您的網(wǎng)絡參數(shù)將減少,這是示例。
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
_________________________________________________________________
我希望我的回答能幫助您了解正在發(fā)生的事情以及兩種模型之間的區(qū)別。
更新:20/07 對于您的評論,我認為最好更新答案以便更清楚。您的問題是——參數(shù)的數(shù)量與網(wǎng)絡的形狀有何關系?
老實說,我不太清楚你的意思。我仍然會嘗試回答它。添加的層或神經(jīng)元越多,網(wǎng)絡和可訓練參數(shù)的數(shù)量就會增加。
所以你的實際問題是為什么層會Flatten增加你的參數(shù)。為此,您需要了解如何計算參數(shù)。
model.add(Dense(300, activation="relu", input_shape=(100,)))
units *(input_size + 1)考慮這是你的第一層參數(shù)的數(shù)量30300?,F(xiàn)在你加層的時候Flatten,其實這本身并沒有增加你的參數(shù),而是層的輸出Flatten輸入到下一層。因此請考慮以下示例。
_________________________________________________________________
flatten_2 (Flatten) (None, 30000) 0
_________________________________________________________________
dense_15 (Dense) (None, 300) 9000300
_________________________________________________________________
在這里你可以看到層的輸出大小Flatten是30000. 現(xiàn)在考慮上面的公式,您可以看到300 *(30000 + 1)將產(chǎn)生9000300本身很重要的參數(shù)。更多數(shù)量的參數(shù)可以幫助學習更多的特征,并可能有助于獲得更好的結果。但這始終取決于數(shù)據(jù),您將不得不對其進行試驗。
我希望以上解釋可能已經(jīng)消除了您的疑慮。
添加回答
舉報