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

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

第3回~ResponderとKerasで機械学習アプリケーションを作りたい!~

この記事は、「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} としましたので、ルートを追加します。

コントローラ

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

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

ビュー

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

ザ・シンプルです。

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

試しに動かしてみる

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

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

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

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

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

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

第4回へつづく!

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

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

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

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

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

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

お楽しみに!

こちらの記事もオススメ!



Kerasのオススメ本

直感 Deep Learning ―Python×Kerasでアイデアを形にするレシピ
直感 Deep Learning ―Python×Kerasでアイデアを形にするレシピ

 

書いた人はこんな人

広告メディア事業部
広告メディア事業部
「好きを仕事にするエンジニア集団」の(株)ライトコードです!

ライトコードは、福岡、東京、大阪の3拠点で事業展開するIT企業です。
現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。
いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。

システム開発依頼・お見積もり大歓迎!

また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」「WEBディレクター」を積極採用中です!
インターンや新卒採用も行っております。

以下よりご応募をお待ちしております!
https://rightcode.co.jp/recruit

関連記事

採用情報

\ あの有名サービスに参画!? /

バックエンドエンジニア

\ クリエイティブの最前線 /

フロントエンドエンジニア

\ 世界を変える…! /

Androidエンジニア

\ みんなが使うアプリを創る /

iOSエンジニア