我是 Keras 和 tensorflow 的新手,并且遇到了問題。我正在使用一些損失函數(shù)(主要是 binary_crossentropy 和 mean_squared_error)來計算預測后的損失。由于 Keras 只接受它自己的變量類型,因此我創(chuàng)建了一個并將其作為參數(shù)提供。此場景在循環(huán)中執(zhí)行(帶睡眠),如下所示:獲取適當?shù)臄?shù)據(jù) -> 預測 -> 計算丟失的數(shù)據(jù) -> 返回它。由于我有多個遵循此模式的模型,因此我創(chuàng)建了 tensorflow 圖和會話以防止沖突(在導出模型的權重時,我遇到了單個圖和會話的問題,因此我必須為每個模型創(chuàng)建不同的模型)。但是,現(xiàn)在內(nèi)存不受控制地增加,在幾次迭代中從幾 MiB 增加到 700MiB。我知道 Keras 的 clear_session() 和 gc.collect(),我在每次迭代結束時使用它們,但問題仍然存在。這里我提供了一個來自項目的代碼片段,它不是實際的代碼。我創(chuàng)建了單獨的腳本以隔離問題:import tensorflow as tffrom keras import backend as Kfrom keras.losses import binary_crossentropy, mean_squared_errorfrom time import time, sleepimport gcfrom numpy.random import randfrom os import getpidfrom psutil import Processfrom csv import DictWriterfrom keras import backend as Kthis_process = Process(getpid())graph = tf.Graph()sess = tf.Session(graph=graph)cnt = 0max_c = 500with open('/home/quark/Desktop/python-test/leak-7.csv', 'a') as file: writer = DictWriter(file, fieldnames=['time', 'mem']) writer.writeheader() while cnt < max_c: with graph.as_default(), sess.as_default(): y_true = K.variable(rand(36, 6)) y_pred = K.variable(rand(36, 6)) rec_loss = K.eval(binary_crossentropy(y_true, y_pred)) val_loss = K.eval(mean_squared_error(y_true, y_pred)) writer.writerow({ 'time': int(time()), 'mem': this_process.memory_info().rss }) K.clear_session() gc.collect() cnt += 1 print(max_c - cnt) sleep(0.1)此外,我還添加了內(nèi)存使用圖: Keras memory leak任何幫助表示贊賞。
2 回答

侃侃無極
TA貢獻2051條經(jīng)驗 獲得超10個贊
最后,我所做的是K.variable()
從where
語句中刪除代碼。這樣,變量是默認圖形的一部分,稍后由 清除K.clear_session()
。
添加回答
舉報
0/150
提交
取消