python - 第 3 部分 : Switching between multiple contexts - no error and a bad exit code

标签 python tensorflow keras

几周以来,我一直在努力使用 tf.Graphs 和 tf.Sessions 管理多个 Keras 模型。简而言之,我希望打开多个模型并根据需要在它们之间切换。这包括训练新模型、打开文件和进行预测。

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

  • 我可以加载模型并对其进行预测。收到结果,打印结果后,程序崩溃了。
  • 我可以加载多个模型并对其进行预测。然后程序崩溃了。
  • 我可以创建一个新模型,并对其进行预测。最后,程序崩溃了。
  • 我无法创建两个模型,即使使用下面类的不同实例创建同一模型两次也是如此。程序崩溃了。

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

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 资源管理过程的文档或教程。

<小时/>

我的目标有两个。

  • 首先,消除此错误
  • 希望了解处理这种情况的绝对正确的方法

如果您能帮助我实现这一目标,甚至朝其中一个方向迈出一小步,我将不胜感激!我的经验是,我的挣扎既不是独一无二的,也不是其他人没有想到的。所以我一定是缺乏正确的方法。

最佳答案

通过将所有软件包更新到最新版本,该问题已得到解决。遗憾的是,我一次性进行了升级,这意味着我不确定到底是什么原因。但我愿意押注于 Tensorflow。

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

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

关于python - 第 3 部分 : Switching between multiple contexts - no error and a bad exit code,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53317523/

相关文章:

python - 如何在 CPU 上运行 TensorFlow

python - 对角化+可训练的自定义 Tensorflow 层

python - 在 keras 层中指定 `input_shape` 时,Tensorflow 2.0 泄漏内存

python - 建立一个keras模型

python - 如何检索元类方法

python - 组合函数以产生所需的整数输出

python - 如何将数组(即列表)列转换为 Vector

python - 用股票报价识别 Pandas 数据框中的价格波动/趋势

python - 基于中间层输出的 Keras 指标

python - to_categorical 返回 2 列矩阵