PyTorch torch.nn.Dropout2d 関数
torch.nn.Dropout2dPyTorch の2次元 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 リファレンスマニュアル