# Pytorch.nn.conv2d 过程验证（单，多通道卷积过程）

https://zhuanlan.zhihu.com/p/32190799

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 (int or tuple) – Size of the convolving kernel
• stride (int or tuple, optional) – Stride of the convolution. Default: 1
• padding (int or tuple, optional) – Zero-padding added to both sides of the input. Default: 0
• dilation (int or tuple, 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

## 一通道卷积核卷积过程：

import torch
##单位矩阵来模拟输入
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的结果
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的参数
[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]
]


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))


the result of first channel in image: -0.306573044777


## 多通道卷积核卷积过程：

conv2d( in_channels = X(x>1) , out_channels = N)

##单位矩阵来模拟输入
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()))


## out输出的结果
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的参数设置
[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]
]


f_p=list(x.parameters())[0]
f_p=f_p.data.numpy()
print(f_p[0].sum()+(-0.1367))

-0.639065589142


import torch
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

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客