keras 多线程环境下加载模型
Tensor Tensor is not an element of this graph.
问题场景
keras 使用flask 发布深度学习模型服务,模型有一个定时任务(新开了一条线程)来进行训练以及重新加载,出现了错误。
Tensor Tensor("dense_1/Sigmoid:0", shape=(?, 59), dtype=float32) is not an element of this graph.
原因
在Tensorflow中,所有操作对象都包装到相应的Session中的,所以想要使用不同的模型就需要将这些模型加载到不同的Session中并在使用的时候申明是哪个Session,从而避免由于Session和想使用的模型不匹配导致的错误。而使用多个graph,就需要为每个graph使用不同的Session,但是每个graph也可以在多个Session中使用,这个时候就需要在每个Session使用的时候明确申明使用的graph。
在调用keras的tensorflow的应用程序中,保证tensorflow的模型是单线程加载的。如果多线程加载模型的话,必须制定的Graph,以及session。
代码
1.定义class
class Tfmodel:
# 模型
__model = object
# 模型版本
__model_version = 0
# 词向量模型
__word_vector = object
# 图
__graph = object
# session
__session