摘要:本文為利用gpu和caffe訓練神經網路的實戰教程,介紹了根據kaggle的「奧托集團產品分類挑戰賽」的資料進行訓練一種多層前饋網路模型的方法,如何將模型應用於新資料,以及如何將網路圖和訓練權值視覺化。
【編者按】本文為利用gpu和caffe訓練神經網路的實戰教程,介紹了根據kaggle的「奧托集團產品分類挑戰賽」的資料進行訓練一種多層前饋網路模型的方法,如何將模型應用於新資料,以及如何將網路圖和訓練權值視覺化。
caffe是由賈揚清發起的乙個開源深度學習框架,它允許你利用你的gpu訓練神經網路。相對於其他的深度學習框架如theano或torch等,caffe不需要你自己編寫演算法程式,你只需要通過配置檔案來指定網路。顯然,這種做法比自己編寫所有程式更加節省時間,也將你限制在一定的框架範圍內。不過,在大多數情況下,這沒有太大的問題,因為caffe提供的框架相當強大,並且不斷進步。
這篇文章的主題由一種多層前饋網路組成。該模型將根據kaggle的「奧托集團產品分類挑戰賽」的資料進行訓練。我們還關注將模型應用於新資料,以及如何將網路圖(network graph)和訓練得到的權值視覺化。限於篇幅,本文不會解釋所有的細節。另外,簡單的**比一千多字的話更有說服力。相對於對照
ipython notebook來程式化細節,本文將著重描述觀念以及一些我遇到的絆腳石。
設定
如果你還沒有把caffe安裝在你的系統上,我建議在乙個允許gpu處理的ec2例項上工作,例如g2.2xlarge例項。有關如何使用ec2工作的介紹可以檢視guide to ec2 from the command line,設定caffe及其準備工作可以參考gpu powered deep learning with nvidia digits on ec2。對於使用caffe,我也建議你在你的例項上安裝ipython notebook——在這裡可以找到教程。
定義模型和元引數
乙個模型及其應用的訓練至少需要三個配置檔案。這些配置檔案的格式遵循介面描述語言,稱為協議緩衝區(protocol buffers)。它表面上類似於json,但卻又顯著不同,實際上應該在需要進行驗證(通過自定義模式的方式——像caffe的這個這樣)和序列化的資料文件中取代它。
為了訓練,你必須有乙個prototxt檔案保持訓練的元引數(config.prototxt)以及乙個模型用於定義網路圖形(model_train_test.prototxt)——以非週期和定向的方式連線各層。需要注意的是,資料從底部流向到頂部時伴隨著關於怎樣指定層的順序。這裡的示例網路有五個層次:
資料層(乙個用於訓練,乙個用於測試)
內積層(權值ⅰ)
relus(隱含層)
內積層(權值ⅱ)
輸出層(用於分類的soft max)
a,soft max層給出損失
b,準確性層——允許我們看到網路如何在訓練的同時提公升。
以下從model_train_test.prototxt的摘錄顯示層(4)和(5a):
[...]第三個prototxt檔案(model_prod.prototxt)指定應用於它的網路。在這種情況下,它與訓練規範大體上是一致的——但它缺乏資料層(因為我們不從產品的資料來源中讀取資料)並且soft max層不會產生損耗值但有分類的可能。另外,準確性層現在已經沒有了。還要注意的是,我們現在在開始指定輸入尺寸(如預期:1,93,1,1)——它是肯定混亂的,所有四個尺寸被稱為input_dim,只有順序定義哪個是哪個,並沒有指定明確的背景。layer
bias_filler
}}layer
}[...]
支援的資料來源
這是開始嘗試使用caffe時要克服的首要心理障礙之一。它不像使用一些csv來提供caffe可執行的方式那樣簡單。實際上,對於沒有影象的資料,你有三種選擇。
hdf5可能是最容易使用的,因為你只需要採用hdf5格式把資料集儲存到檔案中。lmdb和leveldb是資料庫,所以你必須按照他們的協議。hdf5格式儲存資料集的大小會被記憶體限制,這就是為什麼我拋棄它的原因。lmdb和leveldb之間的選擇是相當隨便的——從我掠過的資源來看,lmdb似乎更強大,速度更快,更成熟。然後從github來看,leveldb的維護似乎更積極,也具有較大的google和stackoverflow的足跡。
blobs和datums
caffe內部使用乙個叫做blobs的資料結構進行工作,它用於正向傳遞資料和反向漸變。這是乙個四維陣列,其四個維度被稱為:
n或batch_size
通道高度
寬度這與我們有關,因為在把它儲存到lmdb之前我們必須按照結構塑造我們的案例——從它被送到caffe的地方。影象的形狀是直觀的,一批次64個按規定的100×200 rgb畫素的影象將最終作為形陣列(64,3,200,100)。對於一批64個特徵向量,每個長度93的blob的形狀為(64,93,1,1)。
在將資料載入到lmdb時,你可以看到個別案例或特徵向量儲存在datum的物件上。整型資料被儲存在(位元組串格式)data中,浮點型資料儲存在float_data中。一開始我犯錯將浮點型資料分配到data中,從而導致該模型不學習任何東西。在將datum儲存到lmdb之前,你需要將物件序列化成乙個位元組的字串表示。
總結
對我來說,掌握caffe是乙個令人驚訝的非線性體驗。也就是說,要深刻理解這個系統,還沒有任何的切入點和持續的學習路徑。讓caffe對你發揮作用的有效資訊,分布在很多不同的教程,github上的源**,
ipython notebook以及論壇主題。這就是為什麼我花時間撰寫本教程及相關的**。在我將學到的知識總結形成文字之後,我自己都要從頭讀一下。
我認為caffe有乙個光明的未來——只要新增新的功能,它將不僅僅是水平的增長,而且會垂直的重構和改善所有使用者的體驗。這絕對是高效能深度學習的好工具。如果你想要做影象處理和卷積神經網路,我建議你看看nvidia digits,它會為你提供乙個舒適的gui來實現目標。
csdn.net(#換成@)
caffe和tensorflow對GPU的使用
方法一 在solver檔案中寫入 solver mode cpu or gpu solver mode gpu方法二 命令列引數 gpu train build tools caffe train solver examples mnist lenet solver.prototxt gpu 0 t...
Tensorflow利用GPU訓練注意事項
訓練前要用nvidia smi來檢視一下當前gpu的使用情況,不要一下子就放上去跑把大家一起擠掛了,這是負責任的行為。之前在公司就遇到過訓練了好久,結果乙個新來的就把伺服器擠跪了。如果機器上面的gpu之間不能夠通訊,那就先設定一塊要用的gpu吧,在終端上面輸入命令export cuda visibl...
利用GPU訓練時的常見錯誤
1.cuda vidible devices 4,5 python3 main.py 我想在集群條件下利用4,5號gpu,由於模型較小,並不清楚是都可以指定4,5號gpu 記憶體占用情況看不出來。後續會找找其他驗證辦法 報了如下幾個錯誤 all tensors must be on devices ...