🍾
Bottleneck構造あり vs なし|1×1 Convの役割をCIFAR-10で実験検証【Keras】
ResNet50などの深いCNNでよく見る 1×1 Conv → 3×3 Conv → 1×1 Conv という構造——**Bottleneck Block(ボトルネックブロック)**です。
「なぜわざわざ1×1 Convで挟むのか?本当に効果があるのか?」という疑問を、KerasとCIFAR-10の実験で検証しました。
結果はBasicBlock(通常の3×3→3×3)の圧勝でした。その理由も含めて解説します。
詳細な実装コードと考察は元記事をご覧ください👇
Bottleneckブロックとは
通常の BasicBlock と Bottleneck の構成の違いはこちらです。
| ブロック種別 | 構成 |
|---|---|
| BasicBlock(通常) | 3×3 Conv → BN → ReLU → 3×3 Conv → BN → ReLU |
| Bottleneckブロック | 1×1 Conv → BN → ReLU → 3×3 Conv → BN → ReLU → 1×1 Conv → BN → ReLU |
Bottleneckの1×1 Convはチャンネル数を一旦1/4に絞って(圧縮)、3×3 Conv後に元のチャンネル数に戻す(復元) という役割を担っています。
パラメータ数の差(チャンネル数=64の場合)
理論上は約17分の1のパラメータ数になります。
実験条件
- データセット:CIFAR-10
- エポック数:30
- 最適化関数:Adam
- バッチサイズ:64
- ブロック以外の構成(Stem・GAP・Dense・Dropout)はすべて同一
- スキップ接続(Residual)なしでブロック構造の効果のみを比較
実験結果
| パターン | test_accuracy | パラメータ数 | 学習時間 |
|---|---|---|---|
| A:BasicBlock(通常) | 77.85% | 398,474 | 195.8秒 |
| B:Bottleneck | 67.84% | 51,114 | 154.8秒 |
精度差は約10ポイント。パラメータ数はBottleneckが約1/8、学習時間は41秒短縮という結果です。
なぜBottleneckが負けたのか
浅いネットワークでの情報圧縮しすぎが原因
Bottleneckでは中間チャンネルを1/4(64→16)に絞っているため、3×3 Convが処理できる特徴の豊かさが大きく制限されます。
ブロックが2つしかない浅い構成では、この圧縮がそのまま表現力の低下に直結しました。
Bottleneckは「深さ」が前提条件
| ネットワーク | ブロック種別 | 理由 |
|---|---|---|
| ResNet18 / 34 | BasicBlock | 浅いのでフルチャンネルの表現力を活かす |
| ResNet50 / 101 / 152 | Bottleneck | 深くしてもパラメータ爆発を防ぐ |
Bottleneckは「少ないパラメータで深さを稼ぐ」技術。今回のように「浅いまま使う」のは本来の使い方ではありません。
今回の実験で言えること・言えないこと
- ✅ 浅いネットワーク単体ではBasicBlockが精度で有利
- ✅ Bottleneckはパラメータ効率・学習速度で有利
- ❌「Bottleneckは使えない」という意味ではない
- ❌ スキップ接続ありの条件では結果が変わる可能性がある
まとめ
- Bottleneckはパラメータ数を約1/8に削減できるが、浅いネットワークでは精度が約10%低下した
- 原因はチャンネル圧縮による情報ロスで、ブロック数が少ないほど影響が大きい
- Bottleneckが真価を発揮するのは50層以上の深いネットワーク(ResNet50以降)
- 実運用ではスキップ接続と組み合わせることで圧縮による精度低下を補完できる
実装の詳細・グラフ・全コードは元記事で公開しています👇
もし参考になったら いいね をいただけると励みになります!
Discussion