前回のおさらいと今回のテーマ
こんにちは!前回は、モデルのデプロイ方法として、Flaskを使ったシンプルなWeb APIの構築方法を学びました。APIを使うことで、学習済みモデルをリアルタイムに利用可能なサービスとして提供できることが分かりましたね。
今回は、さらに一歩進めて、Flaskを使ってWebアプリケーションにモデルを組み込む方法を解説します。APIの形でモデルをデプロイするだけでなく、Webアプリケーションのインターフェースを通じてユーザーがモデルにアクセスし、インタラクティブに予測結果を確認できるようにします。これにより、実際のアプリケーションで機械学習モデルを活用する方法が具体的に理解できます。それでは、Flaskを使ったシンプルなWebアプリケーションの実装に取り組んでいきましょう。
Flaskとは?
Flaskは、PythonでWebアプリケーションやAPIを構築するための軽量なフレームワークです。Flaskはシンプルで柔軟性があり、小規模なアプリケーションからAPIの開発まで幅広く利用されています。
Flaskの主な特徴は以下の通りです。
- シンプルで軽量: 必要最低限の機能のみを備えており、学習コストが低い。
- 柔軟性: プラグインや拡張を通じて、自分に合ったWebアプリケーションを構築できる。
- 高速な開発: 簡単な構造で、迅速にプロトタイプやアプリケーションを開発できる。
シンプルなWebアプリケーションの設計
まずは、Flaskを使ってシンプルなWebアプリケーションを設計し、その中にモデルを組み込む流れを説明します。今回作成するWebアプリケーションでは、以下の機能を実装します。
- ユーザーがフォームにデータを入力できるインターフェース
- 入力されたデータを受け取り、学習済みモデルで予測を行う処理
- 予測結果をWebページに表示
このようにして、モデルをWebアプリケーション内で利用することで、ユーザーがインタラクティブに予測機能を使えるようにします。
必要なライブラリのインストール
まず、FlaskとTensorFlow(またはKeras)をインストールします。これにより、Webアプリケーションの構築と学習済みモデルの読み込みが可能になります。
pip install flask tensorflow
学習済みモデルの準備
まず、簡単なモデルを作成し、保存しておきます。以下は、数字を分類するシンプルなモデルの例です。
import tensorflow as tf
from tensorflow.keras import layers, models
import numpy as np
# モデルの定義
model = models.Sequential([
layers.Dense(128, activation='relu', input_shape=(4,)), # 入力は4つの特徴量
layers.Dense(64, activation='relu'),
layers.Dense(3, activation='softmax') # 3クラス分類
])
# モデルのコンパイル
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
# ダミーデータで訓練
x_train = np.random.rand(100, 4)
y_train = np.random.randint(3, size=100)
model.fit(x_train, y_train, epochs=10)
# モデルの保存
model.save('simple_model.h5')
- model.save(‘simple_model.h5’): モデルをファイルに保存します。このファイルをWebアプリケーションで読み込み、予測に利用します。
Flaskアプリケーションの作成
次に、Flaskアプリケーションを作成し、保存したモデルを読み込んでWebアプリケーション内で使用できるようにします。
1. Flaskアプリケーションの初期設定
まず、app.py
というファイルを作成し、以下のコードを書きます。
from flask import Flask, render_template, request
import tensorflow as tf
import numpy as np
# Flaskアプリケーションの初期化
app = Flask(__name__)
# 学習済みモデルの読み込み
model = tf.keras.models.load_model('simple_model.h5')
# ホームページのルーティング
@app.route('/')
def home():
return render_template('index.html')
# 予測用のルーティング
@app.route('/predict', methods=['POST'])
def predict():
# フォームからのデータを取得
input_data = [float(request.form['feature1']),
float(request.form['feature2']),
float(request.form['feature3']),
float(request.form['feature4'])]
# 入力データをモデルに与えて予測
prediction = model.predict(np.array([input_data]))
predicted_class = np.argmax(prediction)
# 結果を表示
return render_template('result.html', prediction=predicted_class)
# アプリケーションの実行
if __name__ == '__main__':
app.run(debug=True)
2. テンプレートファイルの作成
Flaskでは、HTMLテンプレートを使ってWebページを生成します。テンプレートファイルは、templates
というフォルダに保存します。
(1) index.html
(入力フォーム)
templates/index.html
を作成し、以下の内容を記述します。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Simple Flask App</title>
</head>
<body>
<h1>データを入力してください</h1>
<form action="/predict" method="POST">
<label for="feature1">特徴量1:</label>
<input type="text" id="feature1" name="feature1"><br><br>
<label for="feature2">特徴量2:</label>
<input type="text" id="feature2" name="feature2"><br><br>
<label for="feature3">特徴量3:</label>
<input type="text" id="feature3" name="feature3"><br><br>
<label for="feature4">特徴量4:</label>
<input type="text" id="feature4" name="feature4"><br><br>
<input type="submit" value="予測">
</form>
</body>
</html>
このフォームでは、ユーザーが4つの特徴量を入力し、/predict
エンドポイントにPOSTリクエストを送信します。
(2) result.html
(予測結果の表示)
次に、templates/result.html
を作成し、予測結果を表示するページを設定します。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Prediction Result</title>
</head>
<body>
<h1>予測結果</h1>
<p>予測されたクラス: {{ prediction }}</p>
<a href="/">戻る</a>
</body>
</html>
{{ prediction }}
の部分には、Flaskから送られてきた予測結果が表示されます。
3. アプリケーションの実行
すべてのファイルが準備できたら、ターミナルでapp.py
を実行します。
python app.py
ブラウザでhttp://127.0.0.1:5000
にアクセスすると、Webアプリケーションが表示され、データを入力して予測結果を確認できます。
Flaskアプリケーションのデプロイにおけるベストプラクティス
- セキュリティの強化: ユーザーが入力するデータに対してバリデーションを行い、SQLインジェクションやXSS攻撃などの脅威からアプリケーションを保護します。
- スケーラビリティの考慮: アプリケーションを本番環境にデプロイする際は、NginxやGunicornなどのWSGIサーバーを使用して、パフォーマンスとスケーラビリティを向上させます。
- クラウド環境での運用: AWS、
Heroku、GCPなどのクラウドプラットフォームを利用することで、アプリケーションをスケーラブルかつ信頼性の高い環境で運用できます。
まとめ
今回は、Flaskを使ったWebアプリケーション化として、シンプルなWebアプリに機械学習モデルを組み込む方法を解説しました。Flaskを利用することで、ユーザーがインタラクティブにモデルを使い、リアルタイムで予測結果を確認できるアプリケーションを迅速に構築できます。今後、さらに複雑なアプリケーションやAPIを構築する際の基礎として、ぜひ活用してください。
次回予告
次回は、APIの作成と公開として、モデルをAPIとして提供する方法を解説します。実際にAPIを作成し、公開するまでの流れを学びましょう!
注釈
- Flask: Pythonの軽量なWebフレームワークで、APIやWebアプリケーションの構築に広く使われている。
- テンプレートエンジン: Flaskでは、Jinja2というテンプレートエンジンを使ってHTMLテンプレート内にPythonの変数やロジックを埋め込むことが可能。
コメント