機械学習はじめにPytorchでMNISTをやってみたいと思います。chainerに似てるという話をよく見かけますが、私はchainerを触ったことがないので、公式のCIFAR10のチュートリアルをマネする形でMNISTに挑戦してみました。Notebookデータの用意PyTorchにはtorchvisionという、有名なデータセットや画像処理でよく使う関数などをまとめたパッケージが存在しているようです。MNISTのデータセットをウンロード・読み込みする手段も提供されているので、今回はこれを使用してデータを準備してみます。試しにダウンロードして中身を確認してみます。shuffle=False)torchvision.datasets.MNISTクラスでデータセットをダウンロードできます。最初の引数がデータがダウンロードされるディレクトリなので、適宜変更してください。ダウンロードしたデータセットに変換をかけたい場合は、transform引数に関数を渡してあげるとよいみたいです。今回は特に複雑な変換や正規化はせず、単純にtransforms.ToTensor()でtorch.Tensorクラスに変換しています。torch.utils.data.DataLoaderクラスで、データセットをロードして指定したバッチサイズに分割して順に読み込みできる状態にしてくれます。次のようにすると、1つ目のデータを取り出して、matplotlibで画像を表示できます。labels[0])ラベルは5なので、確かによく見るMNISTのデータのようです。今度はMNISTやDataLoaderの引数を少しいじって、トレーニングデータとテストデータを用意しておきます。バッチサイズは4、トレーニングデータは順番をシャッフルする設定にしてあります。shuffle=False)モデルの定義MNISTの画像サイズは28*28なので、1次元ベクトルにすると784次元になります。Forwardネットワークにします。784次元の入力層、50次元の中間層、10次元の出力層といった構成です。モデル自体は、nn.Moduleクラスを継承して定義します。コンストラクタ内でネットワークの構成を定義してあげて、forward関数内で順伝播の処理を実装してあげます。この2つの関数を定義するだけで、逆伝播部分は自動で面倒を見てくれます。28)という次元のテンソルになります。上記__init__で定義したモデルは784次元のベクトルの入力を受け入れるので、torch.Tensor.view関数を使ってテンソルをリサイズする必要があります。784)という次元のテンソルに変換しているのがforward関数の1行目になります。コスト関数と学習方法を定義コスト関数と学習方法を定義します。代表的なコスト関数や最適化手法はあらかじめ提供されているので、今回はそれに乗っかります。コスト関数にクロスエントロピー、最適化手法にSGDを選択した場合、コードは次のようになります。optim.SGDに引数として最適化対象のパラメータ一覧を渡しています。モデルを定義する際に継承したnn.Moduleクラスがparameters()というパラメータ一覧を取得するメソッドを提供しているので、非常に簡単です。lr=0.01)学習させてみる今まで書いたコードを使って、早速学習させてみます。学習を3エポック分回してみます。Training')実際にこれを走らせると、次のように損失が徐々に小さくなっていくことが確認できました。Trainingテスト次にテストデータを使って精度を確認してみます。テストデータ自体はtest_loaderで読み込める状態になっているので、テストデータの入力をモデルに渡して、出力から予測ラベルを得て、正解率を算出するだけです。total))これで92%の精度が出ていることが確認できました。学習ができていそうです。0.920000テストデータの予測例テストデータを1つ取り出して、実際にどのような画像にどのようなラベルを予測しているか見てみます。predicted[0])すると、下記画像に対して7を予測していることがわかりました。確かにちゃんと予測できていそうですね。NotebookはGitHubにアップロードしてあります。必要に応じて参照していただければと思います。アーカイブおすすめの本はてなブログをはじめよう!kanohkさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。