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画ROC曲线和AUC值计算
Sep 19 Python
老生常谈Python之装饰器、迭代器和生成器
Jul 26 Python
win10下python3.5.2和tensorflow安装环境搭建教程
Sep 19 Python
Python使用import导入本地脚本及导入模块的技巧总结
Aug 07 Python
Python 使用 docopt 解析json参数文件过程讲解
Aug 13 Python
自适应线性神经网络Adaline的python实现详解
Sep 30 Python
python实现用类读取文件数据并计算矩形面积
Jan 18 Python
Python识别html主要文本框过程解析
Feb 18 Python
Python实现自动访问网页的例子
Feb 21 Python
Python GUI编程学习笔记之tkinter中messagebox、filedialog控件用法详解
Mar 30 Python
python使用建议与技巧分享(二)
Aug 17 Python
详解Python3 定义一个跨越多行的字符串的多种方法
Sep 06 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
DedeCMS 核心类TypeLink.class.php摘要笔记
2010/04/07 PHP
PHP 函数学习简单小结
2010/07/08 PHP
一些PHP Coding Tips(php小技巧)[2011/04/02最后更新]
2011/05/02 PHP
PHP获取客户端及服务器端IP的封装类
2016/07/21 PHP
Zend Framework实现自定义过滤器的方法
2016/12/09 PHP
Ecshop 后台添加新功能栏目及管理权限设置教程
2017/11/21 PHP
thinkphp5引入公共部分header、footer的方法详解
2018/09/14 PHP
浅谈php使用curl模拟多线程发送请求
2019/03/08 PHP
php实现的顺序线性表示例
2019/05/04 PHP
Javascript中产生固定结果的函数优化技巧
2013/01/16 Javascript
JQuery中使文本框获得焦点的方法实例分析
2015/02/28 Javascript
理解JavaScript的变量的入门教程
2015/07/07 Javascript
JS实现分页浏览横向图片(类轮播)实例代码
2017/11/06 Javascript
layui弹出层按钮提交iframe表单的方法
2018/08/20 Javascript
vue 导航内容设置选中状态样式的例子
2019/11/01 Javascript
如何基于layui的laytpl实现数据绑定的示例代码
2020/04/10 Javascript
JS变量提升原理与用法实例浅析
2020/05/22 Javascript
JS删除数组指定值常用方法详解
2020/06/04 Javascript
使用Webpack 搭建 Vue3 开发环境过程详解
2020/07/28 Javascript
解决ant Design中this.props.form.validateFields未执行的问题
2020/10/27 Javascript
[01:06:43]完美世界DOTA2联赛PWL S3 PXG vs GXR 第二场 12.19
2020/12/24 DOTA
使用Python脚本来获取Cisco设备信息的示例
2015/05/04 Python
对Python3.x版本print函数左右对齐详解
2018/12/22 Python
扩展Django admin的list_filter()可使用范围方法
2019/08/21 Python
Python爬取微信小程序Charles实现过程图解
2020/09/29 Python
Python列表嵌套常见坑点及解决方案
2020/09/30 Python
伯利陶器:Burleigh Pottery
2018/01/03 全球购物
在DELPHI中调用存储过程和使用内嵌SQL哪种方式更好
2016/11/22 面试题
工程造价专业大学生自荐信
2013/10/01 职场文书
《孙权劝学》教学反思
2014/04/23 职场文书
药剂专业自荐书
2014/06/20 职场文书
元旦晚会活动总结
2014/07/09 职场文书
领导班子个人对照检查剖析材料
2014/09/29 职场文书
2015年财务部工作总结
2015/04/10 职场文书
转学证明范本
2015/06/19 职场文书
创业计划书之面包店
2019/09/12 职场文书