2016-08-02 64 views
0

我正嘗試使用nolearn並使用ConcatLayer來組合多個輸入。只要每個輸入具有相同的類型和形狀,它就會很好地工作。我有三種不同類型的輸入,最終會產生一個標量輸出值。嘗試使用具有不同形狀輸入的ConcatLayer

  • 第一輸入是尺寸(288,1001)

  • 第二輸入是長度87

  • 第三的向量是一個標量值的圖像

我在第一個輸入上使用Conv2DLayer(s)。 第二個輸入使用Conv1DLayer或DenseLayer(不知道哪個會更好,因爲我無法得到足夠的結果來看看會發生什麼) 我甚至不確定第三個輸入應該如何設置,因爲它只是一個我想要饋入網絡的價值。

的代碼在ConcatLayer吹了: 「不匹配:輸入形狀必須是除了在上述串列軸線」

這將是永遠感激,如果有人能寫出一個超級簡單的網絡結構可以接受這些類型的輸入並輸出單個標量值。我一整天都在Google上搜索,根本找不到這個。

擬合函數看起來是這樣的,如果它是有幫助的就知道了,你可以看到我輸入字典,一個項目對每個類型的輸入:

X = {'base_input': X_base, 'header_input': X_headers, 'time_input':X_time} 
net.fit(X, y) 

回答

1

這是很難正確地回答這個問題,因爲 - 這取決於。 沒有關於你正在做什麼以及你正在處理什麼數據的信息,我們在這裏玩猜謎遊戲,因此我必須回到給出一般提示。

首先ConcatLayer抱怨是完全合理的。將標量添加到圖像的像素值並沒有多大意義。所以你應該考慮你真正想要的東西。這很可能結合了三個來源的信息。

你是對的,建議用2D卷積處理圖像,用1D卷積處理序列數據。如果你想產生一個標量值,你可能希望稍後使用稠密層來壓縮信息。 因此,自然而然地,將三個分支的低級別處理獨立,然後將它們連接在一起。

沿東西線:

Image -> conv -> ... -> conv -> dense -> ... -> dense -> imValues 
Timeseries -> conv -> ... -> conv -> dense ... -> dense -> seriesValues 
concatLayer([imValues, seriesValues, Scalar] -> dense -> ... -> dense with num_units=1 

另一個經常合理少的選擇是,以在圖像的低級別處理添加的信息。考慮到標量/時間序列的知識,如果本地處理更容易,這可能是有意義的。

這種架構可能看起來像:

concatLayer(seriesValues, scalar) -> dense -> ... -> reshape((-1, N, 1, 1)) 
    -> Upscale2DLayer(Image.shape[2:3]) -> globalInformation 
concatLayer([globalInformation, Image]) -> 2D conv filtersize=1 -> conv -> ... -> conv 

注意,你幾乎肯定會想要去的第一個選項。

一個不相關的事情我注意到,是你的輸入圖像的巨大尺寸。你應該減少它(調整大小/補丁)。除非您有大量的數據和大量的內存和計算能力,否則您將過度使用或浪費硬件。

+0

出於某種原因,我沒有想到我可以用DenseLayer重塑它。我想我以爲圖書館會有一種合併的方式,但經過進一步的思考,我意識到這樣一個過程可能無法用合理的默認方式來概括。然後,很明顯,我將不得不提供重塑所需的圖層。感謝您的非常有用的答案! – Beaker

相關問題