keras/tensorflow 使用flask部署服务的常见错误及部署多个模型

本文主要列举了在用keras/tensorflow训练好模型后,使用flask部署服务时的两个常见错误及一次性解决办法。

类型1、ValueError: Tensor Tensor(“dense_1/Softmax:0”, shape=(?, 5), dtype=float32) is not an element of this graph.

这个错误主要是报模型最后一层出现类似的错误,比如这里的最后一层是softmax,不同的模型最后一层可能不一样,但错误类型一致。

类型2、W tensorflow/core/framework/op_kernel.cc:1502] OP_REQUIRES failed at resource_variable_ops.cc:619 : Not found: Container localhost does not exist. (Could not find resource: localhost/Embedding-Segment/embeddings)

这个错误主要是报模型的一些中间层错误。

当然,在单独的 .py 文件中模型预测是正常的,但在flask中调用 model.predict() 就报上述类似错误。

一般来说添加如下代码可以解决这两个错误(其他一般错误也可以尝试以下方法):

from tensorflow.python.keras.backend import set_session
# 程序开始时声明
sess = tf.Session()
graph = tf.get_default_graph()
# tf2: graph = tf.compat.v1.get_default_graph()

# 在model加载前添加set_session
set_session(sess)
model = models.load_model(model_path)

# 每次使用有关模型请求时
# for each request:
global sess
global graph
with graph.as_default():
    set_session(sess)
    model.predict(...)

此外,如果需要加载多个模型,则需要定义多个计算图与会话,如

from tensorflow.python.keras.backend import set_session
import tensorflow as tf
# 程序开始时声明

# tf2中: graph = tf.compat.v1.get_default_graph()
# 在model加载前添加set_session
sess1 = tf.Session()
graph1 = tf.get_default_graph()
set_session(sess1)
model1.load_model(model_path1)

sess2 = tf.Session()
graph2 = tf.get_default_graph()
set_session(sess2)
model2.load_model(model_path2)

# 每次使用有关模型请求时
for each request:
    global sess1
    global graph1
    with graph1.as_default():
        set_session(sess1)
        model1.predict(...)
    global sess2
    global graph2
    with graph2.as_default():
        set_session(sess2)
        model2.predict(...)

 

你可能感兴趣的:(Keras,Tensorflow)