最早訓練神經網路的時候完全什麼技巧都不懂,能成功執行開源**,並且看到loss下降就放心跑著了。隨著對網路越來越多的接觸,發現從資料集(train/val/test)的準備到訓練超引數(例如args或者config檔案)的設定都逐漸會根據經驗去進行設計了。從來沒有細細梳理過每乙個訓練小trick和其背後的依據,因此以邊梳理邊學習的態度,根據個人和**上大家的總結對深度網路的訓練進行了整理。
3. 總結
超引數及其他網路設定
魯棒性和泛化能力。訓練**現過擬合或者欠擬合現象會導致模型的泛化能力降低,因此還需要測試集來評估泛化能力。一般在實際應用時,測試集用來考核我們的模型最終是否能達到指標,通常會被給定,並且在監督訓練中有時不提供ground truth/label。
為了在我們自己的實驗中達到評估模型的目的,我們會專門在所有訓練資料集中選出和測試集功能一樣的驗證集。驗證集的挑選原則(1)應該盡可能與訓練集互斥, 即樣本盡量不在訓練集**現、未在訓練過程中使用過;(2)要盡可能與訓練集保持資料分布的一致性,例如在分類任務中至少要保持樣本的類別比例相似。那麼如何在乙個未分配的資料集上劃分訓練集和驗證集呢?
很顯然,訓練集樣本數量需要佔較大的比例,才能使得訓練結果在該資料集上具有代表性,但可能會造成驗證集上的評估結果不準確。在周志華教授的《機器學習》中給出了三種方法:
如果要考慮訓練集、驗證集和測試集三者的比例,一般資料集在萬的數量級時,採用6:2:2;而對於百萬級的資料量時,常見的比例可以達到98:1:1。
總結:
基本上大部分公開資料集都是已經分配好了的,總結過程中我發現,在我之前針對遙感影象資料集的實驗中,只隨機劃分了一次訓練集和驗證集,沒有進行多次實驗取平均值來評估模型,原因主要是多次訓練模型較為費時,進而在分配資料集時需要根據資料分布考慮更多的因素。還有一點之前沒有注意到的是,我們訓練集只用了部分資料,找到最佳模型後應該再用所有資料再訓練一次,當然主要是針對訓練集+驗證集的所有資料,只不過訓練之後沒有辦法再自己評估模型精度了。
資料預處理的前提是我們已經做過資料的分析,而一般在拿到乙個任務時,資料分析會占用前期很大一部分的時間。資料預處理要解決的就是在分析原始資料時出現的問題,比如質量問題(存在髒資料)和資料特徵(存在不平衡)。由於我接觸的主要是計算機視覺方面的學習任務,所以預設對資料的操作也都以為主。
可以把問題根據難度從小到大排個序:大資料+分布均衡 < 大資料+分布不均衡 < 小資料+資料均衡 < 小資料+資料不均衡。下面我把解決方法主要分為了三個方面:
實際中常用的是前兩種方法,並且第三種方法其實會損失一些資料資訊。我經常遇到的一些實驗資料收集的成本較高,因此樣本數量整體偏小,可能都不到萬級。所以資料增強成為我進行預處理的乙個常用方法,主要包括:翻轉(flip)、旋轉(rotate)、平移(translate)、縮放(scale)、隨機裁剪或補零(random crop or pad)、色彩抖動(color jittering)、加雜訊(noise)等。利用loss進行平衡也是訓練常用的trick,常見的有weighted cross-entropy、ohem、focal loss。常見的影象處理的python庫:opencv、pil、matplotlib、tensorflow等。
(1)資料歸一化:將資料統一對映到[0,1]區間上。好處是提公升模型的收斂速度,防止模型梯度**。常用的方法是最值歸一化和均值方差歸一化,比如對影象的畫素值除以255,或者除以172.5再減1。
(2)隨機打亂:使資料載入的順序不對網路訓練造成影響。好處是增加隨機性,避免有規律的資料在訓練中走偏或陷入區域性最優使得訓練效果出現差異,提高網路的泛化效能。
(3)輸入尺寸:在資料集大小不統一的情況下或者網路輸入尺寸有要求時,需要對進行resize或者crop到相應尺寸。resize的時候需要注意的形變可能導致特徵的改變,根據不同的任務和資料情況crop的策略也有所不同,暫不討論。
上述內容基本上是我在訓練模型時常對資料的一些處理,可能會有其他細節的遺漏。總的來說,具體資料的處理還要按照資料集的特點進行,有時還會存在不同格式資料之間的轉化。比如,影象分割結果可以將對應畫素點的類別值存為,也可以按照polygon的形式存為json檔案,那麼在資料遷移到不同網路訓練時就會首先轉換合適的格式。
adaboost訓練之經驗總結
利用adaboost訓練的分類器做了幾個專案 當然在實際應用過程中,我對adaboos的原始碼做了優化和改善,同時我也用了深度學習 caffe做了類似的工作,綜合權衡演算法檢測率 演算法效率,在專案中採用的還是adaboost,後期我會花大量時間對caffe改進 優化 以下純為訓練前要注意的事項。0...
RNN模型訓練經驗總結
搭建模型 forward propagation設定 back propagation設定 避免出現nan的幾個方法 利用好過擬合。其他經驗 技巧集錦 訓練神經網路前,別管 先從預處理資料集開始。一定要認認真真先去了解資料的分布並找出其中的規律。在檢查資料的過程中,可能會發現重複的 標記錯誤的樣本,...
Git深度使用經驗總結
日期 2013 10 27 字型 大中小 已經開始使用git了,有些時候一般的問題只能google就能找到答案,但是有些時候不能找到答案,因為遇到的問題都不知道該用什麼關鍵字搜尋。很多是在git中文的qq群中討論出來的,把一些經驗總結一下 1.git子模組 快速上手 git submodule ad...