mao9o9の技術メモ

個人的に興味のある分野についての技術メモです。

Resnetを試してみた

はじめに

ディープラーニングについて学習する上で、Resnet、Resnet-RSを実装して試行毎の損失、正解率を比較してみた。

ColaboratoryでのコードをGithubに載せました。

Resnet: https://github.com/9mao9/Resnet-RS_CIFAR100

Resnet-RS: https://github.com/9mao9/Resnet-RS_CIFAR100

Resnetについて

Resnet [1]

図1に示す残差ブロックの導入により、層を深くすると生じる勾配消失を防ぎ、従来のモデルよりも高い精度を実現した手法。モデルの作成において[2][3]を参考にした。

f:id:mao9o9:20220122004756p:plain:w500
図1 残差ブロック [1]より引用

Resnet-RS [4]

Resnetのネットワーク構造をResnet-D [5]に変更し、SEブロック [6]を追加したモデル。モデルの作成において[7][8]を参考にした。

実装環境

バージョン情報

  • torch 1.10.0+cu111
  • torchvision 0.11.1+cu111
  • numpy 1.19.5
  • sklearn 1.0.2

訓練データはCIFAR-100を利用した。

実験条件

両者とも入力サイズ、バッチサイズなどをResnet-RS [4]に準拠。

  • 入力サイズ:[3, 160, 160]
  • バッチサイズ:128
  • 学習率:0.0078125 (Resnetは0.001)
  • weight decay:4e-5
  • optimizer: SGD (momentum: 0.9)
  • transform: RandAugmentation (magnitude: 10)
  • Drop out: 0.25 (Resnet-rsのみ)

Resnetの学習率を0.0078125とすると学習が進まなかったため0.001とした。また、ResnetのFC層の前にドロップアウトを追加しても学習が進まなかったため、除外した。

結果

ネットワークの深さは50層とし、論文の通り350 epochも行うと時間がかかりすぎるため、50 epochで確かめた。

f:id:mao9o9:20220122005510p:plain:w500
図2 Resnetの損失と精度
f:id:mao9o9:20220122005610p:plain:w500
図3 Resnet-RSの損失と精度

精度は式(1)に示す正解率である。ResnetよりもResnet-RSの方が学習が進み、精度も高くなっている傾向がある。SEブロックおよびドロップアウトの影響が大きいと考えられる。

 \displaystyle
\rm{Accuracy} = \frac{\rm{TP + NF}}{\rm{TP + NP + TF + NF}} \ \ \ \ (1)


50 epochで精度が収束してるように見えるけど試行回数を増やすとあがるのかな。

参考

[1] K. He, et.al., "Deep Residual Learning for Image Recognition", 2015.

[2] Residual Network(ResNet)の理解とチューニングのベストプラクティス

[3] ResNet50をpytorchで実装

[4] I. Bello, et.al, "Revisiting ResNets: Improved Training and Scaling Strategies", 2021

[5] T. He, et.al, "Bag of Tricks for Image Classification with Convolutional Neural Networks", 2018

[6] J. Hu, et.al, "Squeeze-and-Excitation Networks", 2017)

[7] 帰ってきたResNet!最新の画像認識モデル「ResNet-RS」を解説!

[8] SOTA性能を得るためのResNetsの学習とスケーリング戦略!