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中super的用法实例
May 28 Python
Python利用operator模块实现对象的多级排序详解
May 09 Python
scrapy爬虫实例分享
Dec 28 Python
基于python实现学生管理系统
Oct 17 Python
对python插入数据库和生成插入sql的示例讲解
Nov 14 Python
Python如何获得百度统计API的数据并发送邮件示例代码
Jan 27 Python
pandas去重复行并分类汇总的实现方法
Jan 29 Python
如何使用Python实现自动化水军评论
Jun 26 Python
python如何给字典的键对应的值为字典项的字典赋值
Jul 05 Python
升级keras解决load_weights()中的未定义skip_mismatch关键字问题
Jun 12 Python
Sublime Text3最新激活注册码分享适用2020最新版 亲测可用
Nov 12 Python
python opencv实现直线检测并测出倾斜角度(附源码+注释)
Dec 31 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
PHPWind 发帖回帖Api PHP版打包下载
2010/02/08 PHP
PHP三层结构(上) 简单三层结构
2010/07/04 PHP
smarty中post用法实例
2014/11/28 PHP
php找出指定范围内回文数且平方根也是回文数的方法
2015/03/23 PHP
PHP7新特性之抽象语法树(AST)带来的变化详解
2018/07/17 PHP
PHP设计模式之模板方法模式实例浅析
2018/12/20 PHP
JavaScript 输入框内容格式验证代码
2010/02/11 Javascript
IE6图片加载的一个BUG解决方法
2010/07/13 Javascript
JS分割字符串并放入数组的函数
2011/07/04 Javascript
javascript学习笔记(一) 在html中使用javascript
2012/06/18 Javascript
利用js制作html table分页示例(js实现分页)
2014/04/25 Javascript
AngularJs Understanding the Controller Component
2016/09/02 Javascript
JavaScript中双符号的运算详解
2017/03/12 Javascript
20行JS代码实现网页刮刮乐效果
2017/06/23 Javascript
ES6模块化的import和export用法方法总结
2017/08/08 Javascript
小程序实现多选框功能
2018/10/30 Javascript
使用vue-cli webpack 快速搭建项目的代码
2018/11/21 Javascript
详解Node.js一行命令上传本地文件到服务器
2019/04/22 Javascript
[46:49]完美世界DOTA2联赛PWL S3 access vs Rebirth 第二场 12.19
2020/12/24 DOTA
使用Python判断质数(素数)的简单方法讲解
2016/05/05 Python
Python正则表达式使用范例分享
2016/12/04 Python
浅谈python装饰器探究与参数的领取
2017/12/01 Python
python清除字符串中间空格的实例讲解
2018/05/11 Python
python实现决策树分类
2018/08/30 Python
Python基于Tkinter模块实现的弹球小游戏
2018/12/27 Python
pytorch 模型可视化的例子
2019/08/17 Python
django框架中间件原理与用法详解
2019/12/10 Python
基于HTML5 Canvas:字符串,路径,背景,图片的详解
2013/05/09 HTML / CSS
意大利男装网店:Vrients
2019/05/02 全球购物
俄罗斯在线大型超市:ТутПросто
2021/01/08 全球购物
是否可以从一个static方法内部发出对非static方法的调用?
2014/08/18 面试题
交通专业个人自荐信格式
2013/09/23 职场文书
捐款通知怎么写
2015/04/24 职场文书
超详细教你怎么升级Mysql的版本
2021/05/19 MySQL
mysql中数据库覆盖导入的几种方式总结
2022/03/25 MySQL
Python万能模板案例之matplotlib绘制甘特图
2022/04/13 Python