[pytorch、学习] - 5.1 二维卷积层
參考
5.1 二維卷積層
卷積神經(jīng)網(wǎng)絡(luò)(convolutional neural network)是含有卷積層(convolutional layer)的神經(jīng)網(wǎng)絡(luò)。本章介紹的卷積神經(jīng)網(wǎng)絡(luò)均使用最常見的二維卷積層。它有高和寬兩個空間維度,常用來處理圖像數(shù)據(jù)。本節(jié)中,我們將介紹簡單形式的二維卷積層的工作原理。
5.1.1 二維互相關(guān)運(yùn)算
# 將上述過程實(shí)現(xiàn)在 corr2d 函數(shù)里.它接受輸入數(shù)組 X 與核數(shù)組 K,并輸出數(shù)組 Y import torch from torch import nndef corr2d(X, K): # 本函數(shù)已保存在d2lzh_pytorch包中方便以后使用h, w = K.shapeY = 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 X = torch.tensor([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) K = torch.tensor([[0, 1], [2, 3]]) corr2d(X, K)5.1.2 二維卷積層
二維卷積層將輸入和卷積核做互相運(yùn)算,并加上一個標(biāo)量偏差來得到輸出。卷積層的模型參數(shù)包括了卷積核和標(biāo)量偏差。在訓(xùn)練模型的時候,通常我們先對卷積核進(jìn)行隨機(jī)初始化,然后不斷迭代卷積核和偏差。
下面基于corr2d函數(shù)實(shí)現(xiàn)一個自定義的二維卷積層。在構(gòu)造函數(shù)__init__里,我們聲明了weight和bias這兩個模型參數(shù)。前向計(jì)算函數(shù)forward則是直接調(diào)用corr2d函數(shù)在加上偏差
class Conv2D(nn.Module):def __init__(self, kernel_size):super(Conv2D, self).__init__()self.weight = nn.Parameter(torch.randn(kernel_size))self.bias = nn.Parameter(torch.randn(1))def forward(self, x):return corr2d(x, self.weight) + self.bias5.1.3 圖像中物體邊緣檢測
下面我們來看一個卷積的簡單應(yīng)用: 檢測圖像物體的邊緣,即找到像素變化的位置。首先我們構(gòu)造一張 6 * 8 的圖像。它中間4列為黑(0),其余為白(1)
X = torch.ones(6, 8) X[:, 2:6] = 0. X
然后我們構(gòu)造一個高和寬分別為1和2的卷積核K。當(dāng)它與輸入做相關(guān)運(yùn)行時,如果橫向相鄰元素相同,輸出為0; 否則輸出為非0.
下面將輸入X和我們設(shè)計(jì)的卷積核K做相關(guān)運(yùn)算。可以看出,我們將從白到黑和從黑到白的邊緣分別檢測成了1和-1。其余部分的輸出全是0
Y = corr2d(X, K) Y5.1.4 通過數(shù)據(jù)學(xué)習(xí)核數(shù)組
最后我們來看一個例子,它使用物體邊緣檢測中的輸入數(shù)據(jù)X和輸出數(shù)據(jù)Y來學(xué)習(xí)我們構(gòu)造的核數(shù)組K。我們首先構(gòu)造一個卷積層,其卷積核將被初始化成隨機(jī)數(shù)組。接下來在每一次迭代中,我們使用平方誤差來比較Y和卷積層的輸出,然后計(jì)算梯度來更新權(quán)重。
# 構(gòu)造一個核數(shù)組 conv2d = Conv2D(kernel_size=(1, 2))step ,lr = 60 , 0.01for i in range(step):Y_hat = conv2d(X)l = ((Y_hat - Y) ** 2).sum()l.backward()# 梯度下降conv2d.weight.data -= lr * conv2d.weight.gradconv2d.bias.data -= lr * conv2d.bias.grad# 梯度清0conv2d.weight.grad.fill_(0)conv2d.bias.grad.fill_(0)if(i + 1) % 5 == 0:print("Step %d, loss %.5f "% (i+1, l.item())) print(conv2d.weight) print(conv2d.bias)總結(jié)
以上是生活随笔為你收集整理的[pytorch、学习] - 5.1 二维卷积层的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32F429第四篇之跑马灯程序详解
- 下一篇: [pytorch、学习] - 5.2 填