【PyTorch】MNISTのサンプルを動かしてみた

今まではTensorFlowバックエンドのKerasでディープラーニングをやっていましたが,そろそろKerasを卒業したいなと思いまして,PyTorchを少し触ってみました。

PyTorchにした理由は,

  • 実行速度が速い
  • ユーザが多い
  • Define by Run
  • 論文の実装がPyTorchの場合が多い(重要)

といったようなところです。

まずはMNISTでやってみる

Kerasでは2種類ほど過去にディープラーニングの実装はやってみました。

このときに自前(といってもオープンデータですが)を用意して実装したので,この2つをPyTorchに書き換えてもいいかなーとも思ったのですが,とりあえずはサンプル通りにということでMINISTのデータを使ってやってみることにします。

サンプルの理解

ただサンプルを実行してみるだけだとコピペで一瞬で終わるので,自分の理解も兼ねて少し細かくコメントを入れていくことで勉強してみたいと思います。

ここでは処理ごとにソースを分割していきますが,ソースの全文は最後にまとめて記載しておきます。

ネットワーク構成とForward計算の定義

まずはネットワーク構成とForward計算を定義します。

  • ポイント①:torch.nn.Moduleを継承してネットワーク構成を定義していく
  • ポイント②:forward関数の中で入力xに応じて動的に処理を変更できる
  • ポイント③:ユニット数の計算が面倒くさい

ポイント①はPyTorchのお作法として大切な点,ポイント②がPyTorchno特徴のひとつであるDefine by Runらしい部分です。

エラーが発生してデバッグをするときも,中で何が起きているのかが完全にトレースできるので結構楽です。

ポイント③については頑張って計算しましょう。特に畳み込み層から全結合層に変わる部分は,全結合側のユニット数(in_features)を何個に設定すればいいのか結構ハマったりします。

適当に検索したコードをコピペせずに,ちゃんと自分でネットワークを設計すれば基本的にハマることはないはずですが(笑)

学習用の関数の定義

学習するための関数を定義します。

  • ポイント①:学習モードの設定を行う
  • ポイント②:GPUを使用する場合は明示的に指定する

PyTorchの場合は,学習時と推論時で各モードを設定する必要があります。

また,知らないと結構ハマってしまうポイントだったりしますが,PyTorchではGPUを使用する場合は明示的に指定しなければいけません。

テスト用の関数の定義

テスト用の関数を定義します。

内部的には,まず推論を行ってその後に評価の計算を行っています。

  • ポイント①:推論モードに変更する
  • ポイント②:GPUを使用する場合は明示的に指定する
  • ポイント③:推論と評価の処理は個別に記述する

ポイント①と②は学習時と同様です。

ポイント③については,テストは「推論をまず行って,その結果を使って評価する」という構成で定義します。

main処理の定義

  • ポイント①:入力のnumpyオブジェクトのサイズは[画像数,チャネル数,縦,幅]
  • ポイント②:DataLoaderを作成する

TensorFlowなどでは入力となるnumpyオブジェクトは[画像数,高さ,幅,チャネル数]というサイズになると思います。

しかし,PyTorchでは[画像数,チャネル数,縦,幅]というサイズになるため,データを作成する際には注意が必要です。

また,入力データと教師データをセットにしてDataLoaderを作成する点も,Kerasなどとは少し異なるお作法です。

ソース全文と出力結果例

以上のソースの全文と,実行した場合の出力例を記載しておきます。

※実行時には環境によってWarningが出るかもしれませんが,実行結果には影響はないと思います。

スポンサーリンク