月刊ディープラーニング部 vol.1 "ResNeSt"特集 by ピジョン
每月深度学习俱乐部第一卷“ ResNeSt”特别版(日文翻译)
原文:
【特集 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つのパラメータが存在します。
翻译:
【特别篇 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维的张量(TF-Tensor),有四个实参。
原文:
【特集 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 のとき、ブロック内のチャンネルの変化を噛み砕いて表すとこんな感じになります。字が下手でごめんなさい。
radix=1 のときは、ほぼ SE-Net[2] のような形状になるのが分かると思います。(厳密には r-softmax の部分が sigmoid関数 になるので微妙に違いますが)
翻译:
【特别篇 2】 关于各种参数
这里我说明下ResNeStBlock的四个参数。加粗了的是论文里说明过的参数。 至于没有加粗的部分,我觉得有应该单独说明一下。
- cardinality(K): 一开始的主分支数。
- radix(R): 主分支内的分支,需要分成多少个Split-Attention模块。 这个分支的r-softmax的概念不太好理解(推荐阅读下SK-Net论文,这样很更清楚些)
- bottleneck: 瓶颈层。通常的ResNet,256-> 64-> 256中的“ 64”就是瓶颈层的数。 bottleneck//radix 就是位于最里面的分支通道数。
- ratio: Self-Attention 模块的瓶颈层。虽然在论文中从没出现过,但读了好几次觉得还是有必要。
看示例的话可能更容易理解。
示例:当Input = output = 256,ratio= 2,cardinality= 3,bottleneck= 24,ratio= 4时,要将块内的通道变化情况简明地表示出来,如下图所示( 很抱歉画得不是太好)
而当radix=1时,图的大致形状和SE-Net [2]相同。(严格来说,r-softmax的部分是sigmoid函数,还是略有不同。)
原文:
【特集 3】 すぐに使える文字認識コード
せっかくなので、実践で使えるのを確かめるため、Kaggle の notebook 上でコーディングしたのでこれを公開しておきます。
↑ の notebook をコピーすればそのまま使えるはずです!
もうちょっと使いやすくしてからアップしたかったのですが、時間がなかったので今回はここまで。だいたいコードを読めば何をしているか分かるはずです。精度は微妙ですが、ちゃんとやると 99.65% くらいまではデータ拡張なしで行きます。
- ResNeSt[1] の文献内にある label smoothing などのテクニックは実装してません。
- TPU で使える! というのは TensorFlow 2.0 で書いた…というだけであり、TPU用にしたわけではないですごめんなさい。
翻译:
【特别篇3】 即刻用在字符识别上的代码
为了确保能实际使用,我已经在Kaggle的notebook进行了编码,同时也发布了版本。
ResNeSt_for_MNIST
↑ 复制到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 とかにリンク貼って問題ないですよね…?(初心者)
翻译:
注意点
由于本文是个人编写,是在阅读了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: p-geon/StealthFlow
GitHub中ResNeSt代码: https://github.com/p-geon/StealthFlow/blob/master/stealthflow/resnest.py