Python 如何使用K.clear_session()修复Keras中的内存泄漏问题?
我有一个网络,我正在通过批量输入数据进行训练,我正在使用Python 如何使用K.clear_session()修复Keras中的内存泄漏问题?,python,tensorflow,keras,Python,Tensorflow,Keras,我有一个网络,我正在通过批量输入数据进行训练,我正在使用model.train\u on\u batch()来完成这项工作。如果我只运行这个训练部分,我看到我的网络训练在40多个历元(到目前为止)中的RAM利用率为3%,并且每个历元大约有2000次迭代。当我尝试在每个历元之后进行验证时(这也会成批发生),会出现非常严重的内存泄漏,导致90%的RAM利用率,并导致我的代码被杀死。在过去的几天里,我尝试了一些方法,似乎循环中的model.predict()会导致内存泄漏。我试着在批处理()上预测,同
model.train\u on\u batch()
来完成这项工作。如果我只运行这个训练部分,我看到我的网络训练在40多个历元(到目前为止)中的RAM利用率为3%,并且每个历元大约有2000次迭代。当我尝试在每个历元之后进行验证时(这也会成批发生),会出现非常严重的内存泄漏,导致90%的RAM利用率,并导致我的代码被杀死。在过去的几天里,我尝试了一些方法,似乎循环中的model.predict()
会导致内存泄漏。我试着在批处理()上预测,同样的行为model(inputs,training=False)
似乎减缓了内存泄漏,而不是从3%-7%-13%-40%-80%-90%(间隔60秒)的突然跳跃,它每分钟增加1%。但在某一点上,它也达到了90%。我唯一可以尝试使用这个github线程的方法就是使用K.clear\u session()
我试着阅读K.clear_session()
和一些SO帖子的文档,所有这些帖子都建议在创建多个模型时使用它,而我没有这样做。所以我的问题是,如果我有一个模型在循环中进行训练和评估,我应该在每个历元之后在哪里使用K.clear_session()
,并在每个历元之前重新加载保存的模型?对吗
除此之外,我还得到了拓扑排序错误,所以我想知道这是否是因为我在循环中训练,因为我的代码没有循环,这也会导致内存泄漏,K.clear\u session()
会有帮助吗
我的代码结构的最小示例:
from tensorflow.keras.models import Model
K = tf.keras.backend
def myModel():
**some architecture**
ip = Input(shape=(h, w, 3))
op = myModel(ip)
model = Model(ip, op)
model.compile(optimizer=Adam(lr=1e-6), loss=custom_mean_squared_error)
for e in range(numEpochs):
for batch in range(0, num_train_batches):
x = readImages()
y = readLabels()
loss = model.train_on_batch(x, y)
for batch in range(0, num_val_batches):
x = readImages()
y = model.predict(x)
val_loss = K.get_value(custom_mean_squared_error(x,y))
# save predictions
# plot training vs validation loss
Tensorflow-gpu-1.14,python3.6。如果我做错了什么,我也会很感激你的建议。这对我来说似乎很有效,但会使过程变慢:
from tensorflow.keras.models import Model
K = tf.keras.backend
def myModel():
**some architecture**
ip = Input(shape=(h, w, 3))
op = myModel(ip)
model = Model(ip, op)
model.compile(optimizer=Adam(lr=1e-6), loss=custom_mse)
for e in range(numEpochs):
for batch in range(0, num_train_batches):
x = readImages()
y = readLabels()
# define appropriate flags for first loop
model = tf.keras.models.load_model(model_path,custom_objects={ 'custom_mse': custom_mse } )
loss = model.train_on_batch(x, y)
model.save(model_path)
for batch in range(0, num_val_batches):
x = readImages()
model = tf.keras.models.load_model(model_path,custom_objects={ 'custom_mse': custom_mse } )
y = model.predict(x)
K.clear_session()
val_loss = K.get_value(custom_mean_squared_error(x,y))
# save predictions
# plot training vs validation loss