見出し画像

月刊ディープラーニング部 vol.1 "ResNeSt"特集

イラスト35 3

【特集 1】 ResNeSt (TensorFlow2.0系) の PyPI パッケージを作りました

表紙にも散々強調してありますが、ResNeSt[1] を実装していました。
Kaggle, Colaboratory (Jupyter系全般) においては以下のコマンドで導入できます。

!pip install StealthFlow==0.0.9

これを使うことで、オンプレはもちろん、Kaggle や Colaboratory において、短いコードで簡単に ResNeSt を使用することができます。詳しい使い方を解説していきます。

さきほどの pip install が完了したら、次に ResNeStBlock クラスをインポートします。このクラスは TensorFlow 2.0 系のレイヤーで構成されており、Kaggle、Colaboratory だと一瞬で使うことができます。

from stealthflow.resnest import ResNeStBlock

TensorFlowレイヤー風に書くと、以下のような感じになります。

x = ResNeStBlock(radix=2, cardinality=2, bottleneck=64, ratio=4)(x)

ここで、x は 4-D Tensor (TF-Tensor) であり、引数には4つのパラメータが存在します。

【特集 2】 各種パラメータについて

ResNeStBlock の4つのパラメータについて説明していきます。太線は論文内で説明されていたパラメータ。太線になっていないものは、独自に解釈して必要に感じたので説明しています。

- cardinality(K): 最初のブランチ分岐の数。
- radix(R): ブランチ内のブランチ。何個の Split-Attention モジュールに分割するか。このブランチをまたいだ r-softmax という概念がややわかりにくい(SK-Net の論文を見ると分かりやすいのでオススメ)
- bottleneck: ボトルネック。通常の ResNet なら、256->64->256 の "64" がボトルネックの数。bottleneck//radix で最も内側のブランチのチャンネル数になる
- ratio: Self-Attention 部分のボトルネック。これは論文中には一度も登場していないが、何度も読むと必要であることが分かった

例を見てみたほうが分かりやすいかもしれません。

例: 入力=出力=256, radix=2, cardinality=3, bottleneck=24, ratio=4 のとき、ブロック内のチャンネルの変化を噛み砕いて表すとこんな感じになります。字が下手でごめんなさい。

画像3

radix=1 のときは、ほぼ SE-Net[2] のような形状になるのが分かると思います。(厳密には r-softmax の部分が sigmoid関数 になるので微妙に違いますが)

【特集 3】 すぐに使える文字認識コード

せっかくなので、実践で使えるのを確かめるため、Kaggle の notebook 上でコーディングしたのでこれを公開しておきます。

↑ の notebook をコピーすればそのまま使えるはずです!
もうちょっと使いやすくしてからアップしたかったのですが、時間がなかったので今回はここまで。だいたいコードを読めば何をしているか分かるはずです。精度は微妙ですが、ちゃんとやると 99.65% くらいまではデータ拡張なしで行きます。

* ResNeSt[1] の文献内にある label smoothing などのテクニックは実装してません。
* TPU で使える! というのは TensorFlow 2.0 で書いた…というだけであり、TPU用にしたわけではないですごめんなさい。

注意書き

この記事は、個人で作成したものであり、ResNeSt[1] の論文を読んで不明瞭だった部分は ResNeXt[3] や SK-Net[4] などの論文で補っています…もしかしたら高確率で間違いがあるかもないかもしれないので、気付いた方は教えて頂けると本当に有り難いです…間違いがないように頑張ってはいますが。

ここに書ききれなかったことは沢山あるので、ResNeSt に興味を持ったらぜひ元論文を読んでみて下さい!

探した限り、ResNeSt の TensorFlow 実装はまだ見つからなかったのですが、もしかしたら見つかりにくいところで誰か作っていたかもしれない。表紙のキャッチはあくまでキャッチということで許して下さいお願いします…

あと、宣伝のつもりではなかったのですが、Keggle notebook って別の SNS とかにリンク貼って問題ないですよね…?(初心者)

引用

- [1] https://arxiv.org/abs/2004.08955
- [2] https://arxiv.org/abs/1709.01507
- [3] https://arxiv.org/abs/1611.05431
- [4] https://arxiv.org/abs/1903.06586

リンク

- Kaggle notebook: https://www.kaggle.com/stealthflow/resnest-for-mnist
- PyPI リポジトリ: https://pypi.org/project/StealthFlow/
- GitHub: 

- GitHub の ResNeSt を記述している場所: https://github.com/p-geon/StealthFlow/blob/master/stealthflow/resnest.py