PyTorch torch.nn.Dropout2d 函数
torch.nn.Dropout2d 是 PyTorch 中的二维 Dropout 模块。
它随机将整个通道置零,适合卷积层的特征图。
函数定义
torch.nn.Dropout2d(p=0.5, inplace=False)
特点
- 按通道(channel)维度随机置零
- 每个样本的所有通道保持一致的丢弃模式
使用示例
示例 1: 基本用法
实例
import torch
import torch.nn as nn
dropout2d = nn.Dropout2d(p=0.5)
dropout2d.train()
# 输入:batch=4,通道=8,高=16,宽=16
x = torch.ones(4, 8, 16, 16)
output = dropout2d(x)
# 统计丢弃的通道数
non_zero_channels = (output.sum(dim=(2, 3)) != 0).float()
print("非零通道比例:", non_zero_channels.mean().item())
print("期望约 0.5 的通道被保留")
import torch.nn as nn
dropout2d = nn.Dropout2d(p=0.5)
dropout2d.train()
# 输入:batch=4,通道=8,高=16,宽=16
x = torch.ones(4, 8, 16, 16)
output = dropout2d(x)
# 统计丢弃的通道数
non_zero_channels = (output.sum(dim=(2, 3)) != 0).float()
print("非零通道比例:", non_zero_channels.mean().item())
print("期望约 0.5 的通道被保留")
示例 2: 对比 Dropout
实例
import torch
import torch.nn as nn
dropout1d = nn.Dropout(0.5)
dropout2d = nn.Dropout2d(0.5)
# 输入
x = torch.randn(2, 4, 8, 8)
# Dropout: 随机置零单个元素
out1 = dropout1d(x)
# Dropout2d: 按通道置零
out2 = dropout2d(x)
print("Dropout 形状:", out1.shape)
print("Dropout2d 形状:", out2.shape)
import torch.nn as nn
dropout1d = nn.Dropout(0.5)
dropout2d = nn.Dropout2d(0.5)
# 输入
x = torch.randn(2, 4, 8, 8)
# Dropout: 随机置零单个元素
out1 = dropout1d(x)
# Dropout2d: 按通道置零
out2 = dropout2d(x)
print("Dropout 形状:", out1.shape)
print("Dropout2d 形状:", out2.shape)
示例 3: 在 CNN 中使用
实例
import torch
import torch.nn as nn
# 带 Dropout2d 的 CNN
model = nn.Sequential(
nn.Conv2d(3, 64, 3, padding=1),
nn.BatchNorm2d(64),
nn.ReLU(),
nn.Dropout2d(0.3), # 在特征图级别丢弃
nn.Conv2d(64, 128, 3, padding=1),
nn.BatchNorm2d(128),
nn.ReLU(),
nn.AdaptiveAvgPool2d(1),
nn.Flatten(),
nn.Linear(128, 10)
)
x = torch.randn(4, 3, 32, 32)
output = model(x)
print("输入:", x.shape, "-> 输出:", output.shape)
import torch.nn as nn
# 带 Dropout2d 的 CNN
model = nn.Sequential(
nn.Conv2d(3, 64, 3, padding=1),
nn.BatchNorm2d(64),
nn.ReLU(),
nn.Dropout2d(0.3), # 在特征图级别丢弃
nn.Conv2d(64, 128, 3, padding=1),
nn.BatchNorm2d(128),
nn.ReLU(),
nn.AdaptiveAvgPool2d(1),
nn.Flatten(),
nn.Linear(128, 10)
)
x = torch.randn(4, 3, 32, 32)
output = model(x)
print("输入:", x.shape, "-> 输出:", output.shape)
使用场景
- 卷积网络: 特征图级别正则化
- 减少通道依赖
注意:Dropout2d 在训练时按通道丢弃,评估时不起作用。

PyTorch torch.nn 参考手册