几周以来,我一直在努力使用 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)
这是我之前为阐明该问题所做的努力。
尽我最大的能力并在一些人的帮助下,我尝试想出一种管理这些资源的方法(上下文管理器和训练后“关闭”网络)。但我还没有遇到过详细描述 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/