如何使用目前學(xué)到的機(jī)器學(xué)習(xí)算法的實(shí)用建議幻锁。
如何使用開(kāi)源敞映?
事實(shí)證明,很多的神經(jīng)網(wǎng)絡(luò)系統(tǒng)都很難復(fù)現(xiàn)糕珊,因?yàn)楹芏嗾{(diào)整超參數(shù)的細(xì)節(jié)动分,例如衰減率還有其他的一些細(xì)節(jié)都會(huì)給最終效果帶來(lái)影響。
幸運(yùn)的是红选,很多深度學(xué)習(xí)的研究人員都會(huì)習(xí)慣性的把它們的成果放到網(wǎng)上澜公,比如GitHub,同時(shí)對(duì)于你的成果喇肋,我當(dāng)然也鼓勵(lì)你考慮將你的代碼貢獻(xiàn)給開(kāi)源社區(qū)坟乾。
所以看到論文時(shí),想實(shí)現(xiàn)蝶防,先去開(kāi)源社區(qū)找一找甚侣,節(jié)省時(shí)間。
如何使用GitHub慧脱?
首先google搜索關(guān)鍵詞(殘差網(wǎng)絡(luò))渺绒,找到GitHub可以看到很多代碼實(shí)現(xiàn)的描述,這個(gè)代碼是根據(jù)MIT開(kāi)源許可代碼協(xié)議開(kāi)發(fā)的菱鸥,可以通過(guò)點(diǎn)擊快速瀏覽宗兼,也可以下載代碼。
復(fù)制代碼鏈接氮采,在Python中輸入git clone + 網(wǎng)址殷绍,就可以下載。
現(xiàn)在你已經(jīng)開(kāi)始開(kāi)發(fā)一個(gè)計(jì)算機(jī)視覺(jué)圖像應(yīng)用鹊漠,在這個(gè)過(guò)程中最常見(jiàn)的流程就是從選取一個(gè)你喜歡的框架開(kāi)始主到,然后去找一個(gè)開(kāi)源的代碼實(shí)現(xiàn)。
這樣做的好處是:
這些網(wǎng)絡(luò)可能需要很長(zhǎng)的時(shí)間訓(xùn)練躯概,也許有人已經(jīng)用多個(gè)GPU和大數(shù)據(jù)集訓(xùn)練好了登钥,這樣你就可以直接對(duì)這些網(wǎng)絡(luò)使用遷移學(xué)習(xí)。
當(dāng)然娶靡,如果你是一個(gè)計(jì)算機(jī)視覺(jué)的研究者牧牢,你可能需要從頭構(gòu)建這個(gè)神經(jīng)網(wǎng)絡(luò)框架,這樣的話工作流程就會(huì)不同。
當(dāng)然如果你從頭構(gòu)建塔鳍,別忘記開(kāi)源分享你的代碼伯铣。。轮纫。
第二課:遷移學(xué)習(xí)
如果你想實(shí)現(xiàn)一個(gè)計(jì)算機(jī)視覺(jué)應(yīng)用腔寡,而不像從零開(kāi)始訓(xùn)練權(quán)重,比方說(shuō)掌唾,從隨機(jī)初始化開(kāi)始訓(xùn)練放前,實(shí)現(xiàn)更快的方式通常是下載已經(jīng)訓(xùn)練好權(quán)重的網(wǎng)絡(luò)結(jié)構(gòu),把這個(gè)作為預(yù)訓(xùn)練糯彬,遷移到你感興趣的任務(wù)中犀斋。
計(jì)算機(jī)視覺(jué)的研究社區(qū)已經(jīng)很擅長(zhǎng)把許多數(shù)據(jù)庫(kù)發(fā)布到網(wǎng)絡(luò)上,比如ImageNet MSCOCO情连,PASCAL等數(shù)據(jù)庫(kù),這些是已經(jīng)公開(kāi)在線的不同數(shù)據(jù)庫(kù)览效。
許多計(jì)算機(jī)視覺(jué)的研究者已經(jīng)在上面訓(xùn)練了自己的算法却舀,有時(shí),算法訓(xùn)練需要耗費(fèi)好幾周的時(shí)間锤灿,占據(jù)許多的GPU挽拔,事實(shí)上已經(jīng)有很多人做過(guò)這種訓(xùn)練,也經(jīng)歷了這種痛苦的高性能調(diào)試過(guò)程但校,這意味著你可以下載這些開(kāi)源的權(quán)重螃诅,有人曾花數(shù)周,或數(shù)月來(lái)調(diào)試這些權(quán)重可以用來(lái)作為你自己的神經(jīng)網(wǎng)絡(luò)好的初始化的開(kāi)端状囱,且可以用遷移學(xué)習(xí)來(lái)遷移知識(shí)术裸。
從這些大型公共數(shù)據(jù)庫(kù)遷移知識(shí)到你自己的問(wèn)題上。
如何實(shí)現(xiàn)遷移學(xué)習(xí)亭枷?
比如你要建立一個(gè)可識(shí)別自己寵物貓的貓臉檢測(cè)器:
因?yàn)槟銢](méi)有足夠多的識(shí)別Tigger和Misty的圖片袭艺,這樣你的訓(xùn)練集很小,這時(shí)你可以從網(wǎng)絡(luò)上下載一些開(kāi)源應(yīng)用:
不但下載源碼叨粘,還要下載相關(guān)權(quán)重猾编。你可以下載許多已經(jīng)訓(xùn)練好的網(wǎng)絡(luò),例如在1000類物體的ImageNet數(shù)據(jù)庫(kù)上訓(xùn)練升敲,因此該網(wǎng)絡(luò)可以輸出千分之一類別概率的softmax神經(jīng)元答倡。
你要做的是去除softmax層,然后創(chuàng)造自己softmax層來(lái)識(shí)別Tigger/Misty/其他驴党。
從網(wǎng)絡(luò)方面看瘪撇,我建議你考慮凍結(jié)前面這些層,即凍結(jié)該網(wǎng)絡(luò)前面所有層的相應(yīng)參數(shù)。因此可以只訓(xùn)練與你自己softmax層有關(guān)的參數(shù)设江,即只輸出三個(gè)類別锦茁。通過(guò)用別人訓(xùn)練好的權(quán)重,即使在很小的數(shù)據(jù)庫(kù)中也可以得到很好的性能叉存。
幸運(yùn)的是码俩,對(duì)于很多深度學(xué)習(xí)框架支持這樣的做法。事實(shí)上歼捏,根據(jù)框架結(jié)構(gòu)稿存,你可以把前面某些層這樣設(shè)置(可訓(xùn)練參數(shù)等于零)。另一種說(shuō)法是:不要訓(xùn)練這些權(quán)重瞳秽,或有時(shí)你可以用一個(gè)參數(shù)瓣履,比如freeze = 1來(lái)設(shè)置網(wǎng)絡(luò),這些不同的方法和不同的深度學(xué)習(xí)框架可以讓你來(lái)確定是否訓(xùn)練與某些具體層相關(guān)的權(quán)重练俐。
另一個(gè)應(yīng)用中比較巧妙地是:
由于前面的層全部被凍結(jié)了袖迎,之前有些固定函數(shù)不會(huì)變,因?yàn)槟悻F(xiàn)在也不改動(dòng)它腺晾,也不訓(xùn)練它燕锥,所以網(wǎng)絡(luò)接受輸入圖像X,并把X映射到該層的激活函數(shù)上悯蝉,因此這個(gè)方法可以加快訓(xùn)練归形,因?yàn)槲覀儎傤A(yù)計(jì)算過(guò)該層,而該層重激活產(chǎn)生的特征就直接保存在硬盤(pán)中鼻由。
你所做的就是用這個(gè)固定的函數(shù)暇榴,在該神經(jīng)網(wǎng)絡(luò)的前半部分,接受任一輸入圖像X蕉世,然后計(jì)算其特征向量蔼紧,然后依據(jù)這個(gè)特征向量訓(xùn)練一個(gè)淺層的softmax模型去預(yù)測(cè)。因此預(yù)計(jì)算之前層的激活結(jié)果是有利于你計(jì)算的操作狠轻,(預(yù)計(jì)算)訓(xùn)練集所有樣本(激活結(jié)果)并存在硬盤(pán)上歉井,然后訓(xùn)練左邊的softmax類別。
這樣做的好處是:
預(yù)計(jì)算的好處是你不需要在訓(xùn)練集上每次迭代哈误,都重新計(jì)算這些激活結(jié)果哩至。
所以,如果你的訓(xùn)練集比較小蜜自,以上就是你可以做的工作菩貌。
如果你的訓(xùn)練集夠大,一個(gè)經(jīng)驗(yàn)之談就是:
如果你有更大的帶標(biāo)簽的數(shù)據(jù)集重荠,比如有很多Tigger和Misty的照片箭阶,你可以凍結(jié)更少的層數(shù),然后訓(xùn)練后面這些層,盡管輸出層的類別與你需要的不同仇参。
有幾種這樣做的方法:
你可以用最后幾層的權(quán)重嘹叫,作為初始化開(kāi)始做梯度下降訓(xùn)練。
你也可以去掉最后幾層诈乒,然后用自己的新神經(jīng)元和最終softmax輸出訓(xùn)練罩扇。
這兩種方法都值得嘗試。但有個(gè)模式怕磨,你的數(shù)據(jù)越多喂饥,所凍結(jié)的層數(shù)可以越少,自己訓(xùn)練的層數(shù)可以越多肠鲫。
其中的想法就是如果你選了個(gè)數(shù)據(jù)集员帮,有足夠的數(shù)據(jù),不僅可以訓(xùn)練單層softmax导饲,還可以訓(xùn)練由所采用網(wǎng)絡(luò)的最后幾層組成的中型網(wǎng)絡(luò)捞高。
其次,如果你有很多數(shù)據(jù)渣锦,你可以用該開(kāi)源網(wǎng)絡(luò)和權(quán)重棠枉,用全部算法初始化整個(gè)網(wǎng)絡(luò),然后訓(xùn)練泡挺,你有越多的帶標(biāo)簽的數(shù)據(jù),你可以訓(xùn)練的層數(shù)就越多命浴。極端就是你可以用下載的權(quán)重作為初始化娄猫,因此這些權(quán)重可以代替隨機(jī)初始化,然后做梯度下降訓(xùn)練生闲,來(lái)更新所有權(quán)重和網(wǎng)絡(luò)層媳溺。
總結(jié):
這就是卷積神經(jīng)網(wǎng)絡(luò)訓(xùn)練中的遷移學(xué)習(xí),實(shí)際上因?yàn)榫W(wǎng)上公開(kāi)數(shù)據(jù)庫(kù)非常大碍讯,你下載的權(quán)重也是別人從大量數(shù)據(jù)上花費(fèi)數(shù)周訓(xùn)練而來(lái)的悬蔽,你會(huì)發(fā)現(xiàn)對(duì)于很多計(jì)算機(jī)視覺(jué)應(yīng)用來(lái)說(shuō),如果你下載別人的開(kāi)源的權(quán)重來(lái)初始化自己的問(wèn)題捉兴,你可以做的更好蝎困。
我認(rèn)為計(jì)算機(jī)視覺(jué)是其中一個(gè)遷移學(xué)習(xí)可以一直應(yīng)用的領(lǐng)域,除非你有特別大的數(shù)據(jù)集從零來(lái)訓(xùn)練自己的網(wǎng)絡(luò)倍啥。而遷移學(xué)習(xí)值得認(rèn)真考慮除非你的確擁有海量的數(shù)據(jù)和計(jì)算資源來(lái)自己從零開(kāi)始禾乘。
第三課:數(shù)據(jù)增強(qiáng)
大多數(shù)計(jì)算機(jī)視覺(jué)需要用到很多數(shù)據(jù),因此數(shù)據(jù)增強(qiáng)是其中一種常用的技術(shù)用于改善計(jì)算機(jī)視覺(jué)系統(tǒng)的性能虽缕。
計(jì)算機(jī)視覺(jué)很麻煩始藕,因?yàn)槟阋阉械南袼剌斎氲接?jì)算機(jī)中,貌似你需要訓(xùn)練出一個(gè)相當(dāng)復(fù)雜的函數(shù)來(lái)做這件事。事實(shí)上伍派,更多的數(shù)據(jù)對(duì)于幾乎所有的計(jì)算機(jī)視覺(jué)工作都有好處江耀。
我認(rèn)為計(jì)算機(jī)視覺(jué),對(duì)于絕大多數(shù)問(wèn)題诉植,我們總是不能獲得足夠的數(shù)據(jù)祥国。那么這就意味著,當(dāng)你在訓(xùn)練計(jì)算機(jī)視覺(jué)模型時(shí)倍踪,數(shù)據(jù)增強(qiáng)往往會(huì)有所幫助系宫。
無(wú)論你是用遷移學(xué)習(xí)即用其他人預(yù)先訓(xùn)練好的模型來(lái)開(kāi)頭,還是試著從零開(kāi)始訓(xùn)練自己的模型建车。
常見(jiàn)的計(jì)算機(jī)視覺(jué)中的數(shù)據(jù)增強(qiáng)方法:
最簡(jiǎn)單的數(shù)據(jù)增強(qiáng)方式:垂直鏡像
并不完美的數(shù)據(jù)增強(qiáng)方式:隨機(jī)裁剪扩借,獲得了不同的示例來(lái)擴(kuò)充訓(xùn)練集
旋轉(zhuǎn)
剪切
局部彎曲
...
第二類常用的數(shù)據(jù)增強(qiáng)的方法:色彩變化
RGB通道加入擾動(dòng)
色彩變化
...
使得你的學(xué)習(xí)算法在應(yīng)對(duì)圖像色彩變化時(shí)健壯性更好。
腳注:有不同的方式來(lái)采樣紅藍(lán)綠通道
其中一種色彩干擾的算法:PCA主成分分析/PCA色彩增強(qiáng)
如果你的圖像主要呈紫色缤至,即主要是紅色和藍(lán)色潮罪,帶一點(diǎn)點(diǎn)綠色,那么PCA色彩增強(qiáng)领斥,會(huì)增加和減少很多紅色和藍(lán)色的值嫉到,卻對(duì)綠色值做很小的更改,因此來(lái)保持整體和之前相同的著色月洛。
算法細(xì)節(jié)在AlexNet的論文中有描述何恶!也可以找一些PCA色彩增強(qiáng)的開(kāi)源代碼!
你也許想將訓(xùn)練樣本存在硬盤(pán)上嚼黔,但是如果是一個(gè)非常大的訓(xùn)練集合细层,這是一個(gè)非常常見(jiàn)的情況,這里你也許會(huì)有一個(gè)CPU進(jìn)程唬涧,不斷地從硬盤(pán)中加載圖像疫赎,你能做的就是用一個(gè)CPU進(jìn)程來(lái)實(shí)現(xiàn)失真,可以是隨機(jī)裁剪碎节,或色彩變化捧搞,或鏡像,對(duì)每個(gè)圖像你就可以獲得一些它的失真版本狮荔。
這里你的CPU線程不斷地加載數(shù)據(jù)并作一些必要的失真處理胎撇,來(lái)行程一批或幾小批數(shù)據(jù),這些數(shù)據(jù)會(huì)不斷地傳給其他線程或進(jìn)程殖氏,來(lái)實(shí)現(xiàn)訓(xùn)練學(xué)習(xí)创坞,這些可以在CPU或GPU上實(shí)現(xiàn),如果訓(xùn)練一個(gè)大的神經(jīng)網(wǎng)絡(luò)受葛,后者越來(lái)越多的被用到题涨。
因此偎谁,一個(gè)常用的數(shù)據(jù)增強(qiáng)的方法是:
通過(guò)一個(gè)線程,幾乎是四個(gè)線程纲堵,用來(lái)加載數(shù)據(jù)并作失真處理巡雨,然后傳遞給其他線程或進(jìn)程用來(lái)做深度學(xué)習(xí)訓(xùn)練,通常這兩步可以并行席函。
以上铐望,就是數(shù)據(jù)增強(qiáng)。
數(shù)據(jù)增強(qiáng)也有一些超參數(shù):
例如要實(shí)現(xiàn)多大程度的色彩變化和具體用什么形式來(lái)做隨機(jī)裁剪茂附?
同計(jì)算機(jī)視覺(jué)其他部分一樣正蛙,找到一個(gè)其他人用于數(shù)據(jù)增強(qiáng)的開(kāi)源算法,也是一個(gè)很好的開(kāi)始营曼。
第四課:計(jì)算機(jī)視覺(jué)現(xiàn)狀
對(duì)于深度學(xué)習(xí)在計(jì)算機(jī)視覺(jué)中的應(yīng)用及現(xiàn)狀有幾個(gè)獨(dú)特的方面乒验,幫助你閱讀以及如何搭建用于計(jì)算機(jī)視覺(jué)的系統(tǒng)?
大多數(shù)機(jī)器學(xué)習(xí)問(wèn)題就是:
從擁有相對(duì)較少的數(shù)據(jù)————到擁有大量數(shù)據(jù)之間的問(wèn)題蒂阱。
如果縱觀機(jī)器學(xué)習(xí)問(wèn)題的發(fā)展锻全,你會(huì)發(fā)現(xiàn)一般情況下,當(dāng)你有很多數(shù)據(jù)的時(shí)候录煤,你會(huì)發(fā)現(xiàn)差不多使用比較簡(jiǎn)單的算法鳄厌,以及更少的人工設(shè)計(jì)就可以了。
即不太需要針對(duì)問(wèn)題來(lái)仔細(xì)的設(shè)計(jì)特征
當(dāng)你有大量數(shù)據(jù)的時(shí)候妈踊,你可以用一個(gè)巨大的神經(jīng)網(wǎng)絡(luò)了嚎,甚至更為簡(jiǎn)單的結(jié)構(gòu),就讓一個(gè)神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)我們想要學(xué)習(xí)的廊营。
當(dāng)你沒(méi)有很多數(shù)據(jù)時(shí)歪泳,通常會(huì)發(fā)現(xiàn)人們更多的人工設(shè)計(jì),即更多的手工處理赘风,人工設(shè)計(jì)實(shí)際上是當(dāng)你沒(méi)有很多數(shù)據(jù)量時(shí)獲得良好效果的最好方法。
通常機(jī)器學(xué)習(xí)算法有兩個(gè)知識(shí)來(lái)源:
1.標(biāo)記的數(shù)據(jù)纵刘,用于監(jiān)督學(xué)習(xí)的(x邀窃,y)
2.人工設(shè)計(jì),而且有很多方法可以用來(lái)手工設(shè)計(jì)一個(gè)系統(tǒng)假哎,它可以精心的設(shè)計(jì)特性瞬捕,到精心設(shè)計(jì)網(wǎng)絡(luò)結(jié)構(gòu),抑或系統(tǒng)的其他組件舵抹。
所以當(dāng)你沒(méi)有太多的標(biāo)記好的數(shù)據(jù)時(shí)肪虎,就需要在人工設(shè)計(jì)上下功夫。
我認(rèn)為計(jì)算機(jī)視覺(jué)正試圖學(xué)習(xí)一個(gè)非常復(fù)雜的函數(shù)惧蛹,我們經(jīng)常覺(jué)得沒(méi)有足夠的用于計(jì)算機(jī)視覺(jué)的數(shù)據(jù)扇救,這就是為什么計(jì)算機(jī)視覺(jué)還非常依賴與人工設(shè)計(jì)刑枝。
所以在計(jì)算機(jī)視覺(jué)領(lǐng)域開(kāi)發(fā)了相當(dāng)復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu),因?yàn)樵跊](méi)有足夠的數(shù)據(jù)量的情況下迅腔,獲得良好性能的途徑就是花更多時(shí)間去精心設(shè)計(jì)装畅。
但從歷史的角度看,我認(rèn)為對(duì)于計(jì)算機(jī)視覺(jué)使用非常小的數(shù)據(jù)集的擔(dān)憂以及一直以來(lái)計(jì)算機(jī)視覺(jué)文獻(xiàn)依賴于大量人工設(shè)計(jì)的擔(dān)憂沧烈,即使最近幾年 掠兄,數(shù)據(jù)的量級(jí)伴隨著正確的計(jì)算機(jī)視覺(jué)任務(wù)也有了顯著地增加,這已經(jīng)導(dǎo)致了一直以來(lái)做的人工設(shè)計(jì)的數(shù)量有了明顯的減少锌雀。但仍然有很多網(wǎng)絡(luò)結(jié)構(gòu)和計(jì)算機(jī)視覺(jué)方面的人工設(shè)計(jì)蚂夕,這就是為什么仍能在計(jì)算機(jī)視覺(jué)領(lǐng)域,看到相比與其他領(lǐng)域非常復(fù)雜的算法腋逆。
實(shí)際上婿牍,你通常有比圖像識(shí)別數(shù)據(jù)更小的目標(biāo)檢測(cè)數(shù)據(jù)集,當(dāng)談及目標(biāo)檢測(cè)時(shí)闲礼,你會(huì)看到算法變得更復(fù)雜牍汹,并具有更為特定化的組件。
所幸的是柬泽,當(dāng)只有少量數(shù)據(jù)時(shí)慎菲,遷移學(xué)習(xí)可以有很大的幫助,例如對(duì)于家貓的識(shí)別锨并,這些都不是檢測(cè)問(wèn)題露该,你只有非常小的數(shù)據(jù),遷移學(xué)習(xí)也會(huì)工作的不錯(cuò)第煮。這是另外一種技術(shù)解幼,被廣泛使用于數(shù)據(jù)量很少的情況下。
對(duì)于計(jì)算機(jī)視覺(jué)的研究者而言包警,如果你在基準(zhǔn)數(shù)據(jù)上做的很好撵摆,就很容易發(fā)表文章,所以很多人關(guān)注在基準(zhǔn)數(shù)據(jù)上取得好的結(jié)果害晦。
這樣做的好處是:
它幫助整個(gè)學(xué)科領(lǐng)域搞清楚哪些是最有效的算法特铝,但是你也看到,文章中的一些工作只是為了讓你在基準(zhǔn)數(shù)據(jù)上取得好結(jié)果壹瘟。但是這個(gè)算法并不會(huì)真的應(yīng)用于你現(xiàn)實(shí)中要發(fā)布的產(chǎn)品或者系統(tǒng)上鲫剿。因此在這,我有一些對(duì)在基準(zhǔn)數(shù)據(jù)上做的好的一些小建議:
如果我要把一個(gè)系統(tǒng)放到實(shí)際服務(wù)客戶的產(chǎn)品中:
1.集成稻轨。在弄清楚了你要用什么神經(jīng)網(wǎng)絡(luò)灵莲,獨(dú)立的訓(xùn)練多個(gè)神經(jīng)網(wǎng)絡(luò),然后對(duì)它們的輸出求平均作出結(jié)果殴俱,要對(duì)它們的輸出y帽求平均政冻,不要對(duì)權(quán)重求平均枚抵。
但是因?yàn)榧梢馕吨诿糠鶊D像上進(jìn)行測(cè)試,或許需要將一副圖像輸入到3到15個(gè)神經(jīng)網(wǎng)絡(luò)赠幕,這樣會(huì)減慢運(yùn)行速度俄精,所以集成是人們?cè)诨鶞?zhǔn)數(shù)據(jù)上測(cè)試獲得好成績(jī)的小貼士之一。
2.測(cè)試時(shí)使用多重剪切
多重剪切其實(shí)就是在你的測(cè)試圖像上榕堰,應(yīng)用圖像增強(qiáng)的一種形式竖慧,這也許能為一個(gè)產(chǎn)品化的系統(tǒng)帶來(lái)些許性能上的提升。
相比于集成逆屡,它不會(huì)吞噬太多內(nèi)存圾旨,但它仍然很大程度上降低運(yùn)行速度。
3.一個(gè)神經(jīng)網(wǎng)絡(luò)系統(tǒng)在某個(gè)視覺(jué)問(wèn)題上效果很好魏蔗,通常驚人的是它們大多在另外的視覺(jué)問(wèn)題上也能用砍的。
因此,要搭建一個(gè)有用的系統(tǒng)莺治,你一般要做的是從別人的神經(jīng)網(wǎng)絡(luò)架構(gòu)開(kāi)始廓鞠,而且如果可能,開(kāi)源實(shí)現(xiàn)谣旁。
4.先使用別人預(yù)先訓(xùn)練的模型床佳,然后在你的數(shù)據(jù)集上進(jìn)行微調(diào),你通抽螅可以在你的應(yīng)用上很快取得進(jìn)展砌们。