2017-04-05 83 views
-1

喂有一種方法來構建在Tensorflow下圖:讀取多個圖像,其中處理一個圖像,並通過模型

  1. 負載一些N個圖像使用TF隊列和TF(N可爲每個組變化)圖像讀者。
  2. 處理這些圖像以獲得固定大小的圖像並準備批次。

    1. 我試圖建立TF數據加載一部分,而不是Python的功能和feed_dict:
    2. 通過CNN模型訂閱這些批次

    一些問題/信息。我想,與Python和feed_dict相比,TF Data加載可以更快地訓練模型。是對的嗎 ?

  3. 建立小N的圖(N < 5)很簡單。爲N中的每個圖像定義獨佔節點並對它們進行處理。 (working)
  4. 我可以使用TF「while_loop」來構建這樣的功能來讀取N個圖像嗎?
  5. Keras是否支持這種功能?

感謝您的建議。

回答

1

我剛剛做了這個最後一週!這真是太棒了,我通過使用諸如tf.map_fntf.cond之類的東西瞭解了大量張量流。它的工作。

這個星期我只是重構我的代碼,以消除所有,因爲這是一個壞主意。

問題我跑進:

  1. 在tensorflow做預處理是凌亂的調試。做適當的TDD在這裏肯定會讓你受益,但是仍然不會特別漂亮或者容易調試。
  2. 應該將預處理卸載到CPU並離開GPU(假設你正在使用一個)來進行訓練。一個更好的方法是隻有一個隊列,並從專用於預處理任務的線程/類中加載它。在numpy/scikit/scikit-image中進行工作將會更容易配置和測試。
  3. 我以爲我太聰明瞭,把我的所有代碼都集中到一個模型中。但是預處理的複雜性意味着我的模型很難迭代,它很快就會變成嚴格的代碼 - 例如當我添加測試集評估時,預處理要求稍有不同。突然間,我不得不向模型中添加大量的條件代碼,並且它變得很難看。

這就是說,我的預處理步驟可能比您的預處理步驟更復雜。如果你堅持簡單的事情,你可以應用一些簡單的圖像預處理步驟,你可能會更容易地採取這種方法。

具體回答你的問題:

  1. 隊列不會給超過feed_dict任何好處,我知道的。您仍然存在將數據從CPU上的TF隊列移動到GPU內存的問題,每次迭代都與feed_dict相同,請觀看此線程,如果您關心該主題,GPU隊列即將到來:https://github.com/tensorflow/tensorflow/issues/7679

  2. 您應該只是dequeue_many從隊列中,作爲批處理。如果您需要對每張圖片做一些操作,只需使用tf.map_fn即可刪除第一個維度,並將單個3D圖像傳遞到您指定的功能。但是當你走這條路時,請注意上面的警告 - 你可能會更快樂,只是在單獨的線程中做這件事。

  3. 已經在#2中回答了,請使用tf.map_fn來批量處理多個圖像。實際使用非常簡單。

  4. 我不知道凱拉斯。

+0

Hi @DavidParks,非常感謝您的回覆。 1.根據你的建議,我會在python線程中使用feed_dict。 2.我的用例很簡單我猜,我沒有做太多的預處理(concat,subtract)。我會嘗試使用tf.map_fn,看看如何。 – hars