Deep-Learning

在卷積神經網絡 (CNN) 中,當對圖像進行卷積時,操作是使用點積還是元素乘法之和?

  • March 19, 2018

下面的示例取自deeplearning.ai中的講座,顯示結果是逐元素乘積的總和(或“逐元素乘法”。紅色數字表示過濾器中的權重:

在此處輸入圖像描述

但是,大多數資源都說它是使用的點積

“……我們可以將神經元的輸出重新表示為 ,其中是偏置項。換句話說,我們可以通過 y=f(x*w) 計算輸出,其中 b 是偏置項。換句話說,我們可以通過執行輸入和權重向量的點積,添加偏置項來產生 logit,然後應用變換函數來計算輸出。”

布杜馬,尼基爾;洛卡西奧,尼古拉斯。深度學習的基礎知識:設計下一代機器智能算法(第 8 頁)。奧萊利媒體。Kindle版。

“我們採用 553 過濾器並將其滑過整個圖像,並在此過程中採用過濾器和輸入圖像塊之間的點積。對於所取的每個點積,結果都是一個標量。”

https://medium.com/technologymadeeasy/the-best-explanation-of-convolutional-neural-networks-on-the-internet-fbb8b1ad5df8

“每個神經元接收一些輸入,執行點積,並可選擇非線性地跟隨它。”

http://cs231n.github.io/convolutional-networks/

“卷積的結果現在相當於執行一個大矩陣乘法 np.dot(W_row, X_col),它評估每個過濾器和每個感受野位置之間的點積。”

http://cs231n.github.io/convolutional-networks/

但是,當我研究如何計算矩陣的點積時,似乎點積與逐個元素的乘法求和不同。實際使用了什麼運算(逐個元素乘法或點積?),主要區別是什麼?

CNN 中的任何給定層通常具有 3 個維度(我們將它們稱為高度、寬度、深度)。卷積將產生一個具有新(或相同)高度、寬度和深度的新層。然而,該操作在高度/寬度和深度上的執行方式不同,這就是我認為會導致混淆的原因。

我們先來看看如何對輸入矩陣的寬進行卷積操作。這種情況完全按照您的圖像中的描述執行,並且肯定是兩個矩陣的元素乘法

理論上

二維(離散)卷積由以下公式計算:

$$ C \left[ m, n \right] = \sum_u \sum_υ A \left[ m + u, n + υ\right] \cdot B \left[ u, υ \right] $$

正如你可以看到的每個元素 $ C $ 計算為單個元素的乘積之和 $ A $ 有一個元素 $ B $ . 這意味著每個元素 $ C $ 是根據元素乘法的總和計算的 $ A $ 和 $ B $ .

在實踐中

您可以使用任意數量的包測試上述示例(我將使用scipy):

import numpy as np
from scipy.signal import convolve2d

A = np.array([[1,1,1,0,0],[0,1,1,1,0],[0,0,1,1,1],[0,0,1,1,0],[0,1,1,0,0]])
B = np.array([[1,0,1],[0,1,0],[1,0,1]])
C = convolve2d(A, B, 'valid')
print(C)

上面的代碼將產生:

[[4 3 4]
[2 4 3]
[2 3 4]]

現在,對輸入深度的捲積運算實際上可以被認為是一個點積,因為相同高度/寬度的每個元素乘以相同的權重並將它們相加。這在 1x1 卷積的情況下最為明顯(通常用於在不改變層尺寸的情況下操縱層的深度)。然而,這不是 2D 卷積的一部分(從數學的角度來看),而是卷積層在 CNN 中所做的事情。

注意

1:話雖如此,我認為您提供的大多數來源至少可以說具有誤導性的解釋並且不正確。我不知道有這麼多消息來源有這個操作(這是 CNN 中最重要的操作)錯誤。我想這與卷積對標量之間的乘積求和以及兩個標量之間的乘積也稱為點積這一事實有關。

2:我認為第一個參考是指全連接層而不是卷積層。如果是這種情況,FC 層確實會執行所述的點積。我沒有其他上下文來證實這一點。

tl;dr您提供的圖片對於操作的執行方式是 100% 正確的,但這不是完整的圖片。CNN 層有 3 個維度,其中兩個按圖示處理。我的建議是檢查卷積層如何處理輸入的深度(您可以看到的最簡單的情況是 1x1 卷積)。

引用自:https://stats.stackexchange.com/questions/335321

comments powered by Disqus