二维数组各行分别求和_【PyTorch入门】之十分钟看懂二维卷积层的运算、实现及应用...
原文鏈接:
【動手學深度學習筆記】之二維卷積層?mp.weixin.qq.com1.二維卷積層
本節介紹卷積神經網絡中最常見的二維卷積層。二維卷積層常用來處理圖像數據,它具有兩個空間維度(高和寬)。
1.1二維互相關運算
1.1.1原理分析
在二維互相關運算中,卷積窗口從左上角開始,每次向右滑動一列,直到到達最右邊,然后回到最左邊的列并向下滑動一行,繼續重復上面的動作,直到到達右當卷積窗口滑動到某個位置時,窗口中的輸入子片段與卷積窗口陣列按元素相乘并求和,并得到排列中相應位置的元素。
聽著實在是復雜,看個實例吧。
我們對大小為
的輸入二維數組和大小為的二維核數組(卷積窗口大小)進行二維互相關運算。根據互相關運算的過程,首先是核排列會和
進行運算然后向右滑動一列,核排列與
進行運算上一次卷積窗體已經滑到了最右列,所以現在卷積窗體返回最垂直列并向下滑動一行,核排列與
進行運算現在卷積窗口滑動到了右下角,核排列與
進行運算最后將四次運算的數,與窗口同順序分開在輸出二維排列中,得到輸出二維排列。
1.1.2程序實現
分析上述過程可知,輸出數組的大小與輸入數組,核數組存在關系:
式中,
分別為輸出數組,輸入數組和核數組的行數; 分別為輸出數組,輸入數組和核數組的列數。并且橫向滑動次數和
相同,初步滑動次數與相同。根據數組行列數之間的關系和運算方法,最終程序實現如下。
def cross(X,K):H_i = X.shape[0]W_i = X.shape[1]h = K.shape[0]w = K.shape[1]Y = torch.zeros((H_i-h+1,W_i-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現在來構造輸入多重和核分布,測試一下互相關運算函數
X = torch.tensor([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) K = torch.tensor([[0, 1], [2, 3]]) cross(X, K)得到輸出相對為
tensor([[19., 25.],[37., 43.]])1.2二維卷積層
窗口形狀為
的卷積層。二維卷積層的模型參數為卷積核(重量)和標量偏差(bias)。訓練模型時,同樣是線隨機初始化模型參數,然后不斷更新迭代參數。二維卷積層將輸入和卷積核做互相關運算,并加上一個標量偏差來得到輸出。
1.2.1實現二維卷積層
class Conv(nn.Module):def __init__(self, kernel_size):super(Conv, self).__init__()#類型為Parameter的tensor自動添加到參數列表self.weight = nn.Parameter(torch.randn(kernel_size))self.bias = nn.Parameter(torch.randn(1)) #只有一組輸出,所以只需要一個偏差參數def forward(self, x):#正向傳播:互相關運算之后加上偏差return cross(x, self.weight) + self.bias1.3互相關運算的應用
下面使用二維卷積層檢測圖像中物體的邊緣(發生變化的位置)。
首先初始化一張
的圖像,令它的中間四列為黑(0),其余為白(1)。X = torch.ones(6,8) X[:,2:6] = 0輸出X為
tensor([[1., 1., 0., 0., 0., 0., 1., 1.],[1., 1., 0., 0., 0., 0., 1., 1.],[1., 1., 0., 0., 0., 0., 1., 1.],[1., 1., 0., 0., 0., 0., 1., 1.],[1., 1., 0., 0., 0., 0., 1., 1.],[1., 1., 0., 0., 0., 0., 1., 1.]])然后構造一個大小為
的卷積核K,當它與輸入做互相關運算時,如果橫向相鄰元素相同,輸出為0;否則輸出為非0。K = torch.tensor([[1, -1]])最后使用互相關運算,計算得到輸出值。
Y = cross(X, K)輸出數組Y為:
tensor([[ 0., 1., 0., 0., 0., -1., 0.],[ 0., 1., 0., 0., 0., -1., 0.],[ 0., 1., 0., 0., 0., -1., 0.],[ 0., 1., 0., 0., 0., -1., 0.],[ 0., 1., 0., 0., 0., -1., 0.],[ 0., 1., 0., 0., 0., -1., 0.]])可以看出,我們將從白到黑的邊緣和從黑到白的邊緣分別檢測到1和-1。其余部分的輸出全是0。使用卷積核可以有效地表征局部空間。
1.4二維卷積層的應用
這一部分將使用1.3中的輸入數組X和輸出數組Y來訓練卷積神經網絡,最終得到卷積核。
net = Conv(kernel_size = (1,2)) step =20#訓練周期 lr = 0.01#學習率for i in range(step):Y_hat = net(X)l = ((Y_hat - Y) ** 2).sum()l.backward()net.weight.grad.fill_(0)net.bias.grad.fill_(0)if (i+1)%5 ==0:print('Step %d, loss %.3f' % (i + 1, l.item()))print("weight:",net.weight.data) print("bias:",net.bias.data)各個學習周期的損失為
Step 5, loss 7.531 Step 10, loss 1.380 Step 15, loss 0.304 Step 20, loss 0.076訓練結束后模型參數為
weight: tensor([[ 0.8960, -0.9054]]) bias: tensor([0.0053])訓練得到的參數與真實參數[1,-1]還是比較接近的。
1.5卷積運算
為了得到卷積運算的輸出,我們只需將核重疊到左右并排上下,再與輸入數組做互相關運算。
1.6特征圖和感受野
二維卷積層輸出的二維細分可以被預定輸入數組在空間尺寸上某一級的表征,也就是特征圖。
如1.1中輸入數組中的
是輸出數組中的感受野。整個輸入樣本都是輸出樣本的感受野。
總結
以上是生活随笔為你收集整理的二维数组各行分别求和_【PyTorch入门】之十分钟看懂二维卷积层的运算、实现及应用...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS 16升级名单曝光 iPhone
- 下一篇: 世卫:2022年必须终止新冠大流行 美国