膨胀卷积的基础操作图解:
卷积之后的尺寸公式:
-
W×H 是输入尺寸
-
Fw×Fh 是卷积核尺寸
-
P 是填充大小
-
S 是步长
-
R 是膨胀率
-
⌊x⌋ 表示向下取整
实例(膨胀率不同):
-
输入尺寸:W=8×H=8
-
卷积核尺寸:Fw=3×Fh=3
-
填充:P=1P=1
-
步长:S=1S=1
代码实例:
import torch
import torch.nn as nn
# 固定参数
input_size = (8, 8) # 输入尺寸 W×H
kernel_size = (3, 3) # 卷积核尺寸 Fw×Fh
padding = 1 # 填充 P
stride = 1 # 步长 S
# 定义输入张量:batch_size=1, 通道数=1, 尺寸=8x8
x = torch.randn(1, 1, input_size[0], input_size[1])
# 定义不同膨胀率的卷积层
dilations = [1, 2, 3, 4] # 膨胀率 D
for dilation in dilations:
# 创建膨胀卷积层
conv = nn.Conv2d(
in_channels=1,
out_channels=1,
kernel_size=kernel_size,
stride=stride,
padding=padding,
dilation=dilation # 膨胀率 D
)
# 计算输出尺寸
with torch.no_grad():
output = conv(x)
# 理论计算验证
effective_kernel_w = dilation * (kernel_size[0] - 1) + 1
w_out = (input_size[0] + 2 * padding - effective_kernel_w) // stride + 1
# 打印结果
print(f"Dilation={dilation}:")
print(f" 理论输出尺寸: {w_out}x{w_out}")
print(f" 实际输出尺寸: {output.shape[2]}x{output.shape[3]}\n")
输出:
Dilation=1:
理论输出尺寸: 8x8
实际输出尺寸: 8x8Dilation=2:
理论输出尺寸: 6x6
实际输出尺寸: 6x6Dilation=3:
理论输出尺寸: 4x4
实际输出尺寸: 4x4Dilation=4:
理论输出尺寸: 2x2
实际输出尺寸: 2x2