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中非常实用的一些功能和函数分享
Feb 14 Python
python通过ssh-powershell监控windows的方法
Jun 02 Python
Python中防止sql注入的方法详解
Feb 25 Python
python snownlp情感分析简易demo(分享)
Jun 04 Python
python验证码识别实例代码
Feb 03 Python
python3监控CentOS磁盘空间脚本
Jun 21 Python
Windows下python3.7安装教程
Jul 31 Python
画pytorch模型图,以及参数计算的方法
Aug 17 Python
Python对象的属性访问过程详解
Mar 05 Python
如何在Python 游戏中模拟引力
Mar 27 Python
python 装饰器重要在哪
Feb 14 Python
python实现高效的遗传算法
Apr 07 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
第九节 绑定 [9]
2006/10/09 PHP
SSI指令
2006/11/25 PHP
php number_format() 函数通过千位分组来格式化数字的实现代码
2013/08/06 PHP
php统计数组元素个数的方法
2015/07/02 PHP
ThinkPHP路由机制简介
2016/03/23 PHP
php字符串操作常见问题小结
2016/10/11 PHP
PHP4和PHP5版本下解析XML文档的操作方法实例分析
2017/05/20 PHP
Windows 下安装 swoole 图文教程(php)
2017/06/05 PHP
php实现将二维关联数组转换成字符串的方法详解
2017/07/31 PHP
js 第二代身份证号码的验证机制代码
2011/05/12 Javascript
JSONP 跨域共享信息
2012/08/16 Javascript
javascript:;与javascript:void(0)使用介绍
2013/06/05 Javascript
JS中获取函数调用链所有参数的方法
2015/05/07 Javascript
jquery select2的使用心得(推荐)
2016/12/04 Javascript
JavaScript字符串_动力节点Java学院整理
2017/06/27 Javascript
jQuery制作全屏宽度固定高度轮播图(实例讲解)
2017/07/08 jQuery
初识 Vue.js 中的 *.Vue文件
2017/11/22 Javascript
Vue使用Canvas绘制图片、矩形、线条、文字,下载图片
2019/04/26 Javascript
解决vue自定义指令导致的内存泄漏问题
2020/08/04 Javascript
原生JS运动实现轮播图
2021/01/02 Javascript
Python自定义函数定义,参数,调用代码解析
2017/12/27 Python
python 阶乘累加和的实例
2019/02/01 Python
详解Django-restframework 之频率源码分析
2019/02/27 Python
python 抓取知乎指定回答下视频的方法
2020/07/09 Python
日本运动品牌美津浓官方购物网站:MIZUNO SHOP
2016/08/21 全球购物
英语系本科生个人求职信
2013/09/21 职场文书
工程预算与管理应届生求职信
2013/10/06 职场文书
厂长助理岗位职责
2013/12/27 职场文书
海南地接欢迎词
2014/01/14 职场文书
女方回门宴答谢词
2014/01/14 职场文书
思想品德自我评价
2014/02/04 职场文书
超市重阳节活动方案
2014/02/10 职场文书
优秀公益广告词大全
2014/03/19 职场文书
出国留学计划书
2014/04/27 职场文书
企业安全生产目标责任书
2014/07/23 职场文书
计划生育证明格式及范本
2014/10/09 职场文书