使用tf.Graph
和tf.Session
训练模型时,我遇到一个奇怪的问题。而且实现有些奇怪,请耐心等待。我想解释一下应用程序的结构。
通过更新所有程序包,问题终于({有点尴尬)resolved。
该应用程序是用于处理多个神经网络的服务:训练它们并对其做出预测。由于这个原因,一个图还不够。因此,在创建新模型时,我首先要像这样初始化Graph
和Session
:
def __init__(self):
self.graph = tf.Graph()
with self.graph.as_default():
self.session = tf.Session()
然后将它们用于训练过程中以及从磁盘加载模型时。
def fit(self, x_train, y_train, n=200, batch=256):
with self.graph.as_default():
with self.session.as_default():
self.model.fit(x_train, y_train, epochs=n, batch_size=batch, verbose=0)
这是问题发生的地方(我设法逐一注释掉所有内容,而fit方法正是它所在的位置),但是对于进一步的上下文,这也是(简化的)创建方法。它使用Keras。
def create(self):
with self.graph.as_default():
with self.session.as_default():
self.model = Sequential()
self.model.add(Dense(64, input_dim=shape[0], activation='relu',
kernel_regularizer=reg.l1_l2(0.1, 0.2)))
self.model.add(Dropout(0.5))
self.model.add(Dense(1, activation='sigmoid', kernel_regularizer=reg.l1_l2(0.1, 0.2)))
self.model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
在初始化网络并为其添加数据时,该过程会以错误代码0xC0000005
退出。这并不能提供有关问题本身的太多信息,并且在退出时会给出错误的退出代码。 即使在例程成功执行后执行了print
语句。这使我怀疑这不是实现问题,而是其他问题。
我在PyCharm上使用Python 3.6.5,但是即使从命令行执行,也出现了问题。正如我说的那样,有多种模型可供选择,但一次训练就足以崩溃。
这里可能有什么毛病?我意识到这不是一个可重现的问题,但是任何有关调试的指导都将不胜感激。
我尝试根据this answer修改fit
函数,但是没有运气。这是修改后的版本:
from keras import backend as K
import gc
def fit(self, x_train, y_train, n=20, batch=256):
K.set_session(self.session)
with self.graph.as_default():
with self.session.as_default():
self.model.fit(x_train, y_train, epochs=n*10, batch_size=batch, verbose=0)
K.clear_session()
gc.collect()
接下来,我尝试为每个计算(tf.Session(graph=self.graph)
)创建一个新会话。使用cg.collect()
时可以使用,但是在训练模型后,我无法通过新的会话进行预测。 tensorflow.python.framework.errors_impl.FailedPreconditionError: Attempting to use uninitialized value dense_1/bias
当前(11月8日),我将在创建模型和加载模型时释放所有可能的资源。这样的效果是,我可以一次创建模型,但是第二次(我进行了两次训练以独立评估模型),程序像以前一样崩溃了。让我们尝试一个新的问题,这已经失控了。 Q v.2