1 回答

TA貢獻1906條經驗 獲得超3個贊
一個很好的問題。首先,您必須了解網絡的實際工作原理。Dense層是一個完全連接的層,因此每個神經元都將與前一層的神經元建立連接?,F在您提到的網絡性能變慢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本身很重要的參數。更多數量的參數可以幫助學習更多的特征,并可能有助于獲得更好的結果。但這始終取決于數據,您將不得不對其進行試驗。
我希望以上解釋可能已經消除了您的疑慮。
添加回答
舉報