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中文件操作简明介绍
Apr 13 Python
详解python 发送邮件实例代码
Dec 22 Python
fastcgi文件读取漏洞之python扫描脚本
Apr 23 Python
浅谈Python中带_的变量或函数命名
Dec 04 Python
python简单实现操作Mysql数据库
Jan 29 Python
对Python发送带header的http请求方法详解
Jan 02 Python
python实现全盘扫描搜索功能的方法
Feb 14 Python
Python实现某论坛自动签到功能
Aug 20 Python
logging level级别介绍
Feb 21 Python
Python request使用方法及问题总结
Apr 26 Python
python进度条显示-tqmd模块的实现示例
Aug 23 Python
Pycharm的Available Packages为空的解决方法
Sep 18 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+MySQL 手工注入语句大全 推荐
2009/10/30 PHP
解析PHP多种序列化与反序列化的方法
2013/06/06 PHP
php代码书写习惯优化小结
2013/06/20 PHP
thinkphp3.2.2实现生成多张缩略图的方法
2014/12/19 PHP
PHP之浮点数计算比较以及取整数不准确的解决办法
2015/07/29 PHP
调用WordPress函数统计文章访问量及PHP原生计数器的实现
2016/03/21 PHP
PHP封装的MSSql操作类完整实例
2016/05/26 PHP
详解PHP防止直接访问.php 文件的实现方法
2017/07/28 PHP
Js 中debug方式
2010/02/07 Javascript
在js中判断checkboxlist(.net控件客户端id)是否有选中
2013/04/11 Javascript
使用JavaScript的ActiveXObject对象检测应用程序是否安装的方法
2014/04/15 Javascript
深入浅析JavaScript的API设计原则
2016/06/14 Javascript
正则表达式,替换所有HTML标签的简单实例
2016/11/28 Javascript
详解Angular的双向数据绑定(MV-VM)
2016/12/26 Javascript
Vue开发过程中遇到的疑惑知识点总结
2017/01/20 Javascript
Jquery实现获取子元素的方法分析
2019/08/24 jQuery
JS+CSS实现随机点名(实例代码)
2019/11/04 Javascript
解决vue addRoutes不生效问题
2020/08/04 Javascript
[06:16]第十四期-国士无双绝地翻盘之撼地神牛
2014/06/24 DOTA
[00:36]我的中国心——Serenity vs Fnatic
2018/08/21 DOTA
使用Python压缩和解压缩zip文件的教程
2015/05/06 Python
pygame游戏之旅 如何制作游戏障碍
2018/11/20 Python
Python小游戏之300行代码实现俄罗斯方块
2019/01/04 Python
numpy矩阵数值太多不能全部显示的解决
2020/05/14 Python
利用keras使用神经网络预测销量操作
2020/07/07 Python
Python threading模块condition原理及运行流程详解
2020/10/05 Python
详解Python流程控制语句
2020/10/28 Python
泰国排名第一的家居用品中心:HomePro
2020/11/18 全球购物
资深地理教师自我评价
2013/09/21 职场文书
学院领导推荐信
2013/10/30 职场文书
银行演讲稿范文
2014/01/03 职场文书
党风廉政建设责任书
2014/04/14 职场文书
营销策划分析:怎么策划才能更好销量产品?
2019/09/04 职场文书
PyTorch 如何自动计算梯度
2021/05/23 Python
python 爬取京东指定商品评论并进行情感分析
2021/05/27 Python
动画《朋友游戏》公开佐藤友生绘制的开播纪念绘
2022/04/06 日漫