先日、こちらのツイートを拝見しました。
https://t.co/LUuVrYQo7n
— akira (@AkiraTOSEI) 2021年2月8日
Microsoftが非常に高性能な学習済みResNet50のモデルを公開。複数の大規模なデータセットでマルチタスク学習を行なっている。GoogleのBig Transfer, OpenAIのClipを超える転移学習の性能をしめしている。 pic.twitter.com/ypXWDbTwEg
何やらResNet50の学習済みモデルとして、良い感じのものが公開されたそうです。 最近ResNetの使い方の勉強をしていたので、その延長で今回はこちらを使ってみようと思い、やってみたので今回はそのメモです。
Microsoft Vision Model
本件の元ネタはMicrosoft Researchのブログのようでした。
もともとResNet-50のモデルは、これに限らず公開されていましたが、今回は既存のものより精度の良い事前学習済みのモデルを公開したとのことでした。 どうやら、下記のパッケージが公開されたモデルになるようです。
PyTorchで実装された学習済みモデルは広く使われているかと思うのですが、ブログで記載されているすべてのタスクで高い精度を達成しているとのことでした。 それだけでなくOpenAI CLIPよりも高精度、Google Big Transferと同程度の性能が出る結果となっているようです。
使ってみる
ということで、実際に使ってみたいと思います。 比較として、この前使用したResNetのサンプルコードをResNet-50にして、Microsoft Vision Modelと比較してみたいと思います。
Microsoft Vision Model ResNet-50
本題のMicrosoft Vision Model ResNet-50でやってみます。
precision recall f1-score support 0 0.71 0.80 0.75 65 1 0.72 0.68 0.70 63 2 0.70 0.78 0.74 63 3 0.81 0.90 0.85 68 4 0.90 0.76 0.82 74 5 0.78 0.85 0.81 54 6 0.79 0.75 0.77 61 7 0.69 0.69 0.69 55 8 0.57 0.52 0.55 69 9 0.74 0.84 0.78 67 10 0.75 0.65 0.70 46 11 0.76 0.76 0.76 55 12 0.66 0.60 0.63 119 13 0.69 0.65 0.67 51 14 0.56 0.68 0.62 59 15 0.78 0.62 0.69 52 16 0.66 0.61 0.64 57 17 0.74 0.80 0.77 124 18 0.78 0.68 0.73 66 19 0.84 0.76 0.80 63 20 0.72 0.67 0.70 58 21 0.84 0.83 0.83 58 22 0.82 0.80 0.81 56 23 0.84 0.81 0.82 67 24 0.69 0.64 0.66 66 25 0.75 0.79 0.77 67 26 0.74 0.81 0.77 52 27 0.81 0.89 0.85 64 28 0.79 0.86 0.82 51 29 0.79 0.97 0.87 60 30 0.78 0.81 0.79 47 31 0.85 0.70 0.77 63 32 0.58 0.55 0.56 64 33 0.73 0.73 0.73 59 34 0.72 0.85 0.78 54 accuracy 0.74 2217 macro avg 0.75 0.75 0.74 2217 weighted avg 0.74 0.74 0.74 2217
結果だけ見ると、普通のResNet-50より悪い値になってしまいました。 おそらく、fine tuningもちゃんとやる必要があるようですね。 何はともあれ動いたので、ヨシ!
比較対象(PyTorch ResNet-50)
比較として、普通のResNet50で動かしてみたいと思います。
precision recall f1-score support 0 0.90 0.88 0.89 72 1 0.79 0.76 0.77 54 2 0.73 0.87 0.80 54 3 0.82 0.95 0.88 73 4 0.93 0.82 0.87 65 5 0.88 0.86 0.87 59 6 0.79 0.90 0.84 59 7 0.91 0.87 0.89 67 8 0.75 0.77 0.76 53 9 0.89 0.84 0.86 56 10 0.92 0.75 0.83 65 11 0.87 0.79 0.83 66 12 0.61 0.76 0.68 113 13 0.79 0.70 0.74 69 14 0.72 0.67 0.69 75 15 0.73 0.78 0.75 55 16 0.77 0.82 0.79 56 17 0.90 0.85 0.88 120 18 0.92 0.84 0.88 56 19 0.83 0.87 0.85 52 20 0.86 0.86 0.86 49 21 0.91 0.91 0.91 55 22 0.79 0.94 0.86 53 23 0.81 0.85 0.83 54 24 0.80 0.77 0.78 66 25 0.94 0.92 0.93 71 26 0.96 0.94 0.95 47 27 0.92 0.90 0.91 52 28 0.77 0.89 0.83 46 29 0.88 0.91 0.90 58 30 0.86 0.86 0.86 72 31 0.93 0.93 0.93 70 32 0.68 0.56 0.61 54 33 0.87 0.77 0.82 70 34 0.90 0.85 0.87 61 accuracy 0.83 2217 macro avg 0.84 0.83 0.83 2217 weighted avg 0.84 0.83 0.83 2217
普通のResNet-50でもこのくらいは出るので、たぶんなんかおかしいんでしょうね。
Efficient-Net b7
次に、ちょうど最近やったので、EfficientNetとの比較もやってみたいと思います。 そもそものネットワーク構造が異なるので、「より後発のモデルと比較したらどんなもんか」くらいで確認したいと思います。
過去にやった結果を抜粋します。
precision recall f1-score support 0 0.81 0.75 0.78 57 1 0.82 0.79 0.80 67 2 0.72 0.76 0.74 66 3 0.89 0.95 0.92 61 4 0.87 0.67 0.76 58 5 0.88 0.83 0.85 70 6 0.78 0.86 0.81 69 7 0.93 0.91 0.92 56 8 0.56 0.87 0.68 45 9 0.82 0.79 0.80 62 10 0.78 0.75 0.76 51 11 0.95 0.83 0.89 66 12 0.77 0.86 0.81 122 13 0.87 0.88 0.88 69 14 0.70 0.64 0.67 59 15 0.85 0.75 0.80 60 16 0.89 0.72 0.79 67 17 0.83 0.91 0.87 133 18 0.98 0.85 0.91 73 19 0.57 0.96 0.71 54 20 0.82 0.82 0.82 50 21 0.98 0.95 0.97 60 22 1.00 0.74 0.85 57 23 0.98 0.79 0.87 62 24 0.77 0.84 0.80 49 25 0.90 0.90 0.90 58 26 0.93 0.73 0.82 59 27 0.95 0.97 0.96 58 28 0.87 0.92 0.90 51 29 0.80 0.91 0.85 57 30 0.86 0.91 0.88 55 31 0.72 0.90 0.80 59 32 0.78 0.62 0.69 56 33 0.89 0.82 0.85 50 34 0.93 0.79 0.85 71 accuracy 0.83 2217 macro avg 0.84 0.83 0.83 2217 weighted avg 0.84 0.83 0.83 2217
たぶん、最初のMicrosoftのやつが悪すぎますね。 使うにしても、やっぱりパラメータの調整は重要になりそうです。
感想
ということで、今回はMicrosoft Vision Model ResNet-50を使ってみました。 あんまりうまく行きませんでしたが、学習済みモデルなんて、こんなんなんぼあってもいいですからね。
とりあえず動いたので、ヨシ!