久しぶりのPytorch、復習しながら勉強を進めたいです。復習しながら、プログラムの構成をみていきましょう~Pytorchのチュートリアルでflaskで画像分類アプリを作成しています。公式ドキュメントはこちらのページです。documentation前回は、とりあえずPytorchとFlaskの画像分類アプリを動作させました。これで、大体どんな動作をするのかがわかりました。Pytorchのチュートリアルにflaskと連携するものがありました。目次Pytorchを中心にプログラムを理解importtorchvisionは、pytorchに実装されている画像関係のモジュールです。PILはPythonの画像処理モジュールで、トリミングなど、シンプルな処理ができます。flaskはWebフレームワークですね。今回、分類器としてはtorchvisionにあらかじめ学習済みの「DenseNet121」を利用しています。DenseNetの公式ドキュメントはこちらにあります。deployment.DenseNet121は、224×224サイズ3チャンネル画像を入力とする畳み込みニューラルネットワークモデルです。「pretrained=True」として呼び出すことで、あらかじめ学習された1000クラスの分類を行うことができます。models.densenet121(pretrained=True)#検証モードmodel.eval()Pytorchでは、autogradという機能があり、tensorの計算を記録することで勾配を簡単に求めることができました。分類器として利用する際は、勾配を求める必要がないので、evalとすることで検証用の状態に変更できます。ニューラルネットのモデルには、「訓練する状態」と訓練した状態のネットワークを「使う状態」の2状態があって、evalで「使う状態」にできる、というようなイメージです。ニューラルネットの内部で勾配がどのように利用されているかなどは、こちらのチュートリアルをやると理解が深まると思います。PyTorchのチュートリアルをやるとすごく理解が深まります。PyTorchにはまってますね。PyTorchのチュートリアルを順番に進めていっています。次のチュートリアルは、「WHA...入力画像の変換処理torchvisionのtransformsを利用して、入力画像をニューラルネットの入力サイズに変換する関数です。Composeのメソッドが一連の変換処理を実行してくれます。一連の変換処理は「input_transforms」というリスト形式で表現しています。中心から224×224を切り取り」→「Tensor型に変換」→「RGBチャンネルをそれぞれ平均,標準偏差の順番の引数でNormalize処理」という流れです。0.225])]#Normalize(平均,標準偏差)を行います。#一連の処理をmy_transformsとします。#入力画像をPILとして読み込みます。#timgとして画像を変換して格納しています。timg最後のunsqueezeでは、バッチ形式にデータを加工しています。バッチというのは、ニューラルネットワークへ与える画像のセットで、一つのバッチに何枚もの画像データが入っています。1枚だけ与える場合でも1枚だけ画像が入ったバッチにしなければいけません。squeezeする前の画像は、次の図のように、RGBの画像が3チャンネル(2のくくりが3個)と、画像全体としてのくくりである1が一つですが、この状態ではニューラルネットは受け付けてくれません。squeezeは指定の次元を挿入するということで、0番目、下の図で言う3のようなくくりを追加することで、画像枚数をくくるような次元を追加することになります。squeeseの後の「_」によって、同じtimgを上書きして利用するように指定しています。Pytorchのテンソルは計算の過程が記録されていきますので、このように変数を上書きするときも明示的に「_」で明記しないといけないんですね。予測をする関数get_predictionはニューラルネットワークにデータを入れて順伝播させ、予測値を得る関数です。シンプルに、モデルのforwardメソッドを実行しています。得られた出力から、最も値が大きいクラスを選択しています。得られた答えはテンソル型のため、数値にするためにitemメソッドで変換をしています。predictionクラス名を取得する関数render_prediction関数は、ニューラルネットから得られたクラス番号のラベルを探して返す関数です。DenseNet121は、1000個のクラス分類ができ、答えとしては0~999の数値が返ってきます。その数値をあらかじめjson形式で対応付けしたラベル一覧「index_to_name.json」を参照して答えの単語を返すというような処理を行います。#入力としてニューラルネットの答えを受けます。#img_calss_mapをループして、一致するラベルを検索します。class_nameちなみに、ループ内で利用されるimg_class_mapは、プログラム冒頭処理で次のように「index_to_name.json」から読み込まれているラベル名称一覧になります。json.load(f)これで、ニューラルネットが動作する関数は理解できました。次回は、ニューラルネットのそれぞれの部品を組み合わせて動作のトリガーなどを定義してるflask周りのプログラム構成についてみていきたいと思います。PyTorchよかったらシェアしてね!URLをコピーしました!URLをコピーしました!パンダの中のパンダサウンドクリエータ、プログラマひたすら脳内の思考と雑念を記事にしている気が・・・ご容赦ください!音楽、プログラム、自分の作品となる何かが作れる日を目指して邁進中です。