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之集合的关系
Sep 24 Python
Python中转换角度为弧度的radians()方法
May 18 Python
python结合opencv实现人脸检测与跟踪
Jun 08 Python
Python多线程爬虫实战_爬取糗事百科段子的实例
Dec 15 Python
selenium跳过webdriver检测并模拟登录淘宝
Jun 12 Python
python创建与遍历List二维列表的方法
Aug 16 Python
Pytorch中的variable, tensor与numpy相互转化的方法
Oct 10 Python
使用Python求解带约束的最优化问题详解
Feb 11 Python
python实现TCP文件传输
Mar 20 Python
PyQt5事件处理之定时在控件上显示信息的代码
Mar 25 Python
matplotlib之pyplot模块之标题(title()和suptitle())
Feb 22 Python
Python实现对齐打印 format函数的用法
Apr 28 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操作mongoDB实例分析
2014/12/29 PHP
php+mysql实现简单的增删改查功能
2015/07/13 PHP
浅析PHP7新功能及语法变化总结
2016/06/17 PHP
Yii2框架RESTful API 格式化响应,授权认证和速率限制三部分详解
2016/11/10 PHP
PHP PDOStatement::fetchColumn讲解
2019/01/31 PHP
JavaScript判断变量是否为undefined的两种写法区别
2013/12/04 Javascript
Jqgrid表格随窗口大小改变而改变的简单实例
2013/12/28 Javascript
对于Form表单reset方法的新认识
2014/03/05 Javascript
在Node.js中使用HTTP上传文件的方法
2015/06/23 Javascript
JS实现下拉菜单赋值到文本框的方法
2015/08/18 Javascript
jQuery实现点击小图片淡入淡出显示大图片特效
2015/09/09 Javascript
第四章之BootStrap表单与图片
2016/04/25 Javascript
jQuery实现动态删除LI的方法
2017/05/30 jQuery
jQuery制作全屏宽度固定高度轮播图(实例讲解)
2017/07/08 jQuery
React操作真实DOM实现动态吸底部的示例
2017/10/23 Javascript
JS实现图片转换成base64的各种应用场景实例分析
2018/06/22 Javascript
JS 中可以提升幸福度的小技巧(可以识别更多另类写法)
2018/07/28 Javascript
微信小程序用户位置权限的获取方法(拒绝后提醒)
2018/11/15 Javascript
js之切换全屏和退出全屏实现代码实例
2019/09/09 Javascript
小程序自定义导航栏兼容适配所有机型(附完整案例)
2020/04/26 Javascript
基于Vue+Webpack拆分路由文件实现管理
2020/11/16 Javascript
[07:20]2014DOTA2西雅图国际邀请赛 选手讲解积分赛第二天
2014/07/11 DOTA
[04:51]TI10典藏宝瓶Ⅱ外观视频展示
2020/08/15 DOTA
Python生成随机密码
2015/03/10 Python
Python编程使用*解包和itertools.product()求笛卡尔积的方法
2017/12/18 Python
python统计字母、空格、数字等字符个数的实例
2018/06/29 Python
详解Python在使用JSON时需要注意的编码问题
2019/12/06 Python
TensorFlow实现保存训练模型为pd文件并恢复
2020/02/06 Python
详解Pymongo常用查询方法总结
2021/01/29 Python
党校自我鉴定范文
2013/10/02 职场文书
幼儿园教研活动方案
2014/01/19 职场文书
大学活动邀请函
2014/01/28 职场文书
人力资源管理毕业求职信
2014/08/05 职场文书
上班时间打瞌睡检讨书
2014/09/26 职场文书
世界气象日活动总结
2015/02/27 职场文书
采购员岗位职责范本
2015/04/07 职场文书