我想在多个会话中管理多个Keras模型。构建我的应用程序后,除了创建,保存和加载模型外,还可以同时运行它们。
解决这种情况的正确方法是什么?
当前,一个模型由包装类的实例表示。它用于训练,保存,加载和预测。每个实例分别创建一个tf.Graph
和tf.Session
,它们被用在需要实际模型的每个函数中。
class NN:
def __init__(self):
self.graph = tf.Graph()
self.session = tf.Session(graph=self.graph)
def predict(self, x):
with self.graph.as_default():
with self.session.as_default():
return self.model.predict(x)
使用with
语句创建相似的函数来编译网络,拟合,保存(权重为.h5,模型为JSON)和加载。因此,只要需要模型,就可以将图和会话置于上下文中。
这导致了一个奇怪的错误(进一步的情况是Q),让我感到奇怪的是,处理此问题的标准方法是什么。在创建或加载模型之前,我试图释放所有可能的资源,但是并没有帮助。该功能只是从互联网上刮除的所有可能例程的汇编,纯粹是猜测。
def _new_session(self):
if self.session is not None:
self.session.close()
k.clear_session()
gc.collect()
self.graph = tf.Graph()
self.session = tf.Session(graph=self.graph)
我没有找到类似情况的好的文档。因此,我非常感谢对此有任何真正的见识。
我可能需要删除旧问题,因为它遍地都是。在问的时候,我不知道发生了什么。但是现在就在那里。
出现了一些具体问题。
最终,该错误的根本问题是通过更新所有程序包({有点尴尬)resolved。
答案 0 :(得分:0)
编辑:实际上,再次看到K.get_session()
的工作方式,它应该返回当前的默认会话,因此我不确定set_session
在那儿做任何有意义的事情。万一您想尝试,我会留下答案,但这可能无济于事。
也许您可以使它与类似这样的东西一起工作:
from contextlib import contextmanager
class NN:
def __init__(self):
self.graph = tf.Graph()
self.session = tf.Session(graph=self.graph)
def predict(self, x):
with self._context():
return self.model.predict(x)
@contextmanager
def _context(self):
prev_sess = K.get_session()
K.set_session(self.session)
with self.graph.as_default(), self.session.as_default():
yield
K.set_session(prev_sess)
请注意,Keras会话对象是一个全局变量,因此只要您不尝试从多个线程中使用这些上下文,我想这应该起作用。