• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Keras多线程机制与flask多线程冲突的解决方案

    在使用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"

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

    您可能感兴趣的文章:
    • flask开启多线程的具体方法
    • python进阶之多线程对同一个全局变量的处理方法
    • windows安装TensorFlow和Keras遇到的问题及其解决方法
    • 解决python多线程报错:AttributeError: Can''t pickle local object问题
    上一篇:pytorch 6 batch_train 批训练操作
    下一篇:新手必备Python开发环境搭建教程
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Keras多线程机制与flask多线程冲突的解决方案 Keras,多,线程,机制,与,flask,