Keras多线程机制与flask多线程冲突的解决方案


Posted in Python onMay 28, 2021

在使用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.h5')
    with graph.as_default():
        result = model.predict(tokens_pad)

方法二:

在创建model后,先使用一遍 model.predict(),参数的大小和真实大小一致,这个是真正解决之道,同时不影响使用速率。

# 使用前:
model = models.load_model('./static/my_model2.h5')
# 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"

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python编写检测数据库SA用户的方法
Jul 11 Python
Python enumerate索引迭代代码解析
Jan 19 Python
对python中的xlsxwriter库简单分析
May 04 Python
python3 判断列表是一个空列表的方法
May 04 Python
Python面向对象基础入门之设置对象属性
Dec 11 Python
Pandas之ReIndex重新索引的实现
Jun 25 Python
Python中栈、队列与优先级队列的实现方法
Jun 30 Python
python3 下载网络图片代码实例
Aug 27 Python
Python Tensor FLow简单使用方法实例详解
Jan 14 Python
tensorflow实现残差网络方式(mnist数据集)
May 26 Python
Python应用实现处理excel数据过程解析
Jun 19 Python
python 用pandas实现数据透视表功能
Dec 21 Python
pytorch 6 batch_train 批训练操作
May 28 #Python
pytorch 如何使用batch训练lstm网络
May 28 #Python
使用Pytorch训练two-head网络的操作
May 28 #Python
使用Python的开发框架Brownie部署以太坊智能合约
使用Pytorch实现two-head(多输出)模型的操作
8g内存用python读取10文件_面试题-python 如何读取一个大于 10G 的txt文件?
用python画城市轮播地图
You might like
Laravel 4 初级教程之视图、命名空间、路由
2014/10/30 PHP
php实现获取文件mime类型的方法
2015/02/11 PHP
下载网站打开页面后间隔多少时间才显示下载链接地址的代码
2010/04/25 Javascript
silverlight线程与基于事件驱动javascript引擎(实现轨迹回放功能)
2011/08/09 Javascript
jquery时间下拉框小例子
2013/04/15 Javascript
javascript history对象(历史记录)使用方法(实现浏览器前进后退)
2014/01/07 Javascript
javascript格式化指定日期对象的方法
2015/04/21 Javascript
JavaScript中Number.NEGATIVE_INFINITY值的使用详解
2015/06/05 Javascript
JavaScript编程中window的location与history对象详解
2015/10/26 Javascript
基于Jquery插件Uploadify实现实时显示进度条上传图片
2020/03/26 Javascript
详解Jquery Easyui的验证扩展
2017/01/09 Javascript
vue2.0实现分页组件的实例代码
2017/06/22 Javascript
angular内置provider之$compileProvider详解
2017/09/27 Javascript
深入理解 webpack 文件打包机制(小结)
2018/01/08 Javascript
vue.js element-ui tree树形控件改iview的方法
2018/03/29 Javascript
JS实现判断图片是否加载完成的方法分析
2018/07/31 Javascript
webpack4 处理CSS的方法示例
2018/09/03 Javascript
Vue中跨域及打包部署到nginx跨域设置方法
2019/08/26 Javascript
Vue使用Three.js加载glTF模型的方法详解
2020/06/14 Javascript
[41:08]TNC vs VG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python 通过URL打开图片实例详解
2017/06/01 Python
对Python 两大环境管理神器 pyenv 和 virtualenv详解
2018/12/31 Python
Python利用WMI实现ping命令的例子
2019/08/14 Python
Python3 获取文件属性的方式(时间、大小等)
2020/03/12 Python
Python绘制全球疫情变化地图的实例代码
2020/04/20 Python
python爬虫beautifulsoup解析html方法
2020/12/07 Python
城市规划毕业生求职信
2013/10/10 职场文书
物流管理应届生求职信
2013/11/07 职场文书
爱情寄语大全
2014/04/09 职场文书
党员四风剖析材料
2014/08/27 职场文书
校运动会广播稿(100篇)
2014/09/12 职场文书
2014年社区党建工作汇报材料
2014/11/02 职场文书
个人先进事迹材料范文
2014/12/29 职场文书
综合测评自我评价
2015/03/06 职场文书
六年级作文之家庭作文
2019/12/12 职场文书
xhunter1.sys可以删除嘛? win11提示xhunter1.sys驱动不兼容解决办法
2022/09/23 数码科技