膨胀卷积的基础操作图解:
卷积之后的尺寸公式:
-
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] # 膨胀率 Dfor 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) + 1w_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
官方文档:Conv2d — PyTorch 2.6 documentation