本文主要列举了在用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(...)