題名の通り。 streamlitとkerasで遊んだ。
動画デモ:
アップしたクリクリ画像を機械学習モデルで分類するのをstreamlitで作ったりして遊びました pic.twitter.com/77TJ7O9SXx
— いりす (@irisuinwl) 2020年8月25日
環境情報
- 機械学習モデル作成環境:
google colaboratory
- web app環境:
windows 10+anaconda
InceptionV3をファインチューニングする
下記google colabにて実施。
streamlitでwebアプリを作る
下記githubにコードを格納
- WIP: deployしたり、精度あげたり
詰まったところ:
anacondaでconda install tensorflow-gpu keras
すると、tf 2.1.0
がインストールされるが、windows環境ではAttributeError: ‘_thread._local’ object has no attribute 'value’
というエラーが出る。
実際、下記のissueでも議論されている。
ググると、「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