1

一個問題關於與多個輸出keras迴歸:Keras迴歸多個輸出

你能解釋一下beteween這個網的區別:

兩個輸入 - >兩個輸出

input = Input(shape=(2,), name='bla') 
hidden = Dense(hidden, activation='tanh', name='bla')(input) 
output = Dense(2, activation='tanh', name='bla')(hidden) 

和:兩個單輸入 - >兩個單輸出:

input = Input(shape=(2,), name='speed_input') 
hidden = Dense(hidden_dim, activation='tanh', name='hidden')(input) 
output = Dense(1, activation='tanh', name='bla')(hidden) 

input_2 = Input(shape=(1,), name='angle_input') 
hidden_2 = Dense(hidden_dim, activation='tanh', name='hidden')(input_2) 
output_2 = Dense(1, activation='tanh', name='bla')(hidden_2) 

model = Model(inputs=[speed_input, angle_input], outputs=[speed_output, angle_output]) 

它們的行爲非常相似。其他時候,我完全把它們分開,那麼這兩個網就像他們應該做的那樣。

這是正常的,兩個單輸出網的行爲比兩個輸出的更大的一個更容易理解,我不認爲差異可能是巨大的,就像我經歷過的。

非常感謝:)

回答

1

這可以追溯到神經網絡如何操作。在你的第一個模型中,每個隱藏的神經元接收2個輸入值(因爲它是一個'密集'層,輸入傳播到每個神經元)。在您的第二個模型中,您的神經元數量是其的兩倍,但其中每個只接收speed_inputangle_input,並且僅適用於該數據而不是整個數據。因此,如果speed_inputangle_input是2個完全不相關的屬性,那麼您可能會看到分裂2個模型的更好性能,因爲神經元沒有接收基本上是噪聲輸入的內容(他們不知道您的輸出是否對應到您的輸入,他們只能嘗試優化您的損失功能)。基本上,你正在創建2個獨立的模型。

但是在大多數情況下,您想要提供組合在一起繪製預測的模型相關屬性。因此,拆分模型是沒有意義的,因爲你只是剝離了必要的信息。

+0

非常感謝您抽出寶貴時間:) So Keras在第二個例子中完全分離了這兩個網絡嗎?兩個獨立建構和學習網(兩種不同的腳本)和這個選項之間的區別在哪裏? – Asdf11

+0

要回答你的第一個問題,不,不是。這兩個網絡仍然在同一個模型對象中,但在計算上它們完全不相關。 –

+0

有2個不同的模型對象的區別是,現在你必須在同一時間和相同數量的例子進行訓練。一方面,這有點不方便。但讓我們說,如果你的問題總是需要兩個網絡的輸出,你可以通過訓練和並排運行來節省時間和內存。 –