torch.nn.Conv2d
(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode=‘zeros’, device=None, dtype=None)
参数
'zeros'
, 'reflect'
, 'replicate'
或'circular'
. 默认:'zeros'
True
,向输出添加可学习的偏差。默认:True
输入图像高度和宽度与输出图像的高度和宽度计算公式:
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
⌋
H_{out}=⌊(H_{in}+2×padding[0]−dilation[0]×(kernel\_size[0]−1)−1)/stride[0]+1⌋
Hout=⌊(Hin+2×padding[0]−dilation[0]×(kernel_size[0]−1)−1)/stride[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 ⌋ W_{out}=⌊(W_{in}+2×padding[1]−dilation[1]×(kernel\_size[1]−1)−1)/stride[1]+1⌋ Wout=⌊(Win+2×padding[1]−dilation[1]×(kernel_size[1]−1)−1)/stride[1]+1⌋
这里的output_channels就代表着卷积核的个数,卷积核的个数=输出频道的个数
下面的实例就使用之前学习到的方法构建了一个简单的卷积网络,并对输入输出图像进行展示对比。
import torch
import torchvision.datasets
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
dataset = torchvision.datasets.CIFAR10(root='./dataset', train=False, transform=torchvision.transforms.ToTensor(),
download=True)
dataloader = DataLoader(dataset=dataset, batch_size=64, num_workers=0)
class Test(nn.Module):
def __init__(self):
super(Test, self).__init__()
self.conv2d = nn.Conv2d(in_channels=3, out_channels=6, kernel_size=3, stride=1, padding=0)
def forward(self, x):
x = self.conv2d(x)
return x
writer = SummaryWriter("logs")
test = Test()
step = 0
for data in dataloader:
imgs, target = data
output = test(imgs)
print(imgs.shape)
print(output.shape)
output = torch.reshape(output, (-1, 3, 30, 30))
writer.add_images("input", imgs, step)
writer.add_images("output", output, step)
step += 1
原始图像:
卷积后的图像: