1 回答

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