假设
:
输入
i
n
p
u
t
:
(
N
,
C
i
n
,
H
i
n
,
W
i
n
)
,
输出
o
u
t
p
u
t
:
(
N
,
C
o
u
t
,
H
o
u
t
,
W
o
u
t
)
其中
N
是
b
a
t
c
h
_
s
i
z
e
、
C
i
是通道,
H
i
是图像的高、
W
i
是图像的宽
假设: 输入input:(N,C_{in},H_{in},W_{in}),输出output:(N,C_{out},H_{out},W_{out})\\ 其中N是batch\_size、C_i是通道,H_i是图像的高、W_i是图像的宽
假设:输入input:(N,Cin,Hin,Win),输出output:(N,Cout,Hout,Wout)其中N是batch_size、Ci是通道,Hi是图像的高、Wi是图像的宽
H
o
u
t
=
H
i
n
+
2
×
p
a
d
d
i
n
g
[
0
]
−
d
i
l
a
t
i
o
n
[
0
]
×
(
k
e
r
n
e
l
_
s
i
z
e
[
0
]
−
1
)
−
1
s
t
r
i
d
e
[
0
]
+
1
W
o
u
t
=
W
i
n
+
2
×
p
a
d
d
i
n
g
[
1
]
−
d
i
l
a
t
i
o
n
[
1
]
×
(
k
e
r
n
e
l
_
s
i
z
e
[
1
]
−
1
)
−
1
s
t
r
i
d
e
[
1
]
+
1
H_{out}=\frac{H_{in}+2\times padding[0]-dilation[0]\times(kernel\_size[0]-1)-1}{stride[0]}+1\\ W_{out}=\frac{W_{in}+2\times padding[1]-dilation[1]\times(kernel\_size[1]-1)-1}{stride[1]}+1\\
Hout=stride[0]Hin+2×padding[0]−dilation[0]×(kernel_size[0]−1)−1+1Wout=stride[1]Win+2×padding[1]−dilation[1]×(kernel_size[1]−1)−1+1
卷积层的权重可通过方法Conv2d.weight提取,输出的权重数组尺寸为:
(
o
u
t
_
c
h
a
n
n
e
l
s
,
i
n
_
c
h
a
n
n
e
l
s
g
r
o
u
p
s
,
k
e
r
n
e
l
_
s
i
z
e
[
0
]
,
k
e
r
n
e
l
_
s
i
z
e
[
0
]
)
(out\_channels,\frac{in\_channels}{groups},kernel\_size[0],kernel\_size[0])
(out_channels,groupsin_channels,kernel_size[0],kernel_size[0])
并且初始化权重分部服从均匀分布:
u
(
−
k
,
k
)
,
其中
k
=
g
r
o
u
p
s
C
i
n
×
∏
i
=
0
1
k
e
r
n
e
l
_
s
i
z
e
[
i
]
u(-\sqrt{k},\sqrt{k}),其中k=\frac{groups}{C_{in}\times \prod\limits_{i=0}^1 kernel\_size[i]}
u(−k,k),其中k=Cin×i=0∏1kernel_size[i]groups
import torch.nn as nn
import torch
img=torch.arange(49,dtype=torch.float32).view(1,1,7,7)
conv=nn.Conv2d(in_channels=1,out_channels=1,kernel_size=3)
img_2=conv(img)print(img)print(img_2)
import torch.nn as nn
import torch
img=torch.arange(4*64*28*28,dtype=torch.float32).view(4,64,28,28)
conv=nn.Conv2d(in_channels=64,out_channels=128,kernel_size=3,padding=1)
img_2=conv(img)print(img.shape)print(img_2.shape)
import torch.nn as nn
import torch
conv=nn.Conv2d(in_channels=1,out_channels=1,kernel_size=3)print(conv.weight)print(conv.bias)print(type(conv.weight))# 利用.parameters()方法调用参数for i in conv.parameters():print(i)print(type(i))
import torch.nn as nn
import torch
conv=nn.Conv2d(in_channels=64,out_channels=128,kernel_size=[5,3],padding=2)print(conv.weight.shape)print(conv.bias.shape)