題名の通り。
streamlitとkerasで遊んだ。
動画デモ:
環境情報
- 機械学習モデル作成環境:
google colaboratory
- web app環境:
windows 10+anaconda
InceptionV3をファインチューニングする
下記google colabにて実施。
colab.research.google.com
streamlitでwebアプリを作る
下記githubにコードを格納
github.com
詰まったところ:
anacondaでconda install tensorflow-gpu keras
すると、tf 2.1.0
がインストールされるが、windows環境ではAttributeError: ‘_thread._local’ object has no attribute 'value’
というエラーが出る。
実際、下記のissueでも議論されている。
discuss.streamlit.io
github.com
ググると、「tf 1.xに下げろ」という方法が散見されるが、google colabのtfは2.x系なので抵抗がある、また、やっても失敗したので下記のように対応した。
AttributeError: ‘_thread._local’ object has no attribute 'value’
の対処は下記を追加
import keras.backend.tensorflow_backend as tb
tb._SYMBOLIC_SCOPE.value = True
st.set_option('deprecation.showfileUploaderEncoding', False)
- さらに
ValueError: Cannot create an execution function which is comprised of elements from multiple graphs.
というエラーが出るが、
これはkeras
からインポートしているモデル構築モジュールをtensorflow.keras
にして対処。
InceptionV3の場合は下記のようにimport文を変更して対処した。
from tensorflow.keras.applications.inception_v3 import InceptionV3
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense, GlobalAveragePooling2D
from tensorflow.keras import backend as K
from tensorflow.keras.optimizers import SGD
イベント発火時(画像をアップロードしたりチェックボックス操作時など)にstreamlitのコードは再実行される。
そのため、機械学習モデルの再構築を再読み込みが行われて時間がかかる。
これはstreamlitのyoloを使った物体認識webアプリのチュートリアル に、機械学習モデル読み込み時にcacheを使って対処している。
@st.cache(allow_output_mutation=True)
def load_inception_v3(weight_path: str):
"""
指定パスからパラメータ重みを読込、InceptionV3をfine-tuningしたモデルをloadする。
"""
...
model.load_weights(weight_path)
return model
参考記事
qiita.com
qiita.com
docs.streamlit.io
aidiary.hatenablog.com