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 相关文章推荐
详解Python3中yield生成器的用法
Aug 20 Python
使用Python编写爬虫的基本模块及框架使用指南
Jan 20 Python
Python实现以时间换空间的缓存替换算法
Feb 19 Python
Python2.x利用commands模块执行Linux shell命令
Mar 11 Python
python SVD压缩图像的实现代码
Nov 05 Python
详解Python list和numpy array的存储和读取方法
Nov 06 Python
Python pandas自定义函数的使用方法示例
Nov 20 Python
基于Tensorflow:CPU性能分析
Feb 10 Python
在pycharm中为项目导入anacodna环境的操作方法
Feb 12 Python
查看keras各种网络结构各层的名字方式
Jun 11 Python
python使用smtplib模块发送邮件
Dec 17 Python
Python数据可视化之Seaborn的安装及使用
Apr 19 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
linux系统上支持php的 iconv()函数的方法
2011/10/01 PHP
PHP异常处理浅析
2015/05/12 PHP
常用的php图片处理类(水印、等比缩放、固定高宽)分享
2015/06/19 PHP
利用PHP如何实现Socket服务器
2015/09/23 PHP
PHP入门教程之数学运算技巧总结
2016/09/11 PHP
详解php几行代码实现CSV格式文件输出
2017/07/01 PHP
jquery选择器(常用选择器说明)
2010/09/28 Javascript
JQuery 选择器、过滤器介绍
2011/02/14 Javascript
深入理解JavaScript高级之词法作用域和作用域链
2013/12/10 Javascript
jQuery防止click双击多次提交及传递动态函数或多参数
2014/04/02 Javascript
原生JavaScript生成GUID的实现示例
2014/09/05 Javascript
JavaScript获取鼠标移动时的坐标(兼容IE8、chome谷歌、Firefox)
2014/09/13 Javascript
js读取json的两种常用方法示例介绍
2014/10/19 Javascript
不得不分享的JavaScript常用方法函数集(上)
2015/12/23 Javascript
vue2.0 中#$emit,$on的使用详解
2017/06/07 Javascript
Vue实现数字输入框中分割手机号码的示例
2017/10/10 Javascript
vue监听dom大小改变案例
2020/07/29 Javascript
[05:46]DOTA2英雄梦之声_第18期_陈
2014/06/20 DOTA
Python中非常实用的一些功能和函数分享
2015/02/14 Python
Python中用于转换字母为小写的lower()方法使用简介
2015/05/19 Python
django缓存配置的几种方法详解
2018/07/16 Python
pyinstaller打包单个exe后无法执行错误的解决方法
2019/06/21 Python
python使用opencv对图像mask处理的方法
2019/07/05 Python
python对绑定事件的鼠标、按键的判断实例
2019/07/17 Python
Python简单实现区域生长方式
2020/01/16 Python
tensorboard显示空白的解决
2020/02/15 Python
找Python安装目录,设置环境路径以及在命令行运行python脚本实例
2020/03/09 Python
CSS3教程(3):border-color网页边框色彩
2009/04/02 HTML / CSS
JSF的标签库有哪些
2012/04/27 面试题
市场营销专业毕业生自荐信
2013/11/02 职场文书
应聘美工求职信
2013/11/07 职场文书
生育关怀行动实施方案
2014/03/26 职场文书
装饰技术负责人岗位职责
2015/04/13 职场文书
2015年招生工作总结
2015/05/04 职场文书
收入证明申请书
2015/06/12 职场文书
一道JS算法面试题——冒泡、选择排序
2021/04/21 Javascript