使用ConvNet的實用建議
如何使用目前學到的機器學習演算法的實用建議。
如何使用開源?
事實證明,很多的神經網路系統都很難復現,因為很多調整超引數的細節,例如衰減率還有其他的一些細節都會給最終效果帶來影響。
幸運的是,很多深度學習的研究人員都會習慣性的把它們的成果放到網上,比如GitHub,同時對於你的成果,我當然也鼓勵你考慮將你的程式碼貢獻給開源社群。
所以看到論文時,想實現,先去開源社群找一找,節省時間。
如何使用GitHub?
首先google搜尋關鍵詞(殘差網路),找到GitHub可以看到很多程式碼實現的描述,這個程式碼是根據MIT開源許可程式碼協議開發的,可以通過點選快速瀏覽,也可以下載程式碼。
複製程式碼連結,在Python中輸入git clone + 網址,就可以下載。
現在你已經開始開發一個計算機視覺影象應用,在這個過程中最常見的流程就是從選取一個你喜歡的框架開始,然後去找一個開源的程式碼實現。
這樣做的好處是:
這些網路可能需要很長的時間訓練,也許有人已經用多個GPU和大資料集訓練好了,這樣你就可以直接對這些網路使用遷移學習。
當然,如果你是一個計算機視覺的研究者,你可能需要從頭構建這個神經網路框架,這樣的話工作流程就會不同。
當然如果你從頭構建,別忘記開源分享你的程式碼。。。
第二課:遷移學習
如果你想實現一個計算機視覺應用,而不像從零開始訓練權重,比方說,從隨機初始化開始訓練,實現更快的方式通常是下載已經訓練好權重的網路結構,把這個作為預訓練,遷移到你感興趣的任務中。
計算機視覺的研究社群已經很擅長把許多資料庫釋出到網路上,比如ImageNet MSCOCO,PASCAL等資料庫,這些是已經公開線上的不同資料庫。
許多計算機視覺的研究者已經在上面訓練了自己的演算法,有時,演算法訓練需要耗費好幾周的時間,佔據許多的GPU,事實上已經有很多人做過這種訓練,也經歷了這種痛苦的高效能除錯過程,這意味著你可以下載這些開源的權重,有人曾花數週,或數月來除錯這些權重可以用來作為你自己的神經網路好的初始化的開端,且可以用遷移學習來遷移知識。
從這些大型公共資料庫遷移知識到你自己的問題上。
如何實現遷移學習?

