我剛剛做了這個最後一週!這真是太棒了,我通過使用諸如tf.map_fn
和tf.cond
之類的東西瞭解了大量張量流。它的工作。
這個星期我只是重構我的代碼,以消除所有,因爲這是一個壞主意。
問題我跑進:
- 在tensorflow做預處理是凌亂的調試。做適當的TDD在這裏肯定會讓你受益,但是仍然不會特別漂亮或者容易調試。
- 你應該將預處理卸載到CPU並離開GPU(假設你正在使用一個)來進行訓練。一個更好的方法是隻有一個隊列,並從專用於預處理任務的線程/類中加載它。在numpy/scikit/scikit-image中進行工作將會更容易配置和測試。
- 我以爲我太聰明瞭,把我的所有代碼都集中到一個模型中。但是預處理的複雜性意味着我的模型很難迭代,它很快就會變成嚴格的代碼 - 例如當我添加測試集評估時,預處理要求稍有不同。突然間,我不得不向模型中添加大量的條件代碼,並且它變得很難看。
這就是說,我的預處理步驟可能比您的預處理步驟更復雜。如果你堅持簡單的事情,你可以應用一些簡單的圖像預處理步驟,你可能會更容易地採取這種方法。
具體回答你的問題:
隊列不會給超過feed_dict任何好處,我知道的。您仍然存在將數據從CPU上的TF隊列移動到GPU內存的問題,每次迭代都與feed_dict相同,請觀看此線程,如果您關心該主題,GPU隊列即將到來:https://github.com/tensorflow/tensorflow/issues/7679
您應該只是dequeue_many
從隊列中,作爲批處理。如果您需要對每張圖片做一些操作,只需使用tf.map_fn
即可刪除第一個維度,並將單個3D圖像傳遞到您指定的功能。但是當你走這條路時,請注意上面的警告 - 你可能會更快樂,只是在單獨的線程中做這件事。
已經在#2中回答了,請使用tf.map_fn
來批量處理多個圖像。實際使用非常簡單。
我不知道凱拉斯。
Hi @DavidParks,非常感謝您的回覆。 1.根據你的建議,我會在python線程中使用feed_dict。 2.我的用例很簡單我猜,我沒有做太多的預處理(concat,subtract)。我會嘗試使用tf.map_fn,看看如何。 – hars