實際上,很少有人從頭開始訓練整個卷積網路(使用隨機初始化),因為擁有足夠大小資料集的情況相對較少。相反,通常是在乙個非常大的資料集(例如imagenet
,它包含120
萬幅影象,1000
個類別)上預訓練卷積神經網路,然後使用卷積神經網路作為初始化或固定的特徵提取器來完成感興趣的任務。
遷移學習主要有兩種常見的實現方法:特徵提取和引數微調。
拿乙個在imagenet
上預先訓練好的卷積神經網路,凍結除全連線層外的所有層的引數,修改全連線層的輸出後僅訓練全連線層。怎麼修改全連線層的輸出?在imagenet
上訓練的模型的全連線層的輸出是1000
個類的分數,因為imagenet
要分1000
類。假如你要訓練的是手寫數字也就是mnist
資料集,那麼將這個輸出改為10
就行了,因為0~9
不就是10
類嘛。
使用預訓練模型的引數來初始化我們的網路模型,修改全連線層後再繼續反向傳播來微調預訓練模型的權值。可以對預訓練模型的所有層進行微調,也可以保持一些較早的層的固定(由於過度擬合的問題),只對網路的一些較高階別的部分進行微調。研究表明,預訓練模型前面的層中包含更通用的特徵,對很多任務都適用,越往後的層就越反映原始資料集中各類的細節資訊。
上面講了兩種常用的遷移學習的方法,當我們訓練乙個新的資料集的時候具體應該選擇哪一種?這受若干個因素的影響,但影響最大的主要是新資料集的尺寸(大還是小),以及它與原始資料集(預訓練模型所使用的資料集)的相似度,下面是一些可以在這四個主要場景中應用的經驗:
資料集大小
和預訓練模型使用資料集的相似度
一般選擇小高
特徵提取大高
引數微調小低
特徵提取+svm大低
從頭訓練或引數微調(推薦)
遷移學習一般不建議選擇太大的學習率(learning rate
),1e-4
或1e-5
或許是乙個不錯的選擇。既然我們選擇了遷移學習,使用了預訓練模型,那麼我們就應該認為該預訓練模型的權重是比較好的,所以不應該太快或太大的調節它們,而是微調。當然你也可以設定乙個學習率調節器,讓學習率根據訓練的輪數(epoch
)調節,比如每5
輪訓練後學習率就降低0.1
個乘法因子。學習率的自動調節在機器學習框架pytorch
和tensorflow
中都有對應的實現。
SVN實際應用中需要注意的問題
一 提交之前先更新 1.svn更新的原則是要隨時更新,隨時提交。當完成了乙個小功能,能夠通過編譯並且自己測試之後,謹慎地提交。2.如果在修改的期間別人也更改了svn的對應檔案,那麼commit就可能會失敗。如果別人和自己更改的是同乙個檔案,那麼update時會自動進行合併,如果修改的是同一行,那麼合...
DSP程式在FLASH中執行時需要注意什麼問題?
這幾天在除錯tms320f2806x系列時,遇到以下問題 程式燒錄到flash中帶 器執行沒有問題,當拔掉 器執行時,全域性變數和靜態變數變得不對,區域性變數卻是正確的。通過上網搜查,感覺應該是.cmd檔案的位址段分配有問題,後來發現是.const cinit段沒有分配到flash上的原因。以後遇此...
Randomize在迴圈中應用需要注意的
需要迴圈插入表tb1中若干條記錄其中id欄位為主鍵,想用random生成的隨機數來。寫語句如下 with query1 do for i 0 to n do begin close sql.clear sql.add randomize parameters.parambyname id value...