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

これまでディープラーニング(深層学習)の実装にはKerasを利用していました。

近年は「PyTorchがディープラーニング系ライブラリでは良い」という話を聞きます。

今回はPytorchを使って前回扱ったDigit Recognizer」を解いてみます。

なお、Pytorchも未だPython3.8は未対応です。

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

なお、結論から言うと理解が追いつかず、学習モデルを構築してKaggleを実施するには敷居が高そうです。

ディープラーニングフレームワーク一覧

近年は様々なフレームワークが登場しています。

  • TensorFlow(テンソルフロー)
  • Keras(ケラス)
  • Chainer(チェイナー)
  • Pytorch(パイトーチ)
  • MXNet(エムエックスネット) Deeplearning4j(DL4j)
  • Microsoft Cognitive Toolkit(マイクロソフトコグニティブツールキット)
  • PaddlePaddle(パドルパドル)
  • Caffe(カフェ)
  • Theano(テアノ)

その中で「Keras(TensorFlow)」「Pytorch」が人気という理解です。

Googleトレンドで確認する限りは、人気は倍近い違いがあるように見えます。

ただ、Pytorchは研究者が続々と採用しており主要な論文が出ると即実装されるなど、R&D界隈では圧倒的に人気が高く、これだけでは判断できません。

Pytorchって何?何が凄いの?

PyTorchとはPython向けのオープンソース機械学習ライブラリで、Facebookの人工知能研究グループにより初期開発されました。

PyTorchは2016年後半に発表された比較的新しいライブラリです。

Kaggleの優勝者のJeremy Howardが「PyTorchの方が使い易い」と言っています。

【メリット】

  • 研究者が続々と採用していて、主要な論文が出ると即座に実装される
  • Define by run。学習処理内にbreakpointを置いたデバッグが可能
  • modelもlayerもどっちも同じModuleクラスという設計なので複雑なネットワークも記述できる
  • tensorオブジェクトにsqueeze、viewなどのメソッドが充実しているのでコードの可読性が高い
  • gpuのon/offが簡単

【デメリット】

  • 学習・予測処理を自分で一から書く必要がある。 dataloaderを作成するところを含めて、学習・予測処理を記述するのが面倒
  • web上の情報が少ない

ようするに、私のような初心者にはPytorchはとっつきにくく難しいという事です。

ですが昨年「PyData.Tokyo Meetup #16 – 深層学習ライブラリ PyTorch」でPytorch押しな講演を聞き、それでもやらねば・・・と思ってます。

※同じDefine by runの「Chainer」は2019年12月5日に開発終了すると発表がありました。

Pytorchインストール

そもそもライブラリがPythonのバージョンアップに追従していない問題回避に仮想環境であるAnacondaを使うのが一般的です。

ただしAnacondaで苦い経験があるのでpip使って粛々とインストールしてみます。

※ Python3.6を利用しています。

次のようなエラーが出ました。

ダウンロードサイトから直接ダウンロードしたところ問題を回避できました。

PytorchでCNNを使ったDigit Recognizer実践

Kerasとソースコードを比較しながら理解を深めていきます。

学習モデルをつくる

この部分がディープラーニングで重要な部分です。

【Kerasの場合】

【Pytorchの場合】

Kerasはネットワーク構成を決めてからデータを投げます。

これを「Define and Run」と呼びます。

つまり定義の時点でデータは考えません。

一方でPyTorchがデータを投げて実行しながらネットワークを定義(forward(x)のx部分)します。

これは「Define by Run」と呼ばれます。

このメリットは次のようなものがあります。

  • 柔軟な設計が可能
  • 1イテレーションごとに設計を変えられる

このため、研究者界隈では「Define by Run」が主流です。

学習させる

これで終わっていれば、

PyTorch使ってみようかな・・・・

と思えます。

しかし、モデル(model)と学習データ(x_train, y_train)が用意できてからが大変です。

学習させてみましょう。

【Keras、scikit-learnの場合】

一行です。

【Pytorchの場合】

datasetオブジェクト作成から数えると10行を超える記述が必要になってしまいます。

この部分に正直興味ないのです。

予測させる

こちらもPytorchは面倒です。

【Kerasの場合】

一行です。

【Pytorchの場合】

もう何をしているのか分かりません・・・・。

なぜ、ここまで記述が面倒なのかな・・・。

初心者には敷居が高く、自分で使いこなすのは大変そうです。

ほぼ写経で出てきたアウトプット

とりあえず記事末のスクリプトを動かすと次のような結果を得られます。

5エポックでも計算時間が20分必要でした。

まとめ

難しいの一言。

学習モデル構築は何とかなりそうですが、学習させたり評価させる部分の実装が超面倒です。

このままだと私のような初心者は利用するメリットが全くありません・・・・。

ソースコード

正直、詳細の理解が追いついていません。

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