看到一句話,其實卷積層就是一種濾波器,放大它感興趣的,縮小它不感興趣的,很有道理。
二維卷積層的數學表達:
這裡這個w其實就是kernel,是在這裡通過這種方式學習出來的引數,表現出來的就是乙個矩陣。b是偏差,通過廣播機制作用給y。
二維交叉和二維卷積,就差乙個翻轉的關係:
為了簡單,我們把負號刪掉了。所以在神經網路裡雖然我們說在做卷積,其實是在做交叉相關。
影象處理領域一般都用二維的卷積層,但是一維和三維也在應用中很重要。
一維卷積:
文字、語言、時序序列
二維卷積:
卷積層就是將輸入和核矩陣進行交叉相關,再加上偏移之後,進行輸出。
核矩陣和偏移是可學習的量。
核矩陣的大小是超引數。
q&a:
1、kernel大小主流用3x3,最多5x5。感受野不是越大越好,最終我們雖然會看到整張圖,類似為什麼是深度學習而不是廣度學習一樣,我們用大核少做幾次和用小核多做幾次,工作量一樣,但是視野小一些會更棒。
卷積層控制輸出大小的超引數:填充和步幅
填充:可以控制輸出形狀的減小量
步幅:可以成倍減小輸出形狀
填充:在輸入的四周新增額外的行或列
通常利用填充,使得輸出保持與輸入一樣的大小
步幅:是指滑行的行/列的步長,高度和寬度的步幅可以不同
步幅計算:
1、一般來說,填充會使得輸出和輸入不變,因為這樣子算起來比較方便,否則需要一直想著輸入輸出變化的關係;
2、通常來講,步幅常常=1,除非計算量明顯太大了;
3、卷積的邊長一般取奇數,因為取奇數時填充會方便一些,上下左右對稱一些。但是效果上來說,奇偶差不多了。
4、機器學習本質上就是資訊篩選,資訊壓縮,我們的資訊一直都是丟失的,只要在操作,就是在丟失資訊。只不過在壓縮的時候,我們放大了我們感興趣的特徵。
5、乙個特定的卷積層就是去匹配一種特定的紋理。
**如下:
1import
torch
2from torch importnn3
from d2l import
torch as d2l45
6#定義乙個計算二維相關的運算
7def
corr2d(x,k):
8 h,w=k.shape
9 y=torch.zeros((x.shape[0]-h+1,x.shape[1]-w+1))
10for i in
range(y.shape[0]):
11for j in range(y.shape[1]):
12 y[i,j]=(x[i:i+h,j:j+w]*k).sum()
13returny14
1516 x = torch.tensor([[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]])
17 k = torch.tensor([[0.0, 1.0], [2.0, 3.0]])
18print
(corr2d(x, k))
192021#
實現二維卷積層
22class
conv2d(nn.module):
23def
__init__
(self,kernel_size):
24 super().__init__
()25 self.weight=nn.parameter(torch.rand(kernel_size))
26 self.bias=nn.parameter(torch.zeros(1))
2728
defforward(self,x):
29return corr2d(x,self.weight)+self.bias
303132#
簡易應用:檢測影象不同顏色的邊緣
33 x=torch.ones((6,8)) #
z做了乙個有兩條豎線邊緣的矩陣
34 x[:,2:6]=0
35print
(x)36 k=torch.tensor([[1.0,-1.0]])
37 y=corr2d(x,k)
38print
(corr2d(x,k))
3940
## 模擬做乙個檢測豎直邊緣的運算元41#
x=torch.ones((10,8)) #z做了乙個有兩條豎線邊緣的矩陣42#
x[3:7,:]=043#
print(x)44#
k=torch.tensor([[1.0],[-1.0]])45#
print(corr2d(x,k))
4647
#學習由x生成的y的卷積核
48 conv2d=nn.conv2d(1,1,kernel_size=(1,2),bias=false)
49 x=x.reshape((1,1,6,8)) #
將二維轉換為四維,第乙個是通道,第二個是樣本維度(樣本數),第三四個是長寬
50 y=y.reshape(1,1,6,7)
5152
for i in range(10):
53 y_hat=conv2d(x)
54 l=(y_hat-y)**2
55conv2d.zero_grad()
56l.sum().backward()
57 conv2d.weight.data[:]-=3e-2*conv2d.weight.grad
58if(i+1)%2==0:
59print(f'
batch , loss ')
6061
print(conv2d.weight.data.reshape((1,2)))#
不reshape就會輸出四維
626364#
2維變為4維,用於下面的函式
65 xx=torch.zeros((2,3))
66print
(xx)
67 xx=xx.reshape((1,1)+xx.shape)
68print
(xx)
6970
#填充和步幅
71def
comp_conv2d(conv2d,x):
72 x=x.reshape((1,1)+x.shape) #
2維變為4維
73 y=conv2d(x)
74return y.reshape(y.shape[2:])
7576 conv2d=nn.conv2d(1,1,kernel_size=3,padding=1) #
填充為1,上下左右各填充一行
77 x=torch.rand(size=(8,8))
78print
(comp_conv2d(conv2d,x).shape)
7980 conv2d=nn.conv2d(1,1,kernel_size=(5,3),padding=(2,1)) #
前面為上下,後面為左右
81print
(comp_conv2d(conv2d,x).shape)
8283 conv2d=nn.conv2d(1,1,kernel_size=3,padding=1,stride=2) #
步幅為2
84 x=torch.rand(size=(8,8))
85print
(comp_conv2d(conv2d,x).shape)
8687 conv2d=nn.conv2d(1,1,kernel_size=(3,5),padding=(0,1),stride=(3,5)) #
填充為1,上下左右各填充一行
88 x=torch.rand(size=(8,8))
89print(comp_conv2d(conv2d,x).shape)
深度學習筆記(24) 卷積層
乙個典型的卷積神經網路的卷積層,而通常有三層 首先介紹的是卷積層conv,從conv的向前傳播開始 前向傳播中乙個操作就是 z 1 w 1 a 0 b 1 其中 a 0 x 執行非線性函式得到 a 1 即 a 1 g z 1 這裡的輸入是a 0 也就是x,這些過濾器用變數 w 1 表示 在卷積過程中...
深度學習筆記016卷積層基礎之前
對於分類問題,利用mlp會出現模型太大 大到離譜 的問題。比如你分類貓狗的模型的引數比世界上所有的狗和貓都多,這顯然是不對的。1 平移不變性 2 區域性性 卷積就是乙個特殊的全連線層 總結 乙個系統,輸入是不穩定的,輸出是穩定的,那麼我們就可以用卷積來求這個系統的存量。跳出吃飯 消化這個例子,我們可...
深度學習介紹(四)卷積操作
接下來介紹一下,cnns是如何利用空間結構減少需要學習的引數數目的 如果我們有一張1000x1000畫素的影象,有1百萬個隱層神經元,那麼他們全連線的話 每個隱層神經元都與影象的每乙個畫素點相連 這樣就有1000x1000x1000000 10 12個連線,也就是10 12個權值引數。然而影象的空間...