您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關Keras多線程機制與flask多線程沖突怎么辦的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
在使用flask部署Keras,tensorflow等框架時候,經常出現
FailedPreconditionError: Attempting to use uninitialized value batchnormalization_
或者
Tensor Tensor("crf_1/cond/Merge:0", shape=(?, ?, 260), dtype=float32) is not an element of this graph.
使用keras.backend.clear_session()可能會導致前后兩處預測結果不一樣,因為圖發生了變化。以下是解決方案。
graph = tf.get_default_graph() sess = tf.Session(graph=graph) def modelpredict(content): #keras.backend.clear_session() global graph global sess with sess.as_default(): with graph.as_default(): keras.model.predict()
補充:Flask與keras結合的幾個常見錯誤
1、 ValueError: Tensor Tensor(“dense_1/Sigmoid:0”, shape=(?, 1), dtype=float32) is not an element of this graph.
在Flask中使用tensorflow的model,一在界面中調用 model.predict() 就報下面這個錯誤,不過在單獨的 .py 文件中使用卻不報錯。
ValueError: Tensor Tensor("dense_1/Sigmoid:0", shape=(?, 1), dtype=float32) is not an element of this graph.
添加如下代碼可以解決:
import tensorflow as tf graph = tf.get_default_graph() model = models.load_model(…………) # 使用處添加: global graph global model with graph.as_default(): model.predict() # 執行預測函數
但是我當時測試時又報了另一個bug,但是這個bug也不好解決,試了很多方法也沒解決,當然最終還是可以解決的,具體解決方式參考第三點。
tensorflow.python.framework.errors_impl.FailedPreconditionError: Error while reading resource variable dense_1/bias from Container: localhost. This could mean that the variable was uninitialized. Not found: Resource localhost/dense_1/bias/class tensorflow::Var does not exist.
[[{{node dense_1/BiasAdd/ReadVariableOp}}]]
后來經過N遍測試后找到了以下兩種解決方式,僅供參考:
方法一:
在調用前加載model和graph,但是這樣會導致程序每次調用都需要重新加載model,然后運行速度就會很慢,不過這種修改方式是最簡單的。
graph = tf.get_default_graph() model = models.load_model('./static/my_model2.h6') with graph.as_default(): result = model.predict(tokens_pad)
方法二:
在創建model后,先使用一遍 model.predict(),參數的大小和真實大小一致,這個是真正解決之道,同時不影響使用速率。
# 使用前: model = models.load_model('./static/my_model2.h6') # a 矩陣大小和 tokens_pad 一致 a = np.ones((1, 220)) model.predict(a) # 使用時: global model result = model.predict(tokens_pad)
但是在使用后又遇到了 The Session graph is empty…… 的錯誤即第二點,不過估摸著這個是個例,應該是程序問題。
2、RuntimeError: The Session graph is empty. Add operations to the graph before calling run().
graph = tf.get_default_graph() with graph.as_default(): # 相關代碼 # 本次測試中是需要把調用包含model.predict()方法的方法的代碼放到這里
3、tensorflow.python.framework.errors_impl.FailedPreconditionError: Error while reading resource variable dense_1/bias from Container: localhost. This could mean that the variable was uninitialized. Not found: Resource localhost/dense_1/bias/class tensorflow::Var does not exist.[[{{node dense_1/BiasAdd/ReadVariableOp}}]]
這個錯誤呢,也是TensorFlow和Flask結合使用時的常見錯誤,解決方式如下:
from tensorflow.python.keras.backend import set_session # 程序開始時聲明 sess = tf.Session() graph = tf.get_default_graph() # 在model加載前添加set_session set_session(sess) model = models.load_model(…………) # 每次使用有關TensorFlow的請求時 # in each request (i.e. in each thread): global sess global graph with graph.as_default(): set_session(sess) model.predict(...) ————————————————
4、 Can't find libdevice directory ${CUDA_DIR}/nvvm/libdevice. This may result in compilation or runtime failures, if the program we try to run uses routines from libdevice
設置一下XLA_FLAGS指向你的cuda安裝目錄即可
os.environ["XLA_FLAGS"]="--xla_gpu_cuda_data_dir=/usr/local/cuda-10.0"
感謝各位的閱讀!關于“Keras多線程機制與flask多線程沖突怎么辦”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。