管理多个会话和图形的合理方法 - python

我想在多个会话中管理多个Keras模型。构建我的应用程序后,除了创建,保存和加载模型外,还可以同时运行它们。

处理这种情况的正确方法是什么?

当前,一个模型由包装类的实例表示。它用于训练,保存,加载和预测。每个实例创建一个tf.Graphtf.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。

python参考方案

编辑:实际上,再次看到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会话对象是一个全局变量,因此只要您不尝试从多个线程中使用这些上下文,我想这应该可以工作。

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

Python pytz时区函数返回的时区为9分钟 - python

由于某些原因,我无法从以下代码中找出原因:>>> from pytz import timezone >>> timezone('America/Chicago') 我得到:<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD…

如何在PyQt4的动态复选框列表中检查stateChanged - python

所以我要从PyQt4的列表中添加复选框。但是我找不到在Window类中对每个状态使用stateChanged的方法。这是从列表元素添加它们的功能: def addCheckbox(self): colunas = Graphic(self.caminho).getColunas() for col in colunas: c = QtGui.QCheckBo…

用大写字母拆分字符串,但忽略AAA Python Regex - python

我的正则表达式:vendor = "MyNameIsJoe. I'mWorkerInAAAinc." ven = re.split(r'(?<=[a-z])[A-Z]|[A-Z](?=[a-z])', vendor) 以大写字母分割字符串,例如:'我的名字是乔。 I'mWorkerInAAAinc”变成…

如何打印浮点数的全精度[Python] - python

我编写了以下函数,其中传递了x,y的值:def check(x, y): print(type(x)) print(type(y)) print(x) print(y) if x == y: print "Yes" 现在当我打电话check(1.00000000000000001, 1.0000000000000002)它正在打印:<…