1. HOME
  2. ブログ
  3. IT技術
  4. 【第3回】ResponderとKerasを使って機械学習Webアプリケーションを作ってみる【非同期処理編】

【第3回】ResponderとKerasを使って機械学習Webアプリケーションを作ってみる【非同期処理編】

~第3回~ResponderとKerasを使って機械学習Webアプリケーションを作ってみる!

この記事は、「ResponderとKerasを使って機械学習Webアプリケーションを作ってみる」という連載記事になります。

連載終了後、「機械学習と相性が良いのでは!?」と思い立ち、「Responder」と「機械学習」を絡めた記事を書くことを決めました。

簡単なアプリケーションではありますが、Responderのさらに詳しい使い方が分かっていただける記事になるはずです!

まずは、第1回をお読みください

第3回: バックグラウンドで機械学習を行う

さて、今回は本アプリケーションの核を作っていきます。

「作成したネットワークで機械学習をバックグラウンドで行い、その間ユーザには待機ページを表示させておく」といった部分を作成します。

簡単そうに見えて、これが意外と厄介なのです。

ただ、Responderでは、このような非同期処理(バックグラウンドタスク)が簡単に書けるので、使ってみたいと思います。

前回の記事はこちら

LearnControllerを作る

それでは、前回、大枠だけ作った学習部のコントローラに加筆していきます。

前回までは、以下のようになっていました。

このPOST処理部分に加筆していきます。

まずは、ざっくりと「こんな関数があったらいいな」的な発想でコードを書きます

この考え方は意外と重要です(笑)

ここで任意のIDを生成する理由は、同時にこのアプリケーションにアクセスした時に、結果が競合しないようにするための簡単な回避です。

最初に、以下をインポートする必要がありますので加筆してください。

あったらいいな関数①: get_data()

では、1つ目の「あったらいいな関数」を実装します。

この関数では、指定されたデータセットに対して、「訓練データ」「訓練ラベル」「検証データ」「検証ラベル」の4つを、辞書型変数として返してくれることを期待しています。

今回用いるデータセットは、以下を取得しますが、若干形式が異なるため、この関数内でうまいこと同じような形式に変換します

Keras・MNIST
scikit-learn・Iris
・Wine

また、「Iris」と「Wine」については、「訓練データ」と「検証データ」が元から分けられていません。

そのため、今回は簡単に全データのうち120個を「訓練データ」、それ以外を「検証データ」とすることにします。

実装

まず、以下を controller.py の最初に加筆します。

では、関数 get_data()を作っていきましょう!

記述する場所は、 controller.py のどこでも良いですが、無難に一番下に加筆していきます。

少し長々としたコードですが、実は、大したことはやっていません。

注意としては、「Iris」と「Wine」ではデータ値にばらつきがあるので、平均と分散を揃える標準化を行なっています。

これをしないと、学習が困難になってしまうからです。

機械学習を行う: learn_model()

次の「あったらいいな関数」を実装しましょう。

この関数では、「モデルを作成およびモデルを学習させた後、結果を描画する」までを担います。

簡単に言えば「超重い関数」です。

もし、普通に実装すると、ユーザは学習が終わるまでずっと何もページが表示されないままの読み込み状態に遭遇してしまいます。

こんなアプリは誰も使いたがらない上に、下手すればサーバからの応答時間が長すぎてエラーを吐かれてしまう可能性があります(笑)

非同期処理・バックグラウンドタスク

そこで普通は、マルチスレッドにして並列処理にしたりしますが、Responderでは、それが簡単に実装可能です。

公式でも、それを推しているようですので使ってみましょう!

なんと、Responderでは、バックグラウンドで処理したい関数に @api.background.task というデコレータを付けるだけです。

では、早速、関数を作っていきましょう!

必要なモジュールのインポート

まずは、モデル作成に必要なモジュールをインポートします。

インポート場所は、controller.py の最初です。

今回は超シンプルなネットワークですので、これだけでOKです。

関数を実装

実装例は、以下のとおりです。

各処理にはコメントがあるので、ひとつひとつ丁寧に追ってみてください。

注意する部分

注意する部分はいくつかありますが、簡単に説明を入れておきます。

特に2つ目は、筆者も少し悩まされました…。

Responder では、POSTで得た配列データは get_list()  でリストとして取得できる

バックエンドで動いている TensorFlow の性質上、 keras.backend.clear_session()  で TensorFlow のデータフローグラフを削除しておかないと、他データセットを使った学習を続けて行えない

global result  で明示的に大域変数にしておくことで、他クラスからもアクセスが可能 (親クラスでまとめてメンバ変数にしてしまうのもアリ)

学習中のビューを仮作成

それでは、リダイレクト先のビューを作って動作確認をしましょう。

リダイレクト先のURLは、 /learning/{uid} としましたので、ルートを追加します。

コントローラ

次に、コントローラを実装します。

まだ仮ですので、以下のような感じで構いません。

ビュー

ビューは、以下のようにしてみました。

ザ・シンプルです。

responder_keras_app_1-4

ちなみに、まだ学習終了のリダイレクト処理は実装していないので、待っても何も起こりません。

試しに動かしてみる

それでは、実際に動かしてみるとします!

responder_keras_app_1-1

データを選択して、ネットワークを作成します。

次に、「このネットワークで学習を行う」をクリックしてみてください。

responder_keras_app_1-3

学習中ページにリダイレクトされるかと思います。

そんな中、コンソール上ではKerasの機械学習処理が実行されています。

responder_keras_app_3-1

上記図のようになっていたら、バックグラウンド処理がうまく実行できています!

第3回: さいごに

今回は、アプリケーションの核となる部分の作成をしました。

Responderでの、バックグラウンド処理についてもご理解いただけたと思います。

次回は、「学習終了後の動作」について実装していこうかと思います!

(これがまた重要です!)

今のままでは学習終了しても、ユーザには「学習中…」のままなので(笑)

なんと、早くも次回で最終回!

お楽しみに!

関連記事

ライトコードよりお知らせ

にゃんこ師匠にゃんこ師匠
システム開発のご相談やご依頼はこちら
ミツオカミツオカ
ライトコードの採用募集はこちら
にゃんこ師匠にゃんこ師匠
社長と一杯飲みながらお話してみたい方はこちら
ミツオカミツオカ
フリーランスエンジニア様の募集はこちら
にゃんこ師匠にゃんこ師匠
その他、お問い合わせはこちら
ミツオカミツオカ
   
お気軽にお問い合わせください!せっかくなので、別の記事もぜひ読んでいって下さいね!

一緒に働いてくれる仲間を募集しております!

ライトコードでは、仲間を募集しております!

当社のモットーは「好きなことを仕事にするエンジニア集団」「エンジニアによるエンジニアのための会社」。エンジニアであるあなたの「やってみたいこと」を全力で応援する会社です。

また、ライトコードは現在、急成長中!だからこそ、あなたにお任せしたいやりがいのあるお仕事は沢山あります。「コアメンバー」として活躍してくれる、あなたからのご応募をお待ちしております!

なお、ご応募の前に、「話しだけ聞いてみたい」「社内の雰囲気を知りたい」という方はこちらをご覧ください。

ライトコードでは一緒に働いていただける方を募集しております!

採用情報はこちら

関連記事