解決tensorflow訓(xùn)練時內(nèi)存持續(xù)增加并占滿的問題
記錄一次小白的tensorflow學(xué)習(xí)過程,也為有同樣困擾的小白留下點(diǎn)經(jīng)驗(yàn)。
先說我出錯和解決的過程。在做風(fēng)格遷移實(shí)驗(yàn)時,使用預(yù)加載權(quán)重的VGG19網(wǎng)絡(luò)正向提取中間層結(jié)果,結(jié)果因?yàn)榇a不當(dāng),在遍歷圖片提取時內(nèi)存持續(xù)增長,導(dǎo)致提取幾十個圖片的特征內(nèi)存就滿了。
原因是在對每一張圖片正向傳播結(jié)束后,都會在留下中間信息。具體地說是在我將正向傳播的代碼與模型的代碼分離了,在每次遍歷圖片時都會正向傳播,在tensorflow中新增加了很多的計(jì)算節(jié)點(diǎn)(如tf.matmul等等),導(dǎo)致內(nèi)存中遺留了大量的過期信息。
糾正的做法就是一個前提:避免在循環(huán)訓(xùn)練圖片時額外使用tf計(jì)算資源。
使用placeholder作為輸入數(shù)據(jù)的入口,在模型中定義需要使用的函數(shù),包括正向傳播。不要在遍歷圖片時額外使用tf計(jì)算。
遇到這種問題一定要回頭檢查代碼,尤其是在別人寫的代碼基礎(chǔ)上改時。 多學(xué)習(xí)公開的源碼。
錯誤示例:
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計(jì)算操作
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進(jìn)行一些處理,此處在遍歷圖片時額外使用了tensorflow的計(jì)算節(jié)點(diǎn),導(dǎo)致在內(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計(jì)算操作定義在模型中
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計(jì)算節(jié)點(diǎn)吧。
以上這篇解決tensorflow訓(xùn)練時內(nèi)存持續(xù)增加并占滿的問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python設(shè)計(jì)模式之裝飾模式實(shí)例詳解
這篇文章主要介紹了Python設(shè)計(jì)模式之裝飾模式,結(jié)合實(shí)例形式詳細(xì)分析了裝飾模式的概念、原理并結(jié)合Python實(shí)例形式分析了裝飾模式的相關(guān)使用技巧,需要的朋友可以參考下2019-01-01
pycharm執(zhí)行python時,填寫參數(shù)的方法
今天小編就為大家分享一篇pycharm執(zhí)行python時,填寫參數(shù)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10
python pandas 對時間序列文件處理的實(shí)例
今天小編就為大家分享一篇python pandas 對時間序列文件處理的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06
Flask wtforms實(shí)現(xiàn)表單驗(yàn)證使用
本文主要介紹了Flask wtforms實(shí)現(xiàn)表單驗(yàn)證使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08
python 將視頻 通過視頻幀轉(zhuǎn)換成時間實(shí)例
這篇文章主要介紹了python 將視頻 通過視頻幀轉(zhuǎn)換成時間實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04
python使用prettytable內(nèi)置庫美化輸出表格
這篇文章主要介紹了python使用prettytable內(nèi)置庫美化輸出表格,prettytable是pyhton內(nèi)置庫,文章圍繞主題的相關(guān)資料展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下2022-06-06
Django實(shí)現(xiàn)web端tailf日志文件功能及實(shí)例詳解
這篇文章主要介紹了Django實(shí)現(xiàn)web端tailf日志文件功能,本文通過實(shí)例給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07

