Re:ゼロから始めるML生活

どちらかといえばエミリア派です

Microsoft Vision Model ResNet-50 を使ってみる

f:id:nogawanogawa:20181029135436p:plain

先日、こちらのツイートを拝見しました。

何やらResNet50の学習済みモデルとして、良い感じのものが公開されたそうです。 最近ResNetの使い方の勉強をしていたので、その延長で今回はこちらを使ってみようと思い、やってみたので今回はそのメモです。

Microsoft Vision Model

本件の元ネタはMicrosoft Researchのブログのようでした。

www.microsoft.com

もともとResNet-50のモデルは、これに限らず公開されていましたが、今回は既存のものより精度の良い事前学習済みのモデルを公開したとのことでした。 どうやら、下記のパッケージが公開されたモデルになるようです。

pypi.org

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との比較もやってみたいと思います。 そもそものネットワーク構造が異なるので、「より後発のモデルと比較したらどんなもんか」くらいで確認したいと思います。

過去にやった結果を抜粋します。

www.nogawanogawa.com

              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を使ってみました。 あんまりうまく行きませんでしたが、学習済みモデルなんて、こんなんなんぼあってもいいですからね。

とりあえず動いたので、ヨシ!