Tensorflow中的Lazy load問題

2021-08-16 06:15:13 字數 1521 閱讀 9549

用tensorflow訓練或者inference模型的時候,有時候會遇到執行越來越慢,最終記憶體被佔滿,導致電腦宕機的問題,我們稱之為記憶體溢位。出現這種問題很可能是因為在乙個session中,graph迴圈建立重複的節點所導致的lazy load問題。

舉個例子,用tensorflow迴圈做多次加法運算,常見的做法是:

x = tf.variable(10, name='x')

y = tf.variable(20, name='y')

z = tf.add(x, y)

with tf.session() as sess:

sess.run(tf.global_variables_initializer())

for _ in range(10):

sess.run(z)

在session開始之前graph如下:

有可能有人想省點力氣,把z = tf.add(x, y)加法操作直接寫到session中:

x = tf.variable(10, name='x')

y = tf.variable(20, name='y')

with tf.session() as sess:

sess.run(tf.global_variables_initializer())

for _ in range(10):

sess.run(tf.add(x, y)) # 只在需要時才建立節點

在session開始之前graph如下:

可以發現在graph中看不到加法操作了,是不是真的簡化了呢?對單步操作可能是簡化了,但是當遇到如本例中的迴圈操作時,這種將tensorflow op寫到迴圈中的做法會產生lazy load的問題,讓你的記憶體逐漸被佔滿,為什麼?

迴圈結束之後我們將兩種操作方法各自graph中的節點通過print (tf.get_default_graph().as_graph_def())

命令列印出來,正常操作的graph protobuf如下:

node

}}

可見graph中只有乙個加法操作的節點,而第二種將加法寫在session迴圈中的方法用同樣的命令將其graph protobuf列印出來,得到的是重複的10個上述節點。所以,如果迴圈不是10個,而是更多個,則會導致graph中的節點越來越多,最終導致記憶體溢位。

將一些算術操作通過tf.placeholder寫在session外,session中通過feed_dict=填入資料。session裡如果有迴圈,切記不要在迴圈中進行tf操作。

stanford cs20si

Hibernate中的fetch和lazy介紹

fetch 指定關聯物件抓取的方式,可以設定fetch select 和 fetch join select方式時先查詢返回要查詢的主體物件 列表 再根據關聯外來鍵id,每乙個物件發乙個select查詢,獲取關聯的物件,形成n 1次查詢 而join方式,主體物件和關聯物件用一句外來鍵關聯的sql同時...

tensorflow中的函式

執行當前tensor的run 操作 a tf.variable tf.ones 10 with tf.session as sess tf.global variables initializer run b sess.run a 1 b a eval 2 print b 中的 1 2 行的功能一樣...

tensorflow中的global step引數

global step在滑動平均 優化器 指數衰減學習率等方面都有用到,這個變數的實際意義非常好理解 代表全域性步數,比如在多少步該進行什麼操作,現在神經網路訓練到多少輪等等,類似於乙個鐘錶。global step經常在滑動平均,學習速率變化的時候需要用到,這個引數在tf.train.gradien...