由于卷積神經網絡的設計是用于探索圖像數據,本節我們將以圖像為例。
互相關運算
嚴格來說,卷積層是個錯誤的叫法,因為它所表達的運算其實是互相關運算(cross-correlation),而不是卷積運算。在卷積層中,輸入張量和核張量通過互相關運算產生輸出張量。
首先,我們暫時忽略通道(第三維)這一情況,看看如何處理二維圖像數據和隱藏表示。下圖中,輸入是高度為3、寬度為3的二維張量(即形狀為 3 × 3 3\times3 3×3)。卷積核的高度和寬度都是2。
注意,輸出大小略小于輸入大小。這是因為我們需要足夠的空間在圖像上“移動”卷積核。稍后,我們將看到如何通過在圖像邊界周圍填充零來保證有足夠的空間移動內核,從而保持輸出大小不變。
def corr2d(X, K): """計算?維互相關運算。""" h, w = K.shape Y = torch.zeros((X.shape[0] - h + 1, X.shape[1] - w + 1)) for i in range(Y.shape[0]): for j in range(Y.shape[1]): Y[i, j] = (X[i:i + h, j:j + w] * K).sum() return Y
卷積層
卷積層對輸入和卷積核權重進行互相關運算,并在添加標量偏置之后產生輸出。所以,卷積層中的兩個被訓練的參數是卷積核權重核標量偏置。就像我們之前隨機初始化全連接層一樣,在訓練基于卷積層的模型時,我們也隨機初始化卷積核權重。
基于上面定義的corr2d函數實現二維卷積層。在__init__構造函數中,將weight和bias聲明為兩個模型參數。前向傳播函數調用corr2d函數并添加偏置。
class Conv2D(nn.Module): def __init__(self, kernel_size): super().__init__() self.weight = nn.Parameter(torch.rand(kernel_size)) self.bias = nn.Parameter(torch.zeros(1)) def forward(self, x): return corr2d(x, self.weight) + self.bias
高度和寬度分別為 h和 w的卷積核可以被稱為 h × w 卷積或 h × w 卷積核。我們也將帶有 h × w 卷積核的卷積層稱為 h × w 卷積層。
特征映射
下圖中輸出的卷積層有時被稱為特征映射(Feature Map),因為它可以被視為一個輸入映射到下一層的空間維度的轉換器。在CNN中,對于某一層的任意元素 x x x,其感受野(Receptive Field)是指在前向傳播期間可能影響 x x x計算的所有元素(來自所有先前層)。
注意,感受野的覆蓋率可能大于某層輸入的實際區域大小。
例如上圖:給定 2 × 2 卷積核,陰影輸出元素值19的接收域是陰影部分的四個元素。假設之前輸出為 Y ,其大小為 2 × 2 ,現在我們再其后附加一個卷積層,該卷積層以 Y 為輸入,輸出單個元素 z。再這種情況下, Y上的 z的接收字段包括 Y 的所有四個元素,而輸入的感受野包括最初所有九個輸入元素。
因此,當一個特征圖中的任意元素需要檢測更廣區域的輸入特征時,我們可以構建一個更深的網絡。
以上就是Python深度學習pytorch神經網絡圖像卷積運算詳解的詳細內容,更多關于pytorch神經網絡圖像卷積運算的資料請關注服務器之家其它相關文章!
原文鏈接:https://blog.csdn.net/weixin_43880225/article/details/120617288