KaggleのDigit Recognizerで画像分析(skorch編)

前回の日記で「Pytorchは難しい」という記載しましたが、このままで終わることはできません。

なぜなら、将来的に「Tensorflow」と「Pytorch」のどちらが生き残るか現時点では分からないからです。

ネットで調べると、PytorchをラップするScikit-Learning互換のニューラルネットワークライブラリ「skorch」というものを見つけました。

今回は「skorch」を試してみます。

[参考] 過去の機械学習関係の記事

skorchとは何?

前述通り、PytorchをラップするScikit-Learning互換のニューラルネットワークライブラリです。

つまり、skorchを用いて作成したmodelオブジェクトには、scikit-learnのようにfitやpredictなどのメソッドが一通り揃っています。
 

ただし、マイナーなライブラリで利用者は少ないです。

少ないというか皆無です。比例するようにググっても情報が少ないです。

現在の最新は2019年11月の0.7.0です。

v0.1.0が2017年12月に登場し、Pytorchのバージョンアップに伴い進化してきていますが、未だにalpha版的な扱いです。

コミュニティもあまり活発ではなく、急に辞めてしまう可能性があります。

ただ、このままではPytorchの学習が進まないので、使ってみます。

インストール

pipでインストールができました。

使い方

結論から言うとScikit-Learning形式なので超簡単でした。

学習モデルの記載方法

これはPytorchの記述をそのまま利用します。

要するに「Define by run」な学習モデルを記載可能です。

学習用データ、検証用データの作成方法

今まで通りです。

ただし、Kerasとはデータのフォーマットの変換形式が異なります。

【Kerasの場合】

【Pytorchの場合】

ただ、Kerasのようにy_train に対してOnehotエンコーディングをすると、うまく学習が進みませんでした・・・(誰か理由を教えて下さい・・・)

学習方法の記載方法

skorch.net に次の3種類が用意されています。

関数 説明
NeuralNet scikit-learnライクなmodelオブジェクトを作成するskorchのクラス。GridSearchCV(model, param_grid, scoring=’accuracy’)はできない
NeuralNetClassifier 分類器をsklearn風に。Netオブジェクトのforwardメソッドの最後の活性化関数は必ずF.softmax(dim=-1)すること
NeuralNetRegressor 回帰をsklearn風に

 

説明を読む限り、少し挙動に制限がありそうです。

初期化の際に、学習の仕方を決めます。パラメータは、PyTorchの関数を使用できます。

  • criterion : 損失関数の設定
  • optimizer : 最適化関数の設定
  • lr : 学習率の決定
  • module : pytorchで実装したnn.Module継承クラス
  • max_epochs : Epoch数
  • batch_size : ミニバッチサイズ
  • device : GPUの設定

その上で、訓練データの学習はScikit-Learning形式で次のように記載します。

予測の記載方法

これもScikit-Learning形式なので簡単です。

なお、skorch.NeuralNetを用いて作成したmodelオブジェクトは、最後のLinear層->log_softmaxの活性化が施された値で「y_pred.shape=(10000, 10)」となります。

このため、y_predに対してargmax(axis=1)を取る必要があります。

結果

出力されたCSVをサブミットすると「scored 0.98585」でKerasの「scored 0.98700」より少し低かったです。なぜ・・・。

なお、実際の出力画面は前回に比べて良くなったエポックに関しては色がつくよう仕様になっています。

まとめ

容易さはKerasと同じレベルです。

しばらくディープラーニングで解く場合には両方で記述するように努力してみます。

ただ「skorch」は癖も強そうなので、早めに「Pytorch」を使えるようになる必要はありそうです。

ソースコード

後学に向けてコメントも多くつけてます。

タイトルとURLをコピーしました