理解卷積神經網絡中的輸入與輸出形狀(Keras實現)

2019-10-14     人工智慧遇見磐創

即使我們從理論上理解了卷積神經網絡,在實際進行將數據擬合到網絡時,很多人仍然對其網絡的輸入和輸出形狀(shape)感到困惑。本文章將幫助你理解卷積神經網絡的輸入和輸出形狀。

讓我們看看一個例子。CNN的輸入數據如下圖所示。我們假設我們的數據是圖像的集合。

輸入的形狀

你始終必須將4D數組作為CNN的輸入。因此,輸入數據的形狀為(batch_size,height,width,depth),其中第一維表示圖像的batch大小,其他三個維表示圖像的各個屬性,即高度,寬度和深度。深度就是色彩通道的數量。例如,RGB圖像的深度為3,而灰度圖像的深度為1。

輸出形狀

CNN的輸出也是4D數組。其中batch大小將與輸入batch大小相同,但是圖像的其他3個尺寸可能會根據濾波器(filter) ,內核大小(kernel size)和填充值(padding)而變化。

讓我們看一下下面的代碼片段。

不要在這裡被input_shape參數欺騙,以為輸入形狀是3D,但是在進行訓練時必須傳遞一個4D數組,該數據的形狀應該是(batchsize,10,10,3)。由於inputshape參數中沒有batch值,因此在擬合數據時可以採用任何batch大小。

而且正如你所見,輸出的形狀為(None,10,10,64)。第一個維度表示batch大小,目前為"None"。因為網絡事先不知道batch大小。擬合數據後,將使用擬合數據時給出的batch大小來代替"None"。

讓我們看看另一個代碼片段。

在這裡,我將inputshape參數替換為batchinput_shape。顧名思義,此參數將事先提供batch大小,並且在擬合數據時你無法提供任何其他batch大小。例如,在本例你必須用batch大小為16的數據來擬合網絡。

你可以從上圖看到輸出形狀的batch大小是16而不是None。

在卷積層上附加全連接(Dense)層

我們可以簡單地在另一個卷積層的頂部添加一個卷積層,因為卷積的輸出維度數與輸入維度數相同。

通常,我們在卷積層的頂部添加Dense層以對圖像進行分類。但是,Dense層需要形狀為(batch_size,units)的數據。卷積層的輸出是4D的數組。因此,我們必須將從卷積層接收的輸出的尺寸更改為2D數組。

我們可以通過在卷積層的頂部插入一個Flatten層來做到這一點。Flatten層將3維圖像變形成一個維。現在我們得到一個2D形狀的數組(batchsize,squashedsize),這是Dense層需要的輸入形狀。

匯總

  • 你始終必須將形狀為(batch_size, height, width, depth)的4D數組輸入CNN。
  • CNN的輸出數據也是形狀(batch_size, height, width, depth)的4D數組。
  • 要在CNN層的頂部添加一個Dense層,我們必須使用keras的Flatten層將CNN的4D輸出更改為2D。
文章來源: https://twgreatdaily.com/PYeryW0BMH2_cNUg2PwH.html