質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

解決済

1回答

13753閲覧

Keras+Tensorflowで作ったモデルを別Threadでは読み込めない?

ShikaTech

総合スコア468

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

1グッド

0クリップ

投稿2018/03/13 13:05

編集2018/03/13 13:28

Azure WebApps にデプロイしたPython機械学習プログラムがタイムアウトする からの派生です。
経緯は上記URLをご参照いただきたいのですが、

  • Python+Flaskで作ったAPIの起動に時間がかかっていたためAzureのWebAppsで実行開始できなかった
  • 時間がかかっていたのはTensorflowの起動&多数のモデルを起動時にloadしていたため
  • アドバイスの通りモデルのLoadを別スレッド化したことでAPIの起動をスムーズにすることに成功

…したんですが、今度はその読み込んだモデルが使用できない事象に見舞われてしまっています。
なにやらtensorflowのセッションが開始されていない旨のエラーが?

Using TensorFlow backend. Exception in thread Thread-1: Traceback (most recent call last): File "C:\ProgramData\Miniconda3\envs\mykeras\lib\site-packages\tensorflow\python\client\session.py", line 942, in _run allow_operation=False) File "C:\ProgramData\Miniconda3\envs\mykeras\lib\site-packages\tensorflow\python\framework\ops.py", line 2584, in as_graph_element return self._as_graph_element_locked(obj, allow_tensor, allow_operation) File "C:\ProgramData\Miniconda3\envs\mykeras\lib\site-packages\tensorflow\python\framework\ops.py", line 2663, in _as_graph_element_locked raise ValueError("Tensor %s is not an element of this graph." % obj) ValueError: Tensor Tensor("Placeholder:0", shape=(3, 3, 3, 32), dtype=float32) is not an element of this graph. During handling of the above exception, another exception occurred: Traceback (most recent call last): File "C:\ProgramData\Miniconda3\envs\mykeras\lib\threading.py", line 916, in _bootstrap_inner self.run() File "C:\ProgramData\Miniconda3\envs\mykeras\lib\threading.py", line 864, in run self._target(*self._args, **self._kwargs) File "c:\Users\shikatech\main.py", line 113, in model_loader models[key] = load_model("./models/"+ key + ".hdf5") File "C:\ProgramData\Miniconda3\envs\mykeras\lib\site-packages\keras\models.py", line 246, in load_model topology.load_weights_from_hdf5_group(f['model_weights'], model.layers) File "C:\ProgramData\Miniconda3\envs\mykeras\lib\site-packages\keras\engine\topology.py", line 3189, in load_weights_from_hdf5_group K.batch_set_value(weight_value_tuples) File "C:\ProgramData\Miniconda3\envs\mykeras\lib\site-packages\keras\backend\tensorflow_backend.py", line 2370, in batch_set_value get_session().run(assign_ops, feed_dict=feed_dict) File "C:\ProgramData\Miniconda3\envs\mykeras\lib\site-packages\tensorflow\python\client\session.py", line 789, in run run_metadata_ptr) File "C:\ProgramData\Miniconda3\envs\mykeras\lib\site-packages\tensorflow\python\client\session.py", line 945, in _run + e.args[0]) TypeError: Cannot interpret feed_dict key as Tensor: Tensor Tensor("Placeholder:0", shape=(3, 3, 3, 32), dtype=float32) is not an element of this graph. * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

探してみるとこんな記事を見つけたわけですが、結局何が悪くてどうすればいいかが検討もつかず…

Python

1import base64 2import io 3import json 4from datetime import datetime 5from platform import python_version 6 7import keras 8import numpy as np 9from flask import Flask, jsonify, make_response, request 10from keras import metrics 11from keras.layers import Conv2D, Dense, Dropout, Flatten, MaxPooling2D 12from keras.models import Sequential, load_model 13from keras.preprocessing.image import array_to_img, img_to_array, load_img 14from keras.utils import np_utils 15from PIL import Image 16 17from collections import defaultdict 18from threading import Thread 19 20app = Flask(__name__) 21app.config['JSON_AS_ASCII'] = False 22 23model = load_model("./models/model1.hdf5") 24models = defaultdict(lambda: '') 25statuses = defaultdict(lambda: 'Still loading') 26keys = ("model1","model2") 27 28@app.route('/status') 29def status_check(): 30 return '\n<br />'.join(key + ' -> ' + statuses[key] for key in keys) + '\n<br />' 31 32@app.route('/api/judge', methods=['GET', 'POST']) 33def judge(): 34 try: 35 for key in keys: 36 if statuses[key] == "Still loading": 37 return make_response(jsonify({"status": "failure", "message": "The api server is in preparation."}), 503) 38 39 if request.method == "POST": 40 content_type = request.headers["Content-Type"] 41 if content_type == None or \ 42 not content_type.startswith("application/json") or \ 43 "img" not in request.json or \ 44 "clock" not in request.json: 45 return make_response(jsonify({'status': 'failure'}), 405) 46 47 base64str = request.json["img"] 48 # POSTで渡ってきたbase64文字列は「+」が「 」(スペース)に変換されてしまっているため、元に戻してやってからDecode。 49 dec_image = base64.b64decode(base64str.replace(" ", "+")) 50 img = Image.open(io.BytesIO(dec_image)) 51 img = img.convert("RGB") # カラーモードの変更 52 img = img.resize((100, 100)) # 画像サイズの変更 53 data = np.asarray(img) 54 data = data.astype("float") / 255 55 56 img = data 57 58 pred1 = models["model1"].predict(np.array([img])) 59 pred2 = models["model2"].predict(np.array([img])) 60 61 return make_response(jsonify({"status": "OK"}), 200) 62 else: 63 return make_response(jsonify({'status': 'failure'}), 405) 64 except: 65 import traceback 66 traceback.print_exc() 67 return make_response(jsonify({"status": "failure", "message": "Internal server error"}), 500) 68 69def model_loader(): 70 for key in keys: 71 models[key] = load_model("./models/"+ key + ".hdf5") 72 statuses[key] = 'Ready' 73 74Thread(target=model_loader, daemon=True).start() 75if __name__ == '__main__': 76 app.run()

どなたか思い当たるフシはありませんでしょうか?

追記(解決)

コメントで頂いた内容を踏まえ、次のコードでちゃんと動くようになりました。

Python

1import tensorflow as tf 2 3graph = tf.get_default_graph() 4 5~中略~ 6 7def model_loader(): 8 global graph 9 with graph.as_default(): 10 for key in keys: 11 models[key] = load_model("./models/"+ key + ".hdf5") 12 statuses[key] = 'Ready' 13
退会済みユーザー👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

https://github.com/keras-team/keras/issues/5896

Kerasはスレッドセーフでないからです。(バグ)
Graphを別に用意してください。

https://gist.github.com/eyesonlyhack/2f0b20f1e73aaf5e9b83f49415f3601a

投稿2018/03/13 13:16

mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問