解決tensorflow訓練時內(nèi)存持續(xù)增加并占滿的問題
記錄一次小白的tensorflow學習過程,也為有同樣困擾的小白留下點經(jīng)驗。
先說我出錯和解決的過程。在做風格遷移實驗時,使用預加載權重的VGG19網(wǎng)絡正向提取中間層結(jié)果,結(jié)果因為代碼不當,在遍歷圖片提取時內(nèi)存持續(xù)增長,導致提取幾十個圖片的特征內(nèi)存就滿了。
原因是在對每一張圖片正向傳播結(jié)束后,都會在留下中間信息。具體地說是在我將正向傳播的代碼與模型的代碼分離了,在每次遍歷圖片時都會正向傳播,在tensorflow中新增加了很多的計算節(jié)點(如tf.matmul等等),導致內(nèi)存中遺留了大量的過期信息。
糾正的做法就是一個前提:避免在循環(huán)訓練圖片時額外使用tf計算資源。
使用placeholder作為輸入數(shù)據(jù)的入口,在模型中定義需要使用的函數(shù),包括正向傳播。不要在遍歷圖片時額外使用tf計算。
遇到這種問題一定要回頭檢查代碼,尤其是在別人寫的代碼基礎上改時。 多學習公開的源碼。
錯誤示例:
def build_model(model_path): model_input = tf.placeholder('float32', [1, IMAGE_HEIGHT, IMAGE_WIDTH, COLOR_CHANNELS]) vec1 = ... ...... return model_input,vec1 def get_style_represent(vec): # 一些tf計算操作 return new_vec with tf.Session() as sess: sess.run(tf.global_variables_initializer()) img_input,vec1 = build_model(VGG19_MODEL) # 加載模型 for cur_img_path in imgs_path_list: # 遍歷圖片 cur_img = load_image(cur_img_path) vec1_out = sess.run(vec1, feed_dict = {img_input:cur_img}) # 正向傳播輸出模型中的vec1 # 對vec1進行一些處理,此處在遍歷圖片時額外使用了tensorflow的計算節(jié)點,導致在內(nèi)存中遺留信息 new_vec = get_style_represent(vec1_out)
正確示例:
def build_model(model_path): model_input = tf.placeholder('float32', [1, IMAGE_HEIGHT, IMAGE_WIDTH, COLOR_CHANNELS]) vec1 = ... ...... new_vec = ... # 將get_style_represent計算操作定義在模型中 return model_input,vec1,new_vec with tf.Session() as sess: sess.run(tf.global_variables_initializer()) img_input,vec1,new_vec = build_model(VGG19_MODEL) for cur_img_path in imgs_path_list: cur_img = load_image(cur_img_path) # 一次正向傳播將處理后的vec1也得到了,避免在每次圖片正向傳播時留下額外信息 vec1_out,new_vec_out = sess.run([vec1,new_vec], feed_dict = {img_input:cur_img})
所以,如果你也遇到了同樣的問題,不妨看一下你是不是在迭代過程中額外使用了新的tf計算節(jié)點吧。
以上這篇解決tensorflow訓練時內(nèi)存持續(xù)增加并占滿的問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
一個基于flask的web應用誕生 用戶注冊功能開發(fā)(5)
一個基于flask的web應用誕生第五篇,這篇文章主要介紹了用戶注冊功能開發(fā),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04Python向MySQL批量插數(shù)據(jù)的實例講解
下面小編就為大家分享一篇Python向MySQL批量插數(shù)據(jù)的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03Python入門_淺談數(shù)據(jù)結(jié)構的4種基本類型
下面小編就為大家?guī)硪黄狿ython入門_淺談數(shù)據(jù)結(jié)構的4種基本類型。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05Python Pandas 轉(zhuǎn)換unix時間戳方式
今天小編就為大家分享一篇Python Pandas 轉(zhuǎn)換unix時間戳方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12python使用pandas實現(xiàn)數(shù)據(jù)分割實例代碼
這篇文章主要介紹了python使用pandas實現(xiàn)數(shù)據(jù)分割實例代碼,介紹了使用pandas實現(xiàn)對dataframe格式的數(shù)據(jù)分割成時間跨度相等的數(shù)據(jù)塊,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-01-01