お疲れ様です。
画像分類モデルのSEResNeXtについてのメモです。
個人的にCNNベースの画像分類のモデルアーキテクチャとしてはEfficientNetV2と並んでよく使います。
論文
SEResNeXtの重要なアーキテクチャであるSEブロックに関する論文です。
後の概要にも記載がありますがSEブロックと画像分類モデルResNeXtを組み合わせたものがSEResNeXtと呼ばれています。
SEResNeXt(Squeeze-and-Excitation ResNeXt)は、 ResNeXt に SE(Squeeze-and-Excitation)ブロックを組み込んだ画像分類モデルです。 ResNet / ResNeXt / SENet の長所を組み合わせた構造になっています。
1. ベースとなる3つの考え方
① ResNet(残差学習)
- skip connection(残差接続) により勾配消失を防ぐ
- 非常に深いネットワークでも学習が安定
y = F(x) + x
② ResNeXt(Cardinality)
ResNetを拡張し、並列な畳み込みの分岐数(cardinality)を増やす設計。
- チャンネル数や層を増やすより 効率的に表現力を向上
32x4dのような表記が特徴
例:
32x4d- cardinality = 32(分岐数)
- 各分岐のチャネル幅 = 4
③ SENet(チャンネル注意機構)
重要なチャネルを自動で強調する仕組み。
SEブロックの流れ
Squeeze
- Global Average Pooling
Excitation
- 全結合層でチャネルごとの重みを計算
Scale
- 元の特徴マップに重みを掛ける
channel-wise attention
2. SEResNeXtの構造
ResNeXtの各Residual BlockにSEブロックを追加
Input ↓ Grouped Convolution (ResNeXt) ↓ SE Block(チャネル注意) ↓ Residual Add
特徴
- ResNeXtの 高い表現力
- SENetの 重要特徴の強調
- パラメータ増加は比較的少ない
3. モデル名の読み方
例:seresnext50_32x4d
| 要素 | 意味 |
|---|---|
| 50 | ネットワークの深さ |
| 32 | cardinality(分岐数) |
| 4d | 各分岐のチャネル幅 |
| se | Squeeze-and-Excitation |
4. メリット・デメリット
✅ メリット
- 高精度(ImageNetで実績あり)
- ResNetより 効率的
- 少量のパラメータ増加で性能向上
- 転移学習に強い
❌ デメリット
- ResNetより計算量がやや増加
- 軽量モデル(MobileNet系)ほど速くない
5. どんなタスクに向いているか
- 一般的な 画像分類
- 医用画像・工業検査
- 少〜中規模データセットの転移学習
- 高精度が求められるタスク
OSSライセンスはtimmから利用すると基本的にはApache-2.0なので、商用利用も問題なさそうです。
timm以外から利用する場合は要確認です。
(例えば、ResNeXtの公式実装ではBSDライセンスになっています。)
実装
SEResNeXt自体の公式実装は探してみた感じはなさそうだったので、実際にモデルを使用したい場合はtimmライブラリから使用することになると思います。
- timm
pprp.github.io
モデルはHuggingFaceのモデルページで探すことができます。
.racm_in1kと.gluon_in1kの2パターンありますが、.racm_in1kの方を使うのが無難のようです。
お試し
普段使用している画像分類モデルのリポジトリで使用できるように実装しました。
コンフィグファイル(config/train_config.toml)のmodel_nameに"SEResNeXt"を指定すると使用できます。
model_name = "SEResNeXt"
上記のコードを使って実際に動かしてみました。
EfficientNetV2とVisionTransformerでも同じ設定で実行し、結果を比較してみます。
モデルはそれぞれtimmから利用しています。
- SEResNeXt -> seresnext50_32x4d
- EfficientNetV2 -> efficientnetv2_rw_m
- VisionTransformer -> vit_base_patch16_224
データセットについては、過去にも使用したFood_and_Vegetablesを使用しています。 huggingface.co
実際の結果を見てみます。上記のデータセットで試した結果なので参考程度に。
学習曲線が以下です。 20epochまでで比較しましたが、SEResNeXtだけまだ収束していない感じですね…。

SEResNeXtのみ追加で50epochまで学習を回してみましたが、最終的なベストの精度は同じくらい(97%程)になりました。

また、全体の実行時間とGPUメモリの使用量を計測した結果が以下になります。
学習の収束が遅いですが、モデル自体が軽いので同条件だと実行時間は早く、GPUメモリも余裕があります。
バッチサイズを上げる余裕があるので更なる高速化もできそうです。
| 実行時間(s) | GPUメモリ使用量(GB) | |
|---|---|---|
| SEResNeXt | 4006.2 | 6.379 |
| EfficientNetV2 | 4216.3 | 13.692 |
| VisionTransformer | 4285.8 | 6.421 |