微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我想在多个会话中管理多个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.

解决方法:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