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抓取Discuz!用户名脚本代码
Dec 30 Python
跟老齐学Python之玩转字符串(3)
Sep 14 Python
shelve  用来持久化任意的Python对象实例代码
Oct 12 Python
Python字符编码与函数的基本使用方法
Sep 30 Python
Python使用文件锁实现进程间同步功能【基于fcntl模块】
Oct 16 Python
python 3调用百度OCR API实现剪贴板文字识别
Sep 04 Python
使用python实现对元素的长截图功能
Nov 14 Python
django formset实现数据表的批量操作的示例代码
Dec 06 Python
python利用os模块编写文件复制功能——copy()函数用法
Jul 13 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
Oct 18 Python
Python实现网络聊天室的示例代码(支持多人聊天与私聊)
Jan 27 Python
Pytorch模型迁移和迁移学习,导入部分模型参数的操作
Mar 03 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 数组随机取值的简单实例
2016/05/23 PHP
基于thinkPHP类的插入数据库操作功能示例
2017/01/06 PHP
php libevent 功能与使用方法详解
2020/03/04 PHP
javascript 二分法(数组array)
2010/04/24 Javascript
发布一个基于javascript的动画类 Fx.js
2010/11/05 Javascript
js实现俄罗斯方块小游戏分享
2014/01/31 Javascript
Javascript中的数据类型之旅
2015/10/18 Javascript
jQuery Validate 无法验证 chosen-select元素的解决方法
2017/05/17 jQuery
微信小程序表单验证错误提示效果
2017/05/19 Javascript
vue.js响应式原理解析与实现
2020/06/22 Javascript
vue-cli3脚手架的配置及使用教程
2018/08/28 Javascript
浅谈vue 单文件探索
2018/09/05 Javascript
vue 循环加载数据并获取第一条记录的方法
2018/09/26 Javascript
浅谈layui使用模板引擎动态渲染元素要注意的问题
2019/09/14 Javascript
Vue检测屏幕变化来改变不同的charts样式实例
2020/10/26 Javascript
jquery实现拖拽添加元素功能
2020/12/01 jQuery
[01:00:35]2018DOTA2亚洲邀请赛3月30日B组 EffcetVSMineski
2018/03/31 DOTA
[01:14:55]EG vs Spirit Supermajor 败者组 BO3 第三场 6.4
2018/06/05 DOTA
Python实现的二维码生成小软件
2014/07/11 Python
python分割文件的常用方法
2014/11/01 Python
scrapy爬虫实例分享
2017/12/28 Python
Python实现Pig Latin小游戏实例代码
2018/02/02 Python
python利用多种方式来统计词频(单词个数)
2019/05/27 Python
Python动态语言与鸭子类型详解
2019/07/01 Python
python 装饰器功能与用法案例详解
2020/03/06 Python
详解python 条件语句和while循环的实例代码
2020/12/28 Python
毕业自我鉴定
2013/11/05 职场文书
招聘与培训专员岗位职责
2014/01/30 职场文书
促销活动总结
2014/04/28 职场文书
环保倡议书500字
2014/05/15 职场文书
学校法制宣传月活动总结
2014/07/03 职场文书
项目经理岗位职责范本
2015/04/01 职场文书
2016年公司“3.12”植树节活动总结
2016/03/16 职场文书
postgresql无序uuid性能测试及对数据库的影响
2021/06/11 PostgreSQL
html+css实现环绕倒影加载特效
2021/07/07 HTML / CSS
解决 redis 无法远程连接
2022/05/15 Redis