【蜂口 | AI人工智慧】caffe模型訓練——龍鵬的一站式caffe工程實踐連載(七)

絵飛的魚發表於2018-09-26

知識引入

這一次我將給大家帶來模型訓練相關的分享。本次的分享將包含以下的內容:首先,我們將闡述我們的訓練介面, Caffe 這個平臺它可以有C ++, python,Matlab等訓練介面,最常使用的是C ++ 介面。我們將基於C ++ 的環境來講述如何進行訓練。第二部分是訓練細節,在這一部分中我將給大家講述一下網路的配置以及使用遷移方法來進行訓練,同時也會講述訓練相關的一些引數的配置。第三部分是訓練結果分析,我們會對訓練的結果進行一些視覺化的分析。第四部分是做一個簡短的總結。因為我們在訓練的過程中有可能出現各種各樣的問題,導致不能正常的訓練,我們會對一些常見的問題進行一個比較完整的總結。                 

訓練前準備               

在訓練正式開始之前,我們需要準備好兩個檔案:

train.proto 檔案,網路配置檔案,配置網路資訊。

solver.proto 檔案,訓練引數的配置檔案。

train.proto  檔案

關於網路配置檔案,因為檔案非常的長,我們就不看整個的檔案。我們重點看一下網路的資料層:

type :這是一個影像分割的任務,所以選擇是ImageSegData的輸入,在我們前面如何定義一個新的分割資料層中已經詳細地進行了闡述。它包含兩個網路引數配置檔案,首先是Image_Data_param,它包含變數:

source :就是我們訓練檔案的路徑,其中每一行儲存在我們的圖片以及內部的路徑。

batchsize :這就是我們的批處理的大小。它的的設定通常跟我們的視訊記憶體的大小有關係。

shuffle :是用於控制是否對我們的訓練檔案進行一個隨機的打亂操作,

tranform_param :這個引數通常用於做一些資料增強相關的操作。

mean_value :也就是GB的均值。

crop_size 就是我們網路的最終的輸入的大小。

mirror :設定是否使用映象

在這裡我們可以看到,我們只做了solver以及train這兩個資料的基本操作,其他的一些資料測量操作我們沒有做。前面我們已經給大家介紹瞭如何定義更多的資料,增強操作的方法。

solver.proto 檔案

base_lr 這是我們的基礎學習率,10的-4次方,這是一個比較小的學習率。因為我們採用的是千億學習的方法,這是一個比較合適的學習率。學習率的設定,需要經過不斷的嘗試。

type 就是我們的最佳化方法,我們採用的是Adam

lr_prlicy 引數配置的是fixed

solver_mode 我們採用的 GPU 來進行訓練。

知識小結

網路的輸入尺度:160×160,stride=32,也就是說到了最後一層feature map,它的大小是160÷32,也就是5×5這樣的一個輸入尺度,然後我們基於5×5這樣的一個尺度,不斷地恢復我們影像的大小,直到恢復出100乘以10的這樣一個影像分割結果。

我們採用Adam方法,它相比其它來說,會更加的智慧和簡單。更多的模型,相關的細節,可以參考百度雲的連結:

連結地址

我們會將我模型配置以及訓練的結果都提供給大家。    

模型訓練                    

caffe有C++,Matlab,python這三個訓練介面,其中C++的介面是使用最為方便最為簡單的,它實現了資料和訓練的分離。 

訓練命令:

SOLVER=./mobilenet_solver.prototxt                

WEIGHTS=./mobilenet.caffemodel              

caffe/build/tools/caffe train -solver $SOLVER -weights $WEIGHTS -gpu 0 2>&1 | tee log.txt                

由於我們只有一個GPU,所以我們GPU ID 是0,假如我們有多個GPU,我們可以以逗號進行分隔。比如我們有兩個GPU,那麼我們可以設定為0,1。

注意養成習慣,將我們訓練的所有的資訊都儲存到log檔案裡面去,後面我們需要對這個log檔案進行一些分析。

遷移學習

將一個任務訓練好的引數,用於另一個新的任務的引數初始化。

細心的朋友應該有看到的,我們上面在進行訓練的過程中,我們不止指定了-solver這樣的一個選項,我們還指定了-weights這樣的一個選項。假如我們不指定-weights的一個選項,那麼就是網路從頭開始訓練。現在我們指定了-weights選項,也就是說我們的網路的初始化是從另外一個model,也就是上面指定的mobilenet的Caffe model中進行提取的,這就是牽引學習。遷移學習可以大大的提高網路的壽命速度。     

訓練結果分析                    

