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 selenium 父子、兄弟、相邻节点定位方式详解
Sep 15 Python
使用Python的Scrapy框架十分钟爬取美女图
Dec 26 Python
Python编程scoketServer实现多线程同步实例代码
Jan 29 Python
Python爬虫常用小技巧之设置代理IP
Sep 13 Python
浅谈pandas筛选出表中满足另一个表所有条件的数据方法
Feb 08 Python
numpy linalg模块的具体使用方法
May 26 Python
Python Django 页面上展示固定的页码数实现代码
Aug 21 Python
python实现图片二值化及灰度处理方式
Dec 07 Python
Jupyter Notebook 文件默认目录的查看以及更改步骤
Apr 14 Python
基于Tensorflow一维卷积用法详解
May 22 Python
PyCharm Community安装与配置的详细教程
Nov 24 Python
如何用python反转图片,视频
Apr 24 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
PHP 第一节 php简介
2012/04/28 PHP
PDO版本问题 Invalid parameter number: no parameters were bound
2013/01/06 PHP
ueditor 1.2.6 使用方法说明
2013/07/24 PHP
PHP实现支持GET,POST,Multipart/form-data的HTTP请求类
2014/09/24 PHP
Yii使用DeleteAll连表删除出现报错问题的解决方法
2016/07/14 PHP
jQuery AJAX回调函数this指向问题
2010/02/08 Javascript
jquery下checked取值问题的解决方法
2012/08/09 Javascript
javascript 实现简单的table排序及table操作练习
2012/12/28 Javascript
JavaScript的ExtJS框架中数面板TreePanel的使用实例解析
2016/05/21 Javascript
针对BootStrap中tabs控件的美化和完善(推荐)
2016/07/06 Javascript
AngularJS ui-router刷新子页面路由的方法
2018/07/23 Javascript
JavaScript实现的开关灯泡点击切换特效示例
2019/07/08 Javascript
Vue基本指令实例图文讲解
2021/02/25 Vue.js
python实现查询苹果手机维修进度
2015/03/16 Python
简单掌握Python的Collections模块中counter结构的用法
2016/07/07 Python
利用Python如何生成便签图片详解
2018/07/09 Python
Python插入Elasticsearch操作方法解析
2020/01/19 Python
哪种Python框架适合你?简单介绍几种主流Python框架
2020/08/04 Python
python 模拟登录B站的示例代码
2020/12/15 Python
CSS3 linear-gradient线性渐变生成加号和减号的方法
2017/11/21 HTML / CSS
HTML5中5个简单实用的API(第二篇,含全屏、可见性、拍照、预加载、电池状态)
2014/05/07 HTML / CSS
Dodax奥地利:音乐、电影、书籍、玩具、电子产品等
2019/08/31 全球购物
机械专业毕业生推荐信范文
2013/11/25 职场文书
省优秀教师事迹材料
2014/01/30 职场文书
外贸专业求职信
2014/03/09 职场文书
社团活动总结怎么写
2014/06/30 职场文书
2014入党积极分子破除“四风”思想汇报
2014/09/14 职场文书
家庭财产分割协议范文
2014/11/24 职场文书
英文邀请函
2015/02/02 职场文书
社区活动总结
2015/02/04 职场文书
水电工程师岗位职责
2015/02/13 职场文书
整改通知书格式
2015/04/22 职场文书
圣诞晚会主持词开场白
2015/05/28 职场文书
2016三八妇女节慰问信
2015/11/30 职场文书
2016继续教育培训学习心得体会
2016/01/19 职场文书
使用qt quick-ListView仿微信好友列表和聊天列表的示例代码
2021/06/13 Python