見出し画像

Python(Flask)を使ったAIアプリ「近鉄特急どれかな?」の開発記録 その3~学習済みモデルの軽量化~

AIアプリ「近鉄特急どれかな?」について

 AIアプリ「近鉄特急どれかな?」は、画像ファイルを読み込む、または画像のurlを指定すると、10種類の近鉄特急のうち、どれに似ているかを判別します。

  1.  12200系 スナックカー

  2.  12400系 サニーカー

  3.  20000系 楽

  4.  21000系 アーバンライナーplus

  5.  21020系 アーバンライナーnext

  6.  22000系 ACE(エー・シー・イー)

  7.  22600系 Ace(エース)

  8.  23000系 伊勢志摩ライナー

  9.  50000系 しまかぜ

  10.  80000系 ひのとり

Webアプリ「近鉄特急どれかな?」 判定後の画面

Webアプリ「近鉄特急どれかな?」はこちら

アプリ開発の流れ

  1. テーマ決め

  2. モデル学習用データを収集(Webスクレイピング)

  3. 学習用データの前処理(データクレンジング)

  4. モデルの作成と訓練 (tensorflow)

  5. 学習済みモデルの軽量化 (.h5から.tfliteへ変換) ←ココ

  6. Flaskでアプリの作成(ローカル環境)

  7. 本番環境の作成と公開(Heroku)

ここでは5.モデルの軽量化について述べます。

1 ~ 3(その1)はこちら
4(その2)はこちら
6, 7(その4)はこちら

Python実行環境

 Google Colaboratory Proを利用しました。モデルの評価部分のみローカルPCを利用しました。

Google Colaboratory

 Googleが提供するPythonを記述できるWebアプリケーションです。
基本的な機能は無料で使えます。より性能が良いPro、Pro+は有料です。

PC: Dell xps 13 2-in-1

  • プロセッサ   Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz   1.50 GHz

  • 実装 RAM 32.0 GB

  • システムの種類 64 ビット オペレーティング システム、x64 ベース プロセッサ

  • エディション  Windows 11 Pro
    バージョン   21H2

  • OS ビルド  22000.832

  • Ubuntuバージョン(WSL2): 22.04 LTS

  • Pythonバージョン: 3.10.4

  • Pythonを編集、実行したエディター: Visual Studio Code

Python仮想環境について

 作業ディレクトリ内に仮想環境を作成し、仮想環境内でスクリプトを実行しました。ターミナルで作業ディレクトリに移動し、以下を実行すると仮想環境が作成されます。

python3 -m venv env
source ./env/bin/activate

仮想環境から抜けるには、以下のコードを実行します。

deactivate

モデルの軽量化について

 ローカル環境では、4.モデルの作成と学習で得られた、学習済みモデルファイル(.h5)を用い、6.Flaskでアプリ作成を行い、うまくいきました。しかし、ローカル環境でうまくいっても、7.本番環境の作成と公開で躓いてしまいました。Herokuでは、最大500 MBのアプリケーションサイズの制限を超えてしまい、デプロイできない、Google App Engineでは、デプロイはできるが、制限に引っ掛かり、サーバーが落ちてしまう、、、等。
他にできることはないかと調べたところ、次のような手順で処理することで、モデルを軽量化し、ファイルサイズを小さくできることがわかりました。

  1. プルーニング(枝刈り)による軽量化と再訓練

  2. h5をtfliteへ変換

  3. 量子化でさらに軽量化

  4. 軽量化済みモデルの評価

以下のページを参考にさせていただきました。感謝です。
tensorflowの公式ページでは手書き文字認識のmnistを例にして、手順を示していました。ところどころ自分のモデルに適したパラメータに変更することで、軽量化作業に成功しました。

モデル軽量化で実行したPythonスクリプト

セットアップ

Google Driveをマウント

from google.colab import drive
drive.mount('/content/drive')

パスを通して作業ディレクトリ移動

import sys
import os

sys.path.append('/content/drive/My Drive/Colab Notebooks/train_app/scripts')
os.chdir("/content/drive/My Drive/Colab Notebooks/train_app/scripts")

ライブラリのインポート
自作関数の詳細はその2に記載しました。

訓練済みモデルのロード

出力結果

必要な情報をセット。

元モデル(.h5)を評価

出力結果

19/19 [==============================] - 13s 176ms/step - loss: 0.8767 - accuracy: 0.9133
Baseline test accuracy: 0.9133333563804626
Saved baseline model to: /tmp/tmpcicwvueq.h5

プルーニングによる軽量化

プルーニング用モデルの定義

出力結果

プルーニング用モデルで訓練

出力結果

38/38 [==============================] - 53s 1s/step - loss: 0.0348 - accuracy: 0.9914 - val_loss: 0.9338 - val_accuracy: 0.9067
<keras.callbacks.History at 0x7fee7893a910>

プルーニング前後の精度を比較

出力結果

Baseline test accuracy: 0.9133333563804626
Pruned test accuracy: 0.9066666960716248

精度はちょっと下がりました。。。

プルーニング済みモデルの保存

出力結果

WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.
Saved pruned Keras model to: /tmp/tmpipa48ii3.h5

h5からtfliteへ変換

出力結果

INFO:tensorflow:Assets written to: /tmp/tmp38f0k3o8/assets
WARNING:absl:Buffer deduplication procedure will be skipped when flatbuffer library is not properly loaded
Saved pruned TFLite model to: /tmp/tmpkd7_epp7.tflite

zipファイルサイズを比較

出力結果

Size of gzipped baseline Keras model: 211728544.00 bytes
Size of gzipped pruned Keras model: 211728674.00 bytes
Size of gzipped pruned TFlite model: 211734919.00 bytes

小さくなるはずのファイルサイズが大きくなっていました。。。

量子化で軽量化

出力結果

INFO:tensorflow:Assets written to: /tmp/tmpq9xtymw_/assets
INFO:tensorflow:Assets written to: /tmp/tmpq9xtymw_/assets
WARNING:absl:Buffer deduplication procedure will be skipped when flatbuffer library is not properly loaded
Saved quantized and pruned TFLite model to: /tmp/tmp98s090mt.tflite
Size of gzipped baseline Keras model: 211728544.00 bytes
Size of gzipped pruned and quantized TFlite model: 49769508.00 bytes

やった!今度こそ軽量化に成功。1/4以下になりました。

軽量化済みモデルの評価と保存

この処理はGoogle Colaboratory Plusでは途中でランタイムの接続が切れてしまったため、ローカルPCで行いました。

出力結果

Pruned and quantized TFLite test_accuracy: 0.9083333333333333

量子化前より精度が少し上がっていました。
得られた.tfliteのファイルサイズは56MBでした。.h5の390 MBから56 MBにサイズダウンできたので1/7ほどになりました。これなら大丈夫そう。。。
いよいよ次はアプリ制作です。

その4につづきます

この記事が気に入ったらサポートをしてみませんか?