當我們安裝好pytorch的依賴環境以後,我們就可以學習pytorch了,我們首先引入依賴包如下:
import torch
import torchvision as tv
import torch.nn as nn
接下來我們主要講述nn.Conv2d 的卷積運算函數,nn.Conv2d的功能是:對由多個輸入平面組成的輸入信號進行二維卷積,以最簡單的例子進行說明:
layer = nn.Conv2d(in_channels=1,out_channels=3,kernel_size=3,stride=1,padding=0)
參數理解:(畫重點!)
in_channels:個人認爲有兩種理解
1)輸入通道數,對於圖片層一般爲1(灰度)3(RGB)
2)定義一種輸入規則,要求上一層的輸出必須和這個輸入一致,也可以理解爲併發in_channels個channel在上一層 . feature_map(特徵映射)上進行卷積運算
out_channels:
1)直觀理解是輸出層通道數,
2)換一種理解是kernels(卷積核)個數,其中,每個卷積核會輸出局部特徵,比如下圖中
面部中有頭髮feature,衣服顏色的feature都是由不同的kernel進行卷積運算得到的。
看了上面的內容,你或許會有這個疑問如果in_channels也就是說輸入的feature也要包含3個channel的tensor(ndarray)對的 或許你會問,那如果out_channels是2,那怎麼從3-->變成2的?
下圖是詳細的原理圖:
(補充:上述說的是kernel1的運算,有多少個kernel就有多少個相同的運算,最終會輸出[b,out_channels,w,h],其中w和h是輸出的shape,下文有講計算方法)
stride(步長):控制cross-correlation的步長,可以設爲1個int型數或者一個(int, int)型的tuple。
padding(補0):控制zero-padding的數目。
dilation(擴張):控制kernel點(卷積核點)的間距; 也被稱爲 "à trous"算法. 可以在此github地址查看:Dilated convolution animations
groups(卷積核個數):這個比較好理解,通常來說,卷積個數唯一,但是對某些情況,可以設置範圍在1 —— in_channels中數目的卷積核:
output_size 運算
1)試想,在沒有padding(邊緣填充)的情況下,有卷積操作如下
layer = nn.Conv2d(in_channels=1,out_channels=3,kernel_size=3,stride=1,padding=0)
如果輸入的圖像是1張大小是28*28的灰度圖像
x = torch.rand(1,1,28,28)
卷積核每次移動1(stride=1)最大可以移動26個值到達邊緣,因此輸出是1張3通道的26*26的圖像1*3*26*26
2)如果每次移動2(stride= 2),是不是隻要經過13次運算就到了邊緣所以輸出結果是 1*3*13*13
layer = nn.Conv2d(in_channels=1,out_channels=3,kernel_size=3,stride=2,padding=0)
3)如果增加了邊緣補充(padding=1)
layer = nn.Conv2d(in_channels=1,out_channels=3,kernel_size=3,stride=1,padding=1)
原始圖像可以理解爲30*30的大小,圖像需要移動30-(kernelsize-1)=28 步輸出是1*3*28*28 相同大小的圖像
如果每次移動兩步(stride=2)
layer = nn.Conv2d(in_channels=1,out_channels=3,kernel_size=3,stride=2,padding=1)
需要移動((28+1*2)-(3-1))/2 =14 也就是輸出大小是1*3*28*28 ,哈哈哈是不是發現了什麼規律呢?
大家可以根據我運算的過程總結如下公式:
接下來請推導下經典網絡的卷積過程!
堅持一件事情或許很難,但堅持下來一定很酷!^_^