日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

二维数组各行分别求和_【PyTorch入门】之十分钟看懂二维卷积层的运算、实现及应用...

發布時間:2023/12/4 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二维数组各行分别求和_【PyTorch入门】之十分钟看懂二维卷积层的运算、实现及应用... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文鏈接:

【動手學深度學習筆記】之二維卷積層?mp.weixin.qq.com

1.二維卷積層

本節介紹卷積神經網絡中最常見的二維卷積層。二維卷積層常用來處理圖像數據,它具有兩個空間維度(高和寬)。

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.bias

1.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入门】之十分钟看懂二维卷积层的运算、实现及应用...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。