為了方便我們使用視覺化的方法來進行分析,我分別畫出了acc和loss曲線。

可以看到,我們總的迭代次數是3萬次,大概在2萬字左右,網路就已經得到了非常穩定的結果。我們的acc大概達到了95%的水平。

這裡我們只畫出了訓練的曲線,沒有畫出測試的曲線。因為對於我們這樣的一個任務來說,它不太可能。他不太會過擬合,所以我們沒有畫出測試的曲線。實際大家在實踐的過程中可以去將測試的曲線同時畫出來,幫助我們對訓練進行一些總結。              

訓練常見問題                      

一、學習率不合適。假如我們的學習率非常非常大,那很有可能網路在學習的過程中就會震盪非常厲害。假如我們的學習率非常小,那麼很有可能網路迭代的過程非常非常慢, 就是它在梯度的更新過程中非常慢,這也會體現為不收斂。

二、資料不好。根據實際經驗,這個原因會更加的頻繁,很多的時候我們準備的資料其實並不一定適合我們的任務。

就我們這個專案而言,我們選擇了將嘴唇這個區域分割出來,然後基於這樣的一些資料做訓練,這樣可以大大減少背景的干擾。假如我們不這樣做,我們直接使用人臉的影像來進行訓練的話,那麼很有可能我們就會遇到不收斂的問題。因為背景的干擾太大,任務的學習過於困難,所以如果大家遇到不收斂的問題,建議首先檢視是不是資料不太合適。

三、模型有誤。這也是極有可能發生的,尤其是對於初學者來說,我們設定的輸入網路大小非常非常小或者非常非常大,這些都需要去進行總結。

如何防止過擬合?

過擬合就是說我們訓練出來的模型在訓練集上表現得非常好,但是當我們將其用到測試集的時候,他的表現就非常的差。過擬合發生的主要原因有兩個:

原因一:資料太少。尤其是對於分類任務,只學習到了一小部分資料的分佈,學習得非常的完美。當它應用到更多的資料的時候,它就表現得非常的差。深度學習的發展,在很大的程度上都是歸於資料集的發展。所以我們一定要準備足夠多的資料來進行我們的網路的訓練。

原因二:模型太小。可能跟有些人的認知相反,認為模型太大,會比較容易過擬合,實際上並不是如此。非常大的模型,其實有很多的引數是冗餘的。太小的模型,它的引數非常少,這樣它的每一個引數就會顯得非常的關鍵。假如這個時候我們的資料又比較少的話,那麼它每一個引數群體和我們的資料分佈,都起到了非常關鍵的作用。等我們使用新的資料集來對這個模型進行測試的時候,由於它的引數的魯棒性不強,就會受到干擾。

案例:

圖1展示的是跟學習率有關的一個引數。當我們使用了一個比較高不是最合適的學習率,那很有可能網路收斂得比較快,也就是綠色的曲線,但是它收斂到的不是我們需要的理想狀態。當我們的學習率非常小,也就是圖中的藍色曲線,它的收斂過程就變得非常的慢。理想的情況是圖中的紅色曲線。 關於學習率其實並沒有理論上的指導,大家只能在實踐專案中更多的嘗試

圖2展示了一個模型在收斂過程中震盪的過程。因為模型是透過八級賽事迭代,假如圖片數量取得太少的,就會導致模型在引數迭代的過程中方向不斷地發生改變。 如果我們的硬體配置允許的話,我們應該儘可能地使用一個比較大的batchsize。 一些學術研究使用到了上萬數量級的batchsize,但對於我們這樣的移動端小模型來說,使用一兩百這樣的batchsize肯定是沒有問題的。

圖3展示的就是過擬合現象。其中紅色是訓練集曲線,綠色是測試集曲線,訓練集和測試集的表現差別很大。它的原因可能是資料太少,或者模型太小。所以我們要解決這個問題的話也有兩種思路:

第一,我們可以增加我們的資料,我們可以增加資料,資料越多,就會越擬合真實的分佈,這樣,這個模型過濾的可能性就越低。

第二,給模型增加正則化引數,增強它的魯棒性。

訓練結果下載:

完整內容及影片解讀,請V信搜尋關注蜂口小程式~?

參與內測,免費獲取蜂口所有內容,更有其他優惠福利多多,,若想獲得內測種子使用者資格,歡迎V信fengkou-IT勾搭,歡迎大家多多參與,盡情挑刺,凡是好的建議,我們都會虛心採納噠

蜂口小程式將持續為你帶來最新技術的落地方法,歡迎隨時關注瞭解~




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31553577/viewspace-2214955/,如需轉載,請註明出處,否則將追究法律責任。

相關文章