從全連接到卷積
1、簡單例子:分類貓和狗的圖片
使用一個還不錯的相機采集圖片(12M像素)
RGB圖片有36M元素
使用100大小的單隱藏層MLP,模型有3.6B元素,遠多于世界上所有貓和狗總數(900M狗,600M貓)
2、重新考察全連接層
將輸入和輸出變形為矩陣(寬度,高度);將權重變形為4-D張量(h,w)到(h‘,w’)

V是W的重新索引
3、二維交叉相關

4、二維卷積層

5、 交叉相關和卷積

由于對稱性,在實際應用中沒有任何區別,
6、一維和三維交叉相關
一維:文本、語言、時序序列,
二維:就是主要應用在圖片上,
三維:視頻、醫學影像、氣象地圖,
總結:
卷積層將輸入和核矩陣進行價交叉相關,加上偏移后得到輸出;核矩陣和偏移是科學系的引數;核矩陣的大小是超引數,
代碼實作:
import torch
from torch import nn
"""二維互相關運算"""
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
#構造陣列X和核陣列K
X = torch.tensor([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
K = torch.tensor([[0, 1], [2, 3]])
print(corr2d(X, K))
"""
二維卷積層
?維卷積層將輸?和卷積核做互相關運算,并加上?個標量偏差來得到輸出,卷積層的模型引數包括了卷積核和標量偏差,
在訓練模型的時候,通常我們先對卷積核隨機初始化,然后不斷迭代卷積核和偏差,
下?基于 corr2d 函式來實作?個?定義的?維卷積層,
在建構式 __init__ ?我們宣告 weight和 bias 這兩個模型引數,
前向計算函式 forward 則是直接調? corr2d 函式再加上偏差,
"""
class Conv2D(nn.Module):
def __init__(self, kernel_size):
super(Conv2D, self).__init__()
self.weight = nn.Parameter(torch.randn(kernel_size)) #取一個隨機值,是一個可學的引數,kernel_size就是一個超引數,3x3的矩陣,
self.bias = nn.Parameter(torch.randn(1))#偏移,標量,初始化為0.
def forward(self, x):
return corr2d(x, self.weight) + self.bias
#卷積窗?形狀為pxq 的卷積層稱為 pxq卷積層,同樣,pxq 卷積或 pxq卷積核說明卷積核的?和寬分別為 p和q ,
"""影像中物體邊緣檢測"""
"""卷積層的簡單應?:檢測影像中物體的邊緣,即找到像素變化的位置,?先我們構造
?張6x8 的影像(即?和寬分別為6像素和8像素的影像),它中間4列為?(0),其余為?(1)"""
X=torch.ones(6,8) #構造一個6*8的陣列
X[:,2:6]=0 #每一行的第二個元素到第六個元素為0
print(X)
""" 構造?個?和寬分別為1和2的卷積核K,當它與輸?做互相關運算時,如果橫向相鄰元素相同,輸出為0;否則輸出為?0"""
K=torch.tensor([[1,-1]])
print(K)
"""將輸? X 和我們設計的卷積核 K 做互相關運算"""
Y=corr2d(X,K)
print(Y)
"""通過資料學習核陣列"""
""",它使?物體邊緣檢測中的輸?資料 X 和輸出資料 Y 來學習我們構造的核陣列K ,
我們?先構造?個卷積層,其卷積核將被初始化成隨機陣列,
接下來在每?次迭代中,我們使?平?誤差來?較 Y 和卷積層的輸出,然后計算梯度來更新權重,"""
# 構造?個核陣列形狀是(1, 2)的?維卷積層
conv2d = Conv2D(kernel_size=(1, 2))
step = 20 #迭代次數
lr = 0.01
for i in range(step):
Y_hat = conv2d(X)
l = ((Y_hat - Y) ** 2).sum()
l.backward()
# 梯度下降
conv2d.weight.data -= lr * conv2d.weight.grad
conv2d.bias.data -= lr * conv2d.bias.grad
# 梯度清0
conv2d.weight.grad.fill_(0)
conv2d.bias.grad.fill_(0)
if (i + 1) % 5 == 0:
print('Step %d, loss %.3f' % (i + 1, l.item()))
#輸出學習到的卷積核的引數
print("weight: ", conv2d.weight.data)
print("bias: ", conv2d.bias.data)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/434546.html
標籤:AI
下一篇:超分重建:基礎問答匯總
