1. 程式人生 > >TensorFlow 遇坑小結

TensorFlow 遇坑小結

簡介

對於TensorFlow和python新手來說,寫程式碼就是坑,遇到各種問題,然而卻只能慢慢解決。

GPU溢位OOM問題

報錯大致如下:
ResourceExhaustedError (see above for traceback): OOM when allocating tensor with shape[]......
嘗試:

我需要跑大概10000張圖片,大小為256x256,通道為RGB3通道。最開始請教實驗室同學說是因為圖片太大,batch_size調小點。然而,

num = 100, batch_size = 32 # 嘗試了100張圖片,訓練了幾百輪報上述錯誤OOM
num = 500, batch_size = 168 # 依然如故 num = 1000, batch_size = 1 # 這時跑了很久,但還是不行,我想跟batch_size無關了 ... # 後面我嘗試調了圖片訓練數量和batch_size
猜測:

與batch_size和訓練集圖片數量無關。

解決:

檢視程式碼,看了幾遍發現只有如下部分疑似有問題:

with tf.Session() as sess:
    for t in range(0, num-batch_size, batch_size)
        xs_batch, ys_batch =  sess.run([X_train[t:t+batch_size],Y_train[t:t+batch_size]])

改動後,如下:

with tf.Session() as sess:
        # sess.run(tf.global_variables_initializer())
        saver.restore(sess, model_path)
        # writer = tf.summary.FileWriter('./graphs', sess.graph)
        for i in range(iters):
            for t in range(0, train_num-batch_size, batch_size):
                xs_batch, ys_batch = inputs(t, t+batch_size)
                sess.run(train_step, feed_dict={xs:xs_batch, ys:ys_batch})
                if
t % 10 == 0: cost = sess.run(cost_function, feed_dict={xs: xs_batch, ys: ys_batch}) print('iters:%s, batch_add:%s, loss:%s' % (i, t, cost)) file_log.write('iters:%s, batch_add:%s, loss:%s \n' % (i, t, cost)) if i % 100 == 0: saver.save(sess, model_path) # writer.close() sess.close()
總結

sess.run()不能頻繁使用,尤其是處理大資料集的時候,儘量避免sess.run(),如果只是簡單的預測值無所謂,而且儘量避免sess.run()放入迴圈裡面。

學習率問題

問題

當最開始設定較大例如0.5,然後loss值卻一直不變。

猜測

可能與最開始引數隨機初始化時,最開始的反向傳播梯度無法下降,原因可能與初始化函式的標準差設定有關。

解決辦法

逐漸調小學習率,例如我的rate=0.5、0.2、0.12、0.1…直至最後的0.08梯度開始下降,這時候儲存引數模型,用這個引數模型再進行訓練,這時可以適當增大學習率保證速度。例如儲存0.08的引數模型、再將梯度適當調大一點,或者不調,還是0.08。

模型網路層數太多,以少量資料預測問題

問題

因圖片資料集很大,GPU只有一塊,最開始想用幾張圖片來預估計模型的效果,但是需要很長時間才能擬合。

猜測

模型網路層數太多,導致幾張圖片壓根不能很快擬合模型,因為模型會擬合但是依然會消耗很長時間。

解決辦法

以少量資料預測模型表現,這種思路很好,但是本身存在問題。當想這樣做時,可以減少網路層數或者減少過濾器數量來觀察少量資料預測模型表現,但是最好保證模型網路結構不變。如下,可以減少每次卷積時的過濾器數量,原本模型3 -> 64 -> 128 -> 256 -> 128 -> 64 -> 3,可以變成3 -> 6 -> 12 -> 24 -> 12 -> 6 -> 3,這是舉例,與下圖不完全一致。
這裡寫圖片描述

梯度下降問題

問題

使用Mini-Batch Gradient Descent(小批量梯度下降)雖然保證了會朝著好的方向下降,但是速度太慢,更別說Batch Gradient Descent(批量梯度下降),一晚上都得不到想要的結果。

猜想

因資料集太大,差不多10000張256*256圖片,就算採用MBGD仍然很慢。

解決辦法

於是我用了Stochastic Gradient Descent(隨機梯度下降),就效果來說,差不多10分鐘SGD抵上10小時MBGD,隨機梯度下降雖然不穩定,但是速度極快,這一點就足夠了。對於測試新模型表現,用這個方法很好。

結束語

後續會補充坑集,OOM只是坑集中的第一個,慶幸解決了。下面是本科畢設專案,正在完成ing。