第3部分:在多个上下文之间切换无错误和错误退出

2024-10-03 11:13:21 发布

您现在位置:Python中文网/ 问答频道 /正文

几个星期以来,我一直在用tf.Graphstf.Sessions管理多个Keras模型。简言之,我想有多个模型打开,并根据需要在它们之间切换。这包括训练新模型,从文件中打开并做出预测。你知道吗

底线是:(几乎)一切正常,直到程序崩溃退出代码0xC0000005。未给出错误消息。让我解释一下。你知道吗

  • 我可以加载模型并对其进行预测。收到结果后,打印结果后,程序崩溃。你知道吗
  • 我可以加载多个模型并对它们进行预测。然后程序崩溃了。你知道吗
  • 我可以创建一个新模型,并对其进行预测。最后,程序崩溃了。你知道吗
  • 我不能创建两个模型,即使同一个模型使用下面的类的不同实例创建两次。程序崩溃了。你知道吗

你明白了。这就是我目前管理图表和会话的方式。我使用上下文管理器将创建的图形和会话设置为默认值,然后切换到以前的状态。你知道吗

class NeuralNetwork:
    def __init__(self):
        self.graph = tf.Graph()
        self.session = tf.Session(graph=self.graph)
        self.model = None

    def close(self):
        self.session.close()
        del self.graph
        self.graph = None
        gc.collect()

    @contextmanager
    def _context(self):
        prev = k.get_session()
        k.set_session(self.session)
        with self.graph.as_default(), self.session.as_default():
            yield
        k.set_session(prev)

    def predict(self, x):
        with self._context():
            return self.model.predict(x)

    def fit(self, x_train, y_train, n=20, batch=256):
        with self._context():
            self.model.fit(x_train, y_train, epochs=n, batch_size=batch, verbose=0)

    def create(self, shape):
        with self._context():
            self.model = Sequential()
            self.model.add(Dense(shape[1], input_dim=shape[0], activation='relu'))
            self.model.add(Dropout(drop))
            self.model.add(Dense(shape[2], activation='sigmoid'))
            self.model.compile(loss='binary_crossentropy', optimizer='rmsprop')

    def load(self, path, sfx=''):
        with open(path / ('architecture' + sfx + '.json'), 'r') as f:
            js = f.read()

        with self._context():
            self.model = model_from_json(js)
            self.model.load_weights(path / ('weights' + sfx + '.h5'))
            self.model.compile(loss='binary_crossentropy', optimizer='rmsprop')

    def save(self, path, sfx=''):
        path.mkdir(exist_ok=True)
        with self._context():
            js = self.model.to_json()
            with open(path / ('architecture' + sfx + '.json'), 'w') as f:
                f.write(js)
            self.model.save_weights(path / ('weights' + sfx + '.h5'))

在上面的课程中,我们将介绍如何在其他地方使用网络:

def create(self):
    x, y = [], []
    shape = (15, 30, 1)

    self.predictor = NeuralNetwork()
    self.predictor.create(shape)
    self.predictor.fit(x, y)
    self.predictor.save(path=self.path)
    self.predictor.close()

def load(self):
    self.predictor.load(path=self.path)

def predict(x):
    # Executed only on loaded networks, never on created networks
    # due to program structure
    return self.predictor.predict(x)

以下是我以前为阐明这个问题所作的努力。你知道吗

  • Part 1,我不知道的那个
  • Part 2,就是我开始想办法的那个

尽我所能,在一些人的帮助下,我试图想出一种管理这些资源的方法(上下文管理器和培训后“关闭”网络)。但我没有看到详细描述Tensorflow或Keras资源管理过程的文档或教程。你知道吗


我的目标是双重的。你知道吗

  • 首先,摆脱这个错误
  • 希望学习处理这种情况的绝对正确的方法

如果你能帮我实现,甚至朝着任何一个方向迈出一小步,我将不胜感激!我有这样的经历,我的奋斗既不是独一无二的,也不是别人未曾想到的。所以我肯定是缺乏正确的方法。你知道吗


Tags: path模型self程序modelsessiontfdef
1条回答
网友
1楼 · 发布于 2024-10-03 11:13:21

通过将所有包更新到其最新版本,解决了此问题。可悲的是,我一次升级,这意味着我不知道究竟是什么原因。但我愿意赌Tensorflow。你知道吗

以下是产生错误最可能涉及的包版本及其更新版本:

  • tensorflow==1.8.0 -> 1.12.0
  • numpy==1.14.5 -> 1.15.4
  • scikit-learn==0.19.1 -> 0.20.0

相关问题 更多 >