比如你要建立一個可識別自己寵物貓的貓臉檢測器:
因為你沒有足夠多的識別Tigger和Misty的圖片,這樣你的訓練集很小,這時你可以從網路上下載一些開源應用:
不但下載原始碼,還要下載相關權重。你可以下載許多已經訓練好的網路,例如在1000類物體的ImageNet資料庫上訓練,因此該網路可以輸出千分之一類別概率的softmax神經元。
你要做的是去除softmax層,然後創造自己softmax層來識別Tigger/Misty/其他。
從網路方面看,我建議你考慮凍結前面這些層,即凍結該網路前面所有層的相應引數。因此可以只訓練與你自己softmax層有關的引數,即只輸出三個類別。通過用別人訓練好的權重,即使在很小的資料庫中也可以得到很好的效能。
幸運的是,對於很多深度學習框架支援這樣的做法。事實上,根據框架結構,你可以把前面某些層這樣設定(可訓練引數等於零)。另一種說法是:不要訓練這些權重,或有時你可以用一個引數,比如freeze = 1來設定網路,這些不同的方法和不同的深度學習框架可以讓你來確定是否訓練與某些具體層相關的權重。
另一個應用中比較巧妙地是:
由於前面的層全部被凍結了,之前有些固定函式不會變,因為你現在也不改動它,也不訓練它,所以網路接受輸入影象X,並把X對映到該層的啟用函式上,因此這個方法可以加快訓練,因為我們剛預計算過該層,而該層重啟用產生的特徵就直接儲存在硬碟中。
你所做的就是用這個固定的函式,在該神經網路的前半部分,接受任一輸入影象X,然後計算其特徵向量,然後依據這個特徵向量訓練一個淺層的softmax模型去預測。因此預計算之前層的啟用結果是有利於你計算的操作,(預計算)訓練集所有樣本(啟用結果)並存在硬碟上,然後訓練左邊的softmax類別。
這樣做的好處是:
預計算的好處是你不需要在訓練集上每次迭代,都重新計算這些啟用結果。
所以,如果你的訓練集比較小,以上就是你可以做的工作。
如果你的訓練集夠大,一個經驗之談就是:
如果你有更大的帶標籤的資料集,比如有很多Tigger和Misty的照片,你可以凍結更少的層數,然後訓練後面這些層,儘管輸出層的類別與你需要的不同。
有幾種這樣做的方法:
你可以用最後幾層的權重,作為初始化開始做梯度下降訓練。
你也可以去掉最後幾層,然後用自己的新神經元和最終softmax輸出訓練。
這兩種方法都值得嘗試。但有個模式,你的資料越多,所凍結的層數可以越少,自己訓練的層數可以越多。
其中的想法就是如果你選了個數據集,有足夠的資料,不僅可以訓練單層softmax,還可以訓練由所採用網路的最後幾層組成的中型網路。
其次,如果你有很多資料,你可以用該開源網路和權重,用全部演算法初始化整個網路,然後訓練,你有越多的帶標籤的資料,你可以訓練的層數就越多。極端就是你可以用下載的權重作為初始化,因此這些權重可以代替隨機初始化,然後做梯度下降訓練,來更新所有權重和網路層。
總結:
這就是卷積神經網路訓練中的遷移學習,實際上因為網上公開資料庫非常大,你下載的權重也是別人從大量資料上花費數週訓練而來的,你會發現對於很多計算機視覺應用來說,如果你下載別人的開源的權重來初始化自己的問題,你可以做的更好。
我認為計算機視覺是其中一個遷移學習可以一直應用的領域,除非你有特別大的資料集從零來訓練自己的網路。而遷移學習值得認真考慮除非你的確擁有海量的資料和計算資源來自己從零開始。
第三課:資料增強
大多數計算機視覺需要用到很多資料,因此資料增強是其中一種常用的技術用於改善計算機視覺系統的效能。
計算機視覺很麻煩,因為你要把所有的畫素輸入到計算機中,貌似你需要訓練出一個相當複雜的函式來做這件事。事實上,更多的資料對於幾乎所有的計算機視覺工作都有好處。
我認為計算機視覺,對於絕大多數問題,我們總是不能獲得足夠的資料。那麼這就意味著,當你在訓練計算機視覺模型時,資料增強往往會有所幫助。
無論你是用遷移學習即用其他人預先訓練好的模型來開頭,還是試著從零開始訓練自己的模型。
常見的計算機視覺中的資料增強方法:

最簡單的資料增強方式:垂直映象
並不完美的資料增強方式:隨機裁剪,獲得了不同的示例來擴充訓練集
旋轉
剪下
區域性彎曲
...
第二類常用的資料增強的方法:色彩變化

RGB通道加入擾動
色彩變化
...
使得你的學習演算法在應對影象色彩變化時健壯性更好。
腳註:有不同的方式來取樣紅藍綠通道
其中一種色彩干擾的演算法:PCA主成分分析/PCA色彩增強
如果你的影象主要呈紫色,即主要是紅色和藍色,帶一點點綠色,那麼PCA色彩增強,會增加和減少很多紅色和藍色的值,卻對綠色值做很小的更改,因此來保持整體和之前相同的著色。
演算法細節在AlexNet的論文中有描述!也可以找一些PCA色彩增強的開原始碼!

你也許想將訓練樣本存在硬碟上,但是如果是一個非常大的訓練集合,這是一個非常常見的情況,這裡你也許會有一個CPU程序,不斷地從硬碟中載入影象,你能做的就是用一個CPU程序來實現失真,可以是隨機裁剪,或色彩變化,或映象,對每個影象你就可以獲得一些它的失真版本。
這裡你的CPU執行緒不斷地載入資料並作一些必要的失真處理,來行程一批或幾小批資料,這些資料會不斷地傳給其他執行緒或程序,來實現訓練學習,這些可以在CPU或GPU上實現,如果訓練一個大的神經網路,後者越來越多的被用到。

