![見出し画像](https://assets.st-note.com/production/uploads/images/84020001/rectangle_large_type_2_011217c868d82a07b70e678495643f3c.jpeg?width=1200)
Python(Flask)を使ったAIアプリ「近鉄特急どれかな?」の開発記録 その3~学習済みモデルの軽量化~
AIアプリ「近鉄特急どれかな?」について
AIアプリ「近鉄特急どれかな?」は、画像ファイルを読み込む、または画像のurlを指定すると、10種類の近鉄特急のうち、どれに似ているかを判別します。
12200系 スナックカー
12400系 サニーカー
20000系 楽
21000系 アーバンライナーplus
21020系 アーバンライナーnext
22000系 ACE(エー・シー・イー)
22600系 Ace(エース)
23000系 伊勢志摩ライナー
50000系 しまかぜ
80000系 ひのとり
![](https://assets.st-note.com/img/1659665518154-R6wW9cmIK9.png)
Webアプリ「近鉄特急どれかな?」はこちら
アプリ開発の流れ
テーマ決め
モデル学習用データを収集(Webスクレイピング)
学習用データの前処理(データクレンジング)
モデルの作成と訓練 (tensorflow)
学習済みモデルの軽量化 (.h5から.tfliteへ変換) ←ココ
Flaskでアプリの作成(ローカル環境)
本番環境の作成と公開(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
バージョン 21H2OS ビルド 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では、デプロイはできるが、制限に引っ掛かり、サーバーが落ちてしまう、、、等。
他にできることはないかと調べたところ、次のような手順で処理することで、モデルを軽量化し、ファイルサイズを小さくできることがわかりました。
プルーニング(枝刈り)による軽量化と再訓練
h5をtfliteへ変換
量子化でさらに軽量化
軽量化済みモデルの評価
以下のページを参考にさせていただきました。感謝です。
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につづきます