torch.nn.conv3d理解

前言

需要用到3DCNN,於是找到了torch.nn.conv3d,網上太多人寫參數解讀,但沒什麼人能講得清楚的,於是我邊理解邊寫代碼驗證,得到了我想要的結果。

實例

用3DCNN的開篇之作來當作例子解讀一下這個函數的參數,首先來看一下它的網絡結構圖,網上有很多人解讀這篇文章,我就不細說了,這個網絡中全是重複的3D卷積 → 池化操作,池化的操作和2D卷積沒有區別,所以就講3D卷積,拿下圖紅框中的來舉例。

image.png

  • 輸入形狀是(7,60,40),7表示輸入的圖像幀數,60和40分別是寬和高。
  • 過濾器形狀是(7,7,3),3表示每次過濾器處理的圖像幀數,7和7分別是卷積核寬和高。
  • 輸出形狀是(5,54,34),5表示輸出的圖像幀數,54和34分別是寬和高。

注意:
1 這裏的圖像幀數並不是通道數,圖像幀數就是圖片數,而每張圖片(RGB圖像)又是有3個通道的。
2 如果對卷積核和過濾器的定義有疑問的,看參考文獻[2](文中有卷積核和過濾器的概念)。

代碼

 

import torch
import torch.nn as nn
from torch import autograd

# kernel_size的第哥一維度的值是每次處理的圖像幀數,後面是卷積核的大小
m = nn.Conv3d(3, 3, (3, 7, 7), stride=1, padding=0)
input = autograd.Variable(torch.randn(1, 3, 7, 60, 40))
output = m(input)
print(output.size())
# 輸出是 torch.Size([1, 3, 5, 54, 34])

首先明確一件事:假設矩陣的形狀是(a,b,c),那麼從右往左分別對應的是列、行、三維值。例如矩陣的形狀是(4,3,6),意思是這是個三維矩陣,其中有4個二維矩陣,二維矩陣的形狀是3 x 6。或者矩陣的形狀是(5,4,7,3),意思是這是個四維矩陣,其中有5個三維矩陣,每個三維矩陣中有4個二維矩陣,二維矩陣的形狀是7 x 3。而且形狀中位置從左往右對應的是維度從高到低。
看一下中文文檔

 

class torch.nn.Conv3d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)

 

in_channels(int) – 輸入信號的通道,就是輸入中每幀圖像的通道數
out_channels(int) – 卷積產生的通道,就是輸出中每幀圖像的通道數
kernel_size(int or tuple) - 過濾器的尺寸,假設爲(a,b,c),表示的是過濾器每次處理 a 幀圖像,該圖像的大小是b x c。
stride(int or tuple, optional) - 卷積步長,形狀是三維的,假設爲(x,y,z),表示的是三維上的步長是x,在行方向上步長是y,在列方向上步長是z。
padding(int or tuple, optional) - 輸入的每一條邊補充0的層數,形狀是三維的,假設是(l,m,n),表示的是在輸入的三維方向前後分別padding l 個全零二維矩陣,在輸入的行方向上下分別padding m 個全零行向量,在輸入的列方向左右分別padding n 個全零列向量。
dilation(int or tuple, optional) – 卷積核元素之間的間距,這個看看空洞卷積就okay了
groups(int, optional) – 從輸入通道到輸出通道的阻塞連接數;沒用到,沒細看
bias(bool, optional) - 如果bias=True,添加偏置;沒用到,沒細看

 

 

這樣解釋參數,太不直觀了,上一張畫的不是很好的圖

image.png

 

再回過頭來看代碼

  • (1,3,7,60,40)表示輸入1個視頻,每個視頻中圖像的通道數是3,每個視頻中包含的圖像數是7,圖像的大小是60 x 40。
  • (3,3,(3,7,7))表示的是輸入圖像的通道數是3,輸出圖像的通道數是3,(3,7,7)表示過濾器每次處理3幀圖像,卷積核的大小是7 x 7。
  • stride=1 表示stride=(1,1,1),在三維方向上步長是1,在寬和高上步長也是1。
  • padding=0 表示padding=(0,0,0)表示在三維方向上不padding,在寬和高上也不padding。

總結

其實3DCNN和2DCNN的區別最大區別就是3DCNN每次可以融合多個圖像的特徵,而2DCNN只能融合一個圖像的特徵,理解3DCNN中同時處理多幀圖像的時候可以類比2DCNN中同時處理多個通道。

參考文獻

[1] pytorch中文文檔
[2] 萬字長文帶你看盡深度學習中的各種卷積網絡



作者:一個NLPer
鏈接:https://www.jianshu.com/p/a55b329e2635
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章