2017-06-15 55 views
4

我正在使用在Lua中實現的使用Torch進行圖像處理的CNN模型(AlexNet)。我正在修改Torch starter code向GPU發送大圖像時間

我的問題是我使用18個通道而不是3個通道來訓練模型,並且將這些圖像發送到GPU的時候,與發送圖像時相比,大約需要20個(每批2.13 s)有三個通道(每批0.14s)。我也嘗試看看將4個通道的圖像發送到GPU需要多長時間。我看到,只要頻道數量增加到3個頻道以上,時間就增加了大約20倍。例如,即使對於具有4個通道的圖像,每個批次也花費大約2s,這比運行3個通道圖像大約多19倍。

我想知道是否有一個錯誤使得它花費這麼多時間,如果沒有任何錯誤,如果有什麼辦法可以減少這個運行時間?

+0

你在修改啓動代碼來增加通道? – ktb

+0

我發現視頻中的七個幀的差異,然後堆疊它們,在這種情況下,而不是具有3個通道的圖像,我有18個通道的圖像作爲輸入到CNN。我已經修改了「donkey_simple.lua」,它獲取圖像並獲取視頻中幀的差異並堆疊它們,並且CNN的第一層而不是3,將其更改爲18個通道並在代碼中有一些張量大小。「main.lua」的這個部分「輸入:複製(data_im:squeeze())」需要很多時間。我發現這不是擠壓的問題。 –

+0

您是否嘗試減小批量大小以將包含相同字節數的批次發送到gpu? – fonfonx

回答

0

簡答

這是一個不會消失的問題。這是CPU到GPU緩衝的帶寬問題。您已經增加了必須通過總線發送的大量數據。

可能的解決方法

的你正在嘗試做的實質是在您的模型之前的幀。如果這就是你想要完成的,那麼還有另一種方法。

如果訓練批次不是堆疊圖像的隨機選擇,而是訓練批次是常規圖像,但是全部按時間順序排列。

在第二種情況下,您將發送只有3個通道的圖像,但圖像不會出現故障。

我們來探討一下假設。

首先,您仍然可以通過更改每個批次的開始時間和結束時間來創建隨機抽樣,並隨機選擇要選擇的視頻。

其次,可以使用[批次,身高,體重,信道]張量來在GPU上生成一個新的張量是

[ batch[1:], height, width, channel] - [ batch[:-1], height, width, channel] 
and assign it to diffTensor 

,然後連接以下張量

origTensor [ batch[5:-0], height, width, channel] 
diffTensor [ batch[5:-0], height, width, channel] 
diffTensor [ batch[4:-1], height, width, channel] 
diffTensor [ batch[3:-2], height, width, channel] 
diffTensor [ batch[2:-3], height, width, channel] 
diffTensor [ batch[1:-4], height, width, channel] 
diffTensor [ batch[0:-5], height, width, channel] 

如果你想5「回頭看」

這會完成什麼?那麼,如果你發送了100張圖片給GPU,那麼這個網絡將能夠生成95張圖片+差異圖片,這個圖片僅用於發送100張圖片的網絡價格,就好像你試圖發送95張圖片+每個人都必須支付發送500張圖片的網絡價格。基本上你可以減少你的網絡成本差不多x5

+0

感謝您的建議,我按照您的建議,但問題仍然存在,所以我認爲將帶有6個頻道的圖像發送到AlexNet可能需要很長時間。 –