2014-02-26 63 views
7

我正在用cudaconvnet和Daniel Nouri的noccn模塊進行圖像分類,並希望通過拍攝大量原始圖像的補丁(並翻轉它)來實現數據增強。什麼時候最適合發生這種情況?用卷積神經網絡實現圖像分類的數據增強

我已經確定了3個階段在訓練過程中何時能:給定一個批次
一)從數據創建批處理時,
B)獲得下一批何時訓練
C),獲得當下一張圖片以進入網絡

在我看來,a)的優勢在於我可以將增強數據分散到所有批次中。但它將佔用磁盤空間的1000倍原始數據集已經是1TB,因此完全不可行。

b)和c)不涉及將新數據存儲在磁盤上,但可以批量分散數據嗎?如果我不這樣做,那麼假設我有batch_size == 128,並且我可以擴充我的數據1000x,那麼接下來的8批將包含來自同一類的圖像。訓練網絡並不壞,因爲每個訓練樣本根本不會被隨機化?此外,如果我選擇b)或c)並從k個訓練樣例中創建一個新批次,那麼數據增加n次將使批量n * k而不是多次批量n次。

例如,在我的情況下,我有batchsize == 128,可以預計1000倍數據增強。因此,每個批次實際上的大小爲128 * 1000,我會得到的是更精確的偏導數估計值(對於無用的程度,因爲batchsize == 128k是無意義的高)。

那我該怎麼辦?

回答

6

沒錯,你希望擴大樣本,使其隨機散佈在整個數據的其餘部分。否則,你肯定會遇到你提到的問題,因爲批次不會被正確採樣,你的梯度下降步驟將會過於偏見。我對cudaconvnet不太熟悉,因爲我主要與Torch合作,但我經常遇到與人爲增強數據相同的情況。

你最好的選擇是(c),那種。

對我來說,增加數據的最佳位置是正確的,當一個樣本被教練的內部循環加載時 - 應用隨機失真,翻轉,裁剪(或者其他擴展你的樣本)瞬間併到單個數據樣本。這將實現的是,每當訓練員嘗試加載樣本時,它實際上都會收到一個修改後的版本,它可能會與之前迭代中看到的任何其他圖像不同。

然後,當然,你需要到別的調整的東西仍然得到了1000倍的數據大小的因素在這兩種:

  1. 理想的情況下,每時期負荷更批次內循環後,處理完第一組。如果你的擴展器設置正確,每批都會繼續得到隨機樣本,這樣它們都能很好地工作。火炬允許這樣做,但它有點棘手,我不確定你是否能夠在cudaconvnet中做同樣的事情。
  2. 否則,只需運行培訓師1000多個訓練時期即可。不夠優雅,但最終結果將是一樣的。如果您以後需要報告您受過訓練的時代數量,只需將實際數量除以1000即可根據您的1000倍增強數據集獲得更合適的估計值。

這樣,您將始終將您的目標類作爲您的原始數據隨機分佈在整個數據集中,而不會消耗任何額外的磁盤空間來緩存增強樣本。當然,這是以額外的計算能力爲代價的,因爲您會一直沿着路徑的每一步按需生成樣本,但您已經知道...

此外,也許更重要的是,您的批次將保持原來的128個大小,因此小批量過程將保持不變,您學習的參數更新將繼續以您期望的相同頻率下降。對於SGD培訓(批量大小= 1),同樣的過程也很有效,因爲培訓師將永遠不會看到「相同」的圖像兩次。

希望有所幫助。

+0

這是否意味着你的模型永遠不會看到實際的地面真相圖像,但始終是圖像的修改版本? – Demonedge

+0

@Demonedge你的一個隨機增強可能無能爲力。 – Alex