膨胀卷积的基础操作图解:

卷积之后的尺寸公式:

  • 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
  实际输出尺寸: 8x8

Dilation=2:
  理论输出尺寸: 6x6
  实际输出尺寸: 6x6

Dilation=3:
  理论输出尺寸: 4x4
  实际输出尺寸: 4x4

Dilation=4:
  理论输出尺寸: 2x2
  实际输出尺寸: 2x2

官方文档:Conv2d — PyTorch 2.6 documentation

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