Pytorch.nn.conv2d 過程驗證方式(單,多通道卷積過程)
今天在看文檔的時候,發(fā)現(xiàn)pytorch 的conv操作不是很明白,于是有了一下記錄
首先提出兩個問題:
1.輸入圖片是單通道情況下的filters是如何操作的? 即一通道卷積核卷積過程
2.輸入圖片是多通道情況下的filters是如何操作的? 即多通道多個卷積核卷積過程
這里首先貼出官方文檔:
classtorch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)[source]
Parameters:
in_channels (int) – Number of channels in the input image
out_channels (int) – Number of channels produced by the convolution
kernel_size (intortuple) – Size of the convolving kernel
stride (intortuple,optional) – Stride of the convolution. Default: 1
padding (intortuple,optional) – Zero-padding added to both sides of the input. Default: 0
dilation (intortuple,optional) – Spacing between kernel elements. Default: 1
groups (int,optional) – Number of blocked connections from input channels to output channels. Default: 1
bias (bool,optional) – If True, adds a learnable bias to the output. Default: True
這個文檔中的公式對我來說,并不能看的清楚
一通道卷積核卷積過程:
比如32個卷積核,可以學習32種特征。在有多個卷積核時,如下圖所示:輸出就為32個feature map
也就是, 當conv2d( in_channels = 1 , out_channels = N)
有N個filter對輸入進行濾波。同時輸出N個結(jié)果即feature map,每個filter濾波輸出一個結(jié)果.
import torch from torch.autograd import Variable ##單位矩陣來模擬輸入 input=torch.ones(1,1,5,5) input=Variable(input) x=torch.nn.Conv2d(in_channels=1,out_channels=3,kernel_size=3,groups=1) out=x(input) print(out) print(list(x.parameters()))
輸出out的結(jié)果和conv2d 的參數(shù)如下,可以看到,conv2d是有3個filter加一個bias
# out的結(jié)果 Variable containing: (0 ,0 ,.,.) = -0.3065 -0.3065 -0.3065 -0.3065 -0.3065 -0.3065 -0.3065 -0.3065 -0.3065 (0 ,1 ,.,.) = -0.3046 -0.3046 -0.3046 -0.3046 -0.3046 -0.3046 -0.3046 -0.3046 -0.3046 (0 ,2 ,.,.) = 0.0710 0.0710 0.0710 0.0710 0.0710 0.0710 0.0710 0.0710 0.0710 [torch.FloatTensor of size 1x3x3x3] # conv2d的參數(shù) [Parameter containing: (0 ,0 ,.,.) = -0.0789 -0.1932 -0.0990 0.1571 -0.1784 -0.2334 0.0311 -0.2595 0.2222 (1 ,0 ,.,.) = -0.0703 -0.3159 -0.3295 0.0723 0.3019 0.2649 -0.2217 0.0680 -0.0699 (2 ,0 ,.,.) = -0.0736 -0.1608 0.1905 0.2738 0.2758 -0.2776 -0.0246 -0.1781 -0.0279 [torch.FloatTensor of size 3x1x3x3] , Parameter containing: 0.3255 -0.0044 0.0733 [torch.FloatTensor of size 3] ]
驗證如下,因為是單位矩陣,所以直接對參數(shù)用sum()來模擬卷積過程:
f_p=list(x.parameters())[0] f_p=f_p.data.numpy() print("the result of first channel in image:", f_p[0].sum()+(0.3255))
可以看到結(jié)果是和(0 ,0 ,.,.) = -0.3065 ....一樣的. 說明操作是通過卷積求和的.
the result of first channel in image: -0.306573044777
多通道卷積核卷積過程:
下圖展示了在四個通道上的卷積操作,有兩個卷積核,生成兩個通道。其中需要注意的是,四個通道上每個通道對應一個卷積核,先將w2忽略,只看w1,那么在w1的某位置(i,j)處的值,是由四個通道上(i,j)處的卷積結(jié)果相加得到的。 所以最后得到兩個feature map, 即輸出層的卷積核核個數(shù)為 feature map 的個數(shù)。
在pytorch 中的展示為
conv2d( in_channels = X(x>1) , out_channels = N)
有N乘X個filter(N組filters,每組X 個)對輸入進行濾波。即每次有一組里X個filter對原X個channels分別進行濾波最后相加輸出一個結(jié)果,最后輸出N個結(jié)果即feature map。
驗證如下:
##單位矩陣來模擬輸入 input=torch.ones(1,3,5,5) input=Variable(input) x=torch.nn.Conv2d(in_channels=3,out_channels=4,kernel_size=3,groups=1) out=x(input) print(list(x.parameters()))
可以看到共有4*3=12個filter 和一個1×4的bias 作用在這個(3,5,5)的單位矩陣上
## out輸出的結(jié)果 Variable containing: (0 ,0 ,.,.) = -0.6390 -0.6390 -0.6390 -0.6390 -0.6390 -0.6390 -0.6390 -0.6390 -0.6390 (0 ,1 ,.,.) = -0.1467 -0.1467 -0.1467 -0.1467 -0.1467 -0.1467 -0.1467 -0.1467 -0.1467 (0 ,2 ,.,.) = 0.4138 0.4138 0.4138 0.4138 0.4138 0.4138 0.4138 0.4138 0.4138 (0 ,3 ,.,.) = -0.3981 -0.3981 -0.3981 -0.3981 -0.3981 -0.3981 -0.3981 -0.3981 -0.3981 [torch.FloatTensor of size 1x4x3x3] ## x的參數(shù)設置 [Parameter containing: (0 ,0 ,.,.) = -0.0803 0.1473 -0.0762 0.0284 -0.0050 -0.0246 0.1438 0.0955 -0.0500 (0 ,1 ,.,.) = 0.0716 0.0062 -0.1472 0.1793 0.0543 -0.1764 -0.1548 0.1379 0.1143 (0 ,2 ,.,.) = -0.1741 -0.1790 -0.0053 -0.0612 -0.1856 -0.0858 -0.0553 0.1621 -0.1822 (1 ,0 ,.,.) = -0.0773 -0.1385 0.1356 0.1794 -0.0534 -0.1110 -0.0137 -0.1744 -0.0188 (1 ,1 ,.,.) = -0.0396 0.0149 0.1537 0.0846 -0.1123 -0.0556 -0.1047 -0.1783 -0.0630 (1 ,2 ,.,.) = 0.1850 0.0325 0.0332 -0.0487 0.0018 0.1668 0.0569 0.0267 0.0124 (2 ,0 ,.,.) = 0.1880 -0.0152 -0.1088 -0.0105 0.1805 -0.0343 -0.1676 0.1249 0.1872 (2 ,1 ,.,.) = 0.0299 0.0449 0.1179 0.1280 -0.1545 0.0593 -0.1489 0.1378 -0.1495 (2 ,2 ,.,.) = -0.0922 0.1873 -0.1163 0.0970 -0.0682 -0.1110 0.0614 -0.1877 0.1918 (3 ,0 ,.,.) = -0.1257 -0.0814 -0.1923 0.0048 -0.0789 -0.0048 0.0780 -0.0290 0.1287 (3 ,1 ,.,.) = -0.0649 0.0773 -0.0584 0.0092 -0.1168 -0.0923 0.0614 0.1159 0.0134 (3 ,2 ,.,.) = 0.0426 -0.1055 0.1022 -0.0810 0.0540 -0.1011 0.0698 -0.0799 -0.0786 [torch.FloatTensor of size 4x3x3x3] , Parameter containing: -0.1367 -0.0410 0.0424 0.1353 [torch.FloatTensor of size 4] ]
因為是單位矩陣,所以直接對參數(shù)用sum()來模擬卷積過程,結(jié)果-0.639065589142 與之前的out結(jié)果的(0 ,0 ,.,.) = -0.6390 相同, 即conv2d 是通過利用4組filters,每組filter對每個通道分別卷積相加得到結(jié)果。
f_p=list(x.parameters())[0] f_p=f_p.data.numpy() print(f_p[0].sum()+(-0.1367)) -0.639065589142
再更新
import torch from torch.autograd import Variable input=torch.ones(1,1,5,5) input=Variable(input) x=torch.nn.Conv2d(in_channels=1,out_channels=3,kernel_size=3,groups=1) out=x(input) f_p=list(x.parameters())[0] f_p=f_p.data.numpy() f_b=list(x.parameters())[1] f_b=f_b.data.numpy() print("output result is:", out[0][0]) print("the result of first channel in image:", f_p[0].sum()+f_b[0])
output result is: Variable containing:
0.6577 0.6577 0.6577
0.6577 0.6577 0.6577
0.6577 0.6577 0.6577
[torch.FloatTensor of size 3x3]
the result of first channel in image: 0.657724
input=torch.ones(1,3,5,5) input=Variable(input) print(input.size()) x=torch.nn.Conv2d(in_channels=3,out_channels=4,kernel_size=3,groups=1) out=x(input) f_p=list(x.parameters())[0] f_b=list(x.parameters())[1] f_p=f_p.data.numpy() f_b=f_b.data.numpy() # print(f_p[...,0]) # print(f_p[...,0].shape) # print(f_p[...,0].sum()+f_b[0]) print("output result :",out[0][0]) print("simlatuate the result:", f_p[0].sum()+f_b[0])
torch.Size([1, 3, 5, 5])
output result : Variable containing:
-0.2087 -0.2087 -0.2087
-0.2087 -0.2087 -0.2087
-0.2087 -0.2087 -0.2087
[torch.FloatTensor of size 3x3]
simlatuate the result: -0.208715
以上這篇Pytorch.nn.conv2d 過程驗證方式(單,多通道卷積過程)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Python中的X[:,0]、X[:,1]、X[:,:,0]、X[:,:,1]、X[:,m:n]和X[:,:,m:n]
這篇文章主要介紹了Python中的X[:,0]、X[:,1]、X[:,:,0]、X[:,:,1]、X[:,m:n]和X[:,:,m:n],文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-02-02python提取excel一列或多列數(shù)據(jù)另存為新表代碼實例
在日常的工作中,其實就是用鼠標進行數(shù)據(jù)篩選,然后選擇你想要這一行數(shù)據(jù)進行復制,下面這篇文章主要給大家介紹了關于python提取excel一列或多列數(shù)據(jù)另存為新表的相關資料,需要的朋友可以參考下2024-06-06Python實現(xiàn)日期字符串轉(zhuǎn)換為指定格式的日期
在Python編程中,日期處理是一個常見的任務,本文將詳細介紹如何在Python中將日期字符串轉(zhuǎn)換為指定格式的日期,感興趣的小伙伴可以學習一下2024-04-04django中使用POST方法獲取POST數(shù)據(jù)
這篇文章主要介紹了django中使用POST方法獲取POST數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-08-08