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中的jquery PyQuery库使用小结
May 13 Python
状态机的概念和在Python下使用状态机的教程
Apr 11 Python
Python利用Beautiful Soup模块修改内容方法示例
Mar 27 Python
python中的闭包函数
Feb 09 Python
python实现linux下抓包并存库功能
Jul 18 Python
Python解析、提取url关键字的实例详解
Dec 17 Python
解决python xx.py文件点击完之后一闪而过的问题
Jun 24 Python
Python 列表去重去除空字符的例子
Jul 20 Python
Python在OpenCV里实现极坐标变换功能
Sep 02 Python
详解Python中Pyyaml模块的使用
Oct 08 Python
Opencv 图片的OCR识别的实战示例
Mar 02 Python
pip/anaconda修改镜像源,加快python模块安装速度的操作
Mar 04 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
echo(),print(),print_r()之间的区别?
2006/11/19 PHP
基于php设计模式中单例模式的应用分析
2013/05/15 PHP
ThinkPHP CURD方法之page方法详解
2014/06/18 PHP
idTabs基于JQuery的根据URL参数选择Tab插件
2012/04/11 Javascript
jquery中one()方法的用法实例
2015/01/16 Javascript
jQuery热气球动画半透明背景的后台登录界面代码分享
2015/08/28 Javascript
jquery ztree实现树的搜索功能
2016/02/25 Javascript
使用jQuery操作HTML的table表格的实例解析
2016/03/13 Javascript
使用jquery提交form表单并自定义action的方法
2016/05/25 Javascript
jQuery基础知识点总结(必看)
2016/05/31 Javascript
jQuery实现图片轮播效果代码(基于jquery.pack.js插件)
2016/06/02 Javascript
基于angularJS的表单验证指令介绍
2016/10/21 Javascript
jQuery实现两个select控件的互移操作
2016/12/22 Javascript
微信小程序  TLS 版本必须大于等于1.2问题解决
2017/02/22 Javascript
详解利用jsx写vue组件的方法示例
2017/07/17 Javascript
vue插件vue-resource的使用笔记(小结)
2017/08/04 Javascript
angularjs实现分页和搜索功能
2018/01/03 Javascript
jQuery实现网页拼图游戏
2020/04/22 jQuery
[15:58]DOTA2国际邀请赛采访专栏:Tongfu.Sansheng&KingJ,DK.rOtk
2013/08/08 DOTA
[02:41]DOTA2英雄基础教程 谜团
2013/12/10 DOTA
python读取xlsx的方法
2018/12/25 Python
Python多进程fork()函数详解
2019/02/22 Python
Pyqt5 实现跳转界面并关闭当前界面的方法
2019/06/19 Python
Django的models模型的具体使用
2019/07/15 Python
Python使用APScheduler实现定时任务过程解析
2019/09/11 Python
python selenium 执行完毕关闭chromedriver进程示例
2019/11/15 Python
使用Python实现画一个中国地图
2019/11/23 Python
Veronica Beard官网:在酷、经典和别致之间找到了平衡
2018/01/11 全球购物
世嘉游戏英国官方商店:SEGA Shop UK
2019/09/20 全球购物
北京华建集团SQL面试题
2014/06/03 面试题
销售副总经理岗位职责
2013/12/11 职场文书
邮政员工辞职信
2014/01/16 职场文书
开展读书活动总结
2014/06/30 职场文书
美国旅游签证工作证明
2014/10/14 职场文书
导游词之南迦巴瓦峰
2019/11/19 职场文书
JavaScript函数柯里化
2021/11/07 Javascript