因此,一個常用的資料增強的方法是:
通過一個執行緒,幾乎是四個執行緒,用來載入資料並作失真處理,然後傳遞給其他執行緒或程序用來做深度學習訓練,通常這兩步可以並行。
以上,就是資料增強。
資料增強也有一些超引數:
例如要實現多大程度的色彩變化和具體用什麼形式來做隨機裁剪?
同計算機視覺其他部分一樣,找到一個其他人用於資料增強的開源演算法,也是一個很好的開始。
第四課:計算機視覺現狀
對於深度學習在計算機視覺中的應用及現狀有幾個獨特的方面,幫助你閱讀以及如何搭建用於計算機視覺的系統?

大多數機器學習問題就是:
從擁有相對較少的資料————到擁有大量資料之間的問題。
如果縱觀機器學習問題的發展,你會發現一般情況下,當你有很多資料的時候,你會發現差不多使用比較簡單的演算法,以及更少的人工設計就可以了。
即不太需要針對問題來仔細的設計特徵
當你有大量資料的時候,你可以用一個巨大的神經網路,甚至更為簡單的結構,就讓一個神經網路學習我們想要學習的。
當你沒有很多資料時,通常會發現人們更多的人工設計,即更多的手工處理,人工設計實際上是當你沒有很多資料量時獲得良好效果的最好方法。
通常機器學習演算法有兩個知識來源:
1.標記的資料,用於監督學習的(x,y)
2.人工設計,而且有很多方法可以用來手工設計一個系統,它可以精心的設計特性,到精心設計網路結構,抑或系統的其他元件。
所以當你沒有太多的標記好的資料時,就需要在人工設計上下功夫。
我認為計算機視覺正試圖學習一個非常複雜的函式,我們經常覺得沒有足夠的用於計算機視覺的資料,這就是為什麼計算機視覺還非常依賴與人工設計。
所以在計算機視覺領域開發了相當複雜的網路結構,因為在沒有足夠的資料量的情況下,獲得良好效能的途徑就是花更多時間去精心設計。
但從歷史的角度看,我認為對於計算機視覺使用非常小的資料集的擔憂以及一直以來計算機視覺文獻依賴於大量人工設計的擔憂,即使最近幾年 ,資料的量級伴隨著正確的計算機視覺任務也有了顯著地增加,這已經導致了一直以來做的人工設計的數量有了明顯的減少。但仍然有很多網路結構和計算機視覺方面的人工設計,這就是為什麼仍能在計算機視覺領域,看到相比與其他領域非常複雜的演算法。
實際上,你通常有比影象識別資料更小的目標檢測資料集,當談及目標檢測時,你會看到演算法變得更復雜,並具有更為特定化的元件。
所幸的是,當只有少量資料時,遷移學習可以有很大的幫助,例如對於家貓的識別,這些都不是檢測問題,你只有非常小的資料,遷移學習也會工作的不錯。這是另外一種技術,被廣泛使用於資料量很少的情況下。
對於計算機視覺的研究者而言,如果你在基準資料上做的很好,就很容易發表文章,所以很多人關注在基準資料上取得好的結果。
這樣做的好處是:
它幫助整個學科領域搞清楚哪些是最有效的演算法,但是你也看到,文章中的一些工作只是為了讓你在基準資料上取得好結果。但是這個演算法並不會真的應用於你現實中要釋出的產品或者系統上。因此在這,我有一些對在基準資料上做的好的一些小建議:
如果我要把一個系統放到實際服務客戶的產品中:

1.整合。在弄清楚了你要用什麼神經網路,獨立的訓練多個神經網路,然後對它們的輸出求平均作出結果,要對它們的輸出y帽求平均,不要對權重求平均。
但是因為整合意味著要在每幅影象上進行測試,或許需要將一副影象輸入到3到15個神經網路,這樣會減慢執行速度,所以整合是人們在基準資料上測試獲得好成績的小貼士之一。
2.測試時使用多重剪下
多重剪下其實就是在你的測試影象上,應用影象增強的一種形式,這也許能為一個產品化的系統帶來些許效能上的提升。
相比於整合,它不會吞噬太多記憶體,但它仍然很大程度上降低執行速度。

3.一個神經網路系統在某個視覺問題上效果很好,通常驚人的是它們大多在另外的視覺問題上也能用。
因此,要搭建一個有用的系統,你一般要做的是從別人的神經網路架構開始,而且如果可能,開源實現。
4.先使用別人預先訓練的模型,然後在你的資料集上進行微調,你通常可以在你的應用上很快取得進展。