torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True,padding_mode='zeros')
參數(shù)介紹:
-
in_channels
:卷積層輸入通道數(shù) -
out_channels
:卷積層輸出通道數(shù) -
kernel_size
:卷積層的卷積核大小 -
padding
:填充長度 -
stride
:卷積核移動的步長 -
dilation
:是否采用空洞卷積 -
groups
:是否采用分組卷積 -
bias
:是否添加偏置參數(shù) -
padding_mode
:padding
的模式
如果輸入大小為:數(shù)量N即批處理大?。╞atch size),輸入通道數(shù)C_in,輸入高度H_in,輸入寬度C_in。輸出大小為:數(shù)量N,輸出通道數(shù)C_out,輸出高度H_out,輸出寬度C_out。
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
)
input: \quad (N, C_{in},H_{in},W_{in}) \\ output: \quad (N,C_{out}, H_{out}, W_{out})
input:(N,Cin?,Hin?,Win?)output:(N,Cout?,Hout?,Wout?)
之間的轉(zhuǎn)換為:
(
N
i
,
C
o
u
t
)
=
b
i
a
s
(
C
o
u
t
)
+
∑
k
=
0
C
i
n
?
1
w
e
i
g
h
t
(
C
o
u
t
,
k
)
?
(
N
i
,
k
)
(N_i,C_{out}) = bias(C_{out}) + \sum_{k=0}^{C_{in}-1}weight(C_{out},k) * (N{i},k)
(Ni?,Cout?)=bias(Cout?)+k=0∑Cin??1?weight(Cout?,k)?(Ni,k)
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 a l s i z e [ 0 ] ? 1 ) ? 1 s t r i d e [ 0 ] + 1 ] H_{out} = [ \frac {H_{in} + 2 * padding[0] - dilation[0] *(kernal_size[0] - 1) - 1}{stride[0]} + 1] Hout?=[stride[0]Hin?+2?padding[0]?dilation[0]?(kernals?ize[0]?1)?1?+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 ] W_{out} = [ \frac {W_{in} + 2 * padding[1] - dilation[1] * (kernel_size[1] - 1) - 1} {stride[1]} + 1] Wout?=[stride[1]Win?+2?padding[1]?dilation[1]?(kernels?ize[1]?1)?1?+1]
對于二維簡化的:
W
i
n
,
H
i
n
輸入的寬、高
W
o
u
t
,
H
o
u
t
輸出的寬,高
F
卷積核的大小
S
步長
P
邊界填充
W_{in},H_{in} \quad 輸入的寬、高 \\ W_{out},H_{out} \quad 輸出的寬,高 \\ F \quad 卷積核的大小 \\ S \quad 步長 \\ P \quad 邊界填充
Win?,Hin?輸入的寬、高Wout?,Hout?輸出的寬,高F卷積核的大小S步長P邊界填充
那么輸出的寬、高為:
W
o
u
t
=
W
i
n
?
F
W
+
2
P
S
+
1
H
o
u
t
=
H
i
n
?
F
H
+
2
P
S
+
1
W_{out} = \frac {W_{in} - F_{W} + 2P} S + 1 \\ H_{out} = \frac {H_{in} - F_{H} + 2P} S + 1
Wout?=SWin??FW?+2P?+1Hout?=SHin??FH?+2P?+1
在pytorch中的使用
- 直接使用(不常見)
import torch
import torch.nn as nn
# https://www.bilibili.com/video/BV1644y1h7LN/?spm_id_from=333.337.search-card.all.click&vd_source=13dfbe5ed2deada83969fafa995ccff6
# 輸入通道數(shù)
in_channels = 1
# 輸出通道數(shù)
out_channels = 1
# 批處理大小
batch_size = 1
# 卷積核大小 (3,3)
kernel_size = 3
# 輸入規(guī)格
input_size = [batch_size, in_channels, 4, 4]
# nn.Conv2d使用,其他默認(rèn)值
conv_layer = torch.nn.Conv2d(in_channels, out_channels, kernel_size)
# 隨機(jī)輸入特征圖
input_feature_map = torch.randn(input_size)
# 打印輸入特征圖形狀
print(input_feature_map.shape)
# 求出輸出特征圖
output_feature_map = conv_layer(input_feature_map)
# 打印出卷積核的規(guī)格
print(conv_layer.weight.shape)
# weight == out_channel * in_channel * height * weight
# 打印輸出特征圖大小
print(output_feature_map.shape)
輸出:
torch.Size([1, 1, 4, 4])
torch.Size([1, 1, 3, 3])
torch.Size([1, 1, 2, 2])
- 封裝為類的形式
import torch
from torch import nn
# 定義一個同樣操作的卷積類
class Foo(nn.Module):
def __init__(self, in_channel, out_channel):
super(Foo,self).__init__()
self.layer = nn.Sequential(
nn.Conv2d(in_channels=in_channel, out_channels=out_channel, kernel_size=3)
)
def forward(self, x):
return self.layer(x)
# 實(shí)例化一個
conv2 = Foo(1,1)
# 輸出特征圖, input_feature_map_2 和 input_feature_map是相同的值
output_feature_map_2 = conv2(input_feature_map_2)
print(output_feature_map_2)
輸出:文章來源:http://www.zghlxwxcb.cn/news/detail-678093.html
tensor([[[[ 0.5144, 0.0672],
[ 0.2169, -0.0591]]]], grad_fn=<ConvolutionBackward0>)
可以觀察到,這兩個操作相同但是結(jié)果值卻不相同。這是因?yàn)?strong>雖然兩者實(shí)現(xiàn)了相同的卷積操作,但由于它們的初始化和權(quán)重值的不同,因此輸出結(jié)果可能不完全一致。 另外,對于卷積操作的結(jié)果,輸出的張量形狀可能會有所不同,但數(shù)值內(nèi)容應(yīng)該是相似的。如果希望確保兩種方式得到的輸出結(jié)果完全一致,可以嘗試使用相同的初始化參數(shù),并確保權(quán)重值相同。文章來源地址http://www.zghlxwxcb.cn/news/detail-678093.html
到了這里,關(guān)于pytorch中 nn.Conv2d的簡單用法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!