这篇文章给大家分享的是有关Keras多线程机制与flask多线程冲突怎么办的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在使用flask部署Keras,Tensorflow等框架时候,经常出现FailedPrec
这篇文章给大家分享的是有关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结合的几个常见错误
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 tfgraph = tf.get_default_graph()model = models.load_model(…………)# 使用处添加:global graphglobal modelwith 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 modelresult = model.predict(tokens_pad)
但是在使用后又遇到了 The Session graph is empty…… 的错误即第二点,不过估摸着这个是个例,应该是程序问题。
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()方法的方法的代码放到这里
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_sessionset_session(sess)model = models.load_model(…………)# 每次使用有关TensorFlow的请求时# in each request (i.e. in each thread):global sessglobal graphwith graph.as_default(): set_session(sess) model.predict(...)————————————————
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多线程冲突怎么办”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
--结束END--
本文标题: Keras多线程机制与flask多线程冲突怎么办
本文链接: https://lsjlt.com/news/278483.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0