深度學習筆記017卷積層

2022-09-20 07:18:14 字數 4300 閱讀 2182

看到一句話,其實卷積層就是一種濾波器,放大它感興趣的,縮小它不感興趣的,很有道理。

二維卷積層的數學表達:

這裡這個w其實就是kernel,是在這裡通過這種方式學習出來的引數,表現出來的就是乙個矩陣。b是偏差,通過廣播機制作用給y。

二維交叉和二維卷積,就差乙個翻轉的關係:

為了簡單,我們把負號刪掉了。所以在神經網路裡雖然我們說在做卷積,其實是在做交叉相關。

影象處理領域一般都用二維的卷積層,但是一維和三維也在應用中很重要。

一維卷積:

文字、語言、時序序列

二維卷積:

卷積層就是將輸入和核矩陣進行交叉相關,再加上偏移之後,進行輸出。

核矩陣和偏移是可學習的量。

核矩陣的大小是超引數。

q&a:

1、kernel大小主流用3x3,最多5x5。感受野不是越大越好,最終我們雖然會看到整張圖,類似為什麼是深度學習而不是廣度學習一樣,我們用大核少做幾次和用小核多做幾次,工作量一樣,但是視野小一些會更棒。

卷積層控制輸出大小的超引數:填充和步幅

填充:可以控制輸出形狀的減小量

步幅:可以成倍減小輸出形狀

填充:在輸入的四周新增額外的行或列

通常利用填充,使得輸出保持與輸入一樣的大小

步幅:是指滑行的行/列的步長,高度和寬度的步幅可以不同

步幅計算:

1、一般來說,填充會使得輸出和輸入不變,因為這樣子算起來比較方便,否則需要一直想著輸入輸出變化的關係;

2、通常來講,步幅常常=1,除非計算量明顯太大了;

3、卷積的邊長一般取奇數,因為取奇數時填充會方便一些,上下左右對稱一些。但是效果上來說,奇偶差不多了。

4、機器學習本質上就是資訊篩選,資訊壓縮,我們的資訊一直都是丟失的,只要在操作,就是在丟失資訊。只不過在壓縮的時候,我們放大了我們感興趣的特徵。

5、乙個特定的卷積層就是去匹配一種特定的紋理。

**如下:

1

import

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個權值引數。然而影象的空間...