CS231n课程笔记翻译:图像分类笔记(下)
譯者注:本文翻譯自斯坦福CS231n課程筆記image classification notes,課程教師Andrej Karpathy授權(quán)翻譯。本篇教程由杜客進(jìn)行翻譯,ShiqingFan和鞏子嘉進(jìn)行校對修改。譯文含公式和代碼,建議PC端閱讀。
點(diǎn)擊查看圖像分類筆記(上)。
內(nèi)容列表
- 圖像分類、數(shù)據(jù)驅(qū)動方法和流程
- Nearest Neighbor分類器
- k-Nearest Neighbor
- k-Nearest Neighbor
- 驗(yàn)證集、交叉驗(yàn)證集和超參數(shù)調(diào)優(yōu) 譯者注:下篇翻譯起始處
- Nearest Neighbor的優(yōu)劣
- 小結(jié)
- 小結(jié):應(yīng)用kNN實(shí)踐
- 拓展閱讀
用于超參數(shù)調(diào)優(yōu)的驗(yàn)證集
k-NN分類器需要設(shè)定k值,那么選擇哪個k值最合適的呢?我們可以選擇不同的距離函數(shù),比如L1范數(shù)和L2范數(shù)等,那么選哪個好?還有不少選擇我們甚至連考慮都沒有考慮到(比如:點(diǎn)積)。所有這些選擇,被稱為超參數(shù)(hyperparameter)。在基于數(shù)據(jù)進(jìn)行學(xué)習(xí)的機(jī)器學(xué)習(xí)算法設(shè)計中,超參數(shù)是很常見的。一般說來,這些超參數(shù)具體怎么設(shè)置或取值并不是顯而易見的。
你可能會建議嘗試不同的值,看哪個值表現(xiàn)最好就選哪個。好主意!我們就是這么做的,但這樣做的時候要非常細(xì)心。特別注意:決不能使用測試集來進(jìn)行調(diào)優(yōu)。當(dāng)你在設(shè)計機(jī)器學(xué)習(xí)算法的時候,應(yīng)該把測試集看做非常珍貴的資源,不到最后一步,絕不使用它。如果你使用測試集來調(diào)優(yōu),而且算法看起來效果不錯,那么真正的危險在于:算法實(shí)際部署后,性能可能會遠(yuǎn)低于預(yù)期。這種情況,稱之為算法對測試集過擬合。從另一個角度來說,如果使用測試集來調(diào)優(yōu),實(shí)際上就是把測試集當(dāng)做訓(xùn)練集,由測試集訓(xùn)練出來的算法再跑測試集,自然性能看起來會很好。這其實(shí)是過于樂觀了,實(shí)際部署起來效果就會差很多。所以,最終測試的時候再使用測試集,可以很好地近似度量你所設(shè)計的分類器的泛化性能(在接下來的課程中會有很多關(guān)于泛化性能的討論)。
測試數(shù)據(jù)集只使用一次,即在訓(xùn)練完成后評價最終的模型時使用。
好在我們有不用測試集調(diào)優(yōu)的方法。其思路是:從訓(xùn)練集中取出一部分?jǐn)?shù)據(jù)用來調(diào)優(yōu),我們稱之為驗(yàn)證集(validation set)。以CIFAR-10為例,我們可以用49000個圖像作為訓(xùn)練集,用1000個圖像作為驗(yàn)證集。驗(yàn)證集其實(shí)就是作為假的測試集來調(diào)優(yōu)。下面就是代碼:
# assume we have Xtr_rows, Ytr, Xte_rows, Yte as before # recall Xtr_rows is 50,000 x 3072 matrix Xval_rows = Xtr_rows[:1000, :] # take first 1000 for validation Yval = Ytr[:1000] Xtr_rows = Xtr_rows[1000:, :] # keep last 49,000 for train Ytr = Ytr[1000:]# find hyperparameters that work best on the validation set validation_accuracies = [] for k in [1, 3, 5, 10, 20, 50, 100]:# use a particular value of k and evaluation on validation datann = NearestNeighbor()nn.train(Xtr_rows, Ytr)# here we assume a modified NearestNeighbor class that can take a k as inputYval_predict = nn.predict(Xval_rows, k = k)acc = np.mean(Yval_predict == Yval)print 'accuracy: %f' % (acc,)# keep track of what works on the validation setvalidation_accuracies.append((k, acc))
程序結(jié)束后,我們會作圖分析出哪個k值表現(xiàn)最好,然后用這個k值來跑真正的測試集,并作出對算法的評價。
交叉驗(yàn)證。有時候,訓(xùn)練集數(shù)量較小(因此驗(yàn)證集的數(shù)量更小),人們會使用一種被稱為交叉驗(yàn)證的方法,這種方法更加復(fù)雜些。還是用剛才的例子,如果是交叉驗(yàn)證集,我們就不是取1000個圖像,而是將訓(xùn)練集平均分成5份,其中4份用來訓(xùn)練,1份用來驗(yàn)證。然后我們循環(huán)著取其中4份來訓(xùn)練,其中1份來驗(yàn)證,最后取所有5次驗(yàn)證結(jié)果的平均值作為算法驗(yàn)證結(jié)果。
—————————————————————————————————————————
這就是5份交叉驗(yàn)證對k值調(diào)優(yōu)的例子。針對每個k值,得到5個準(zhǔn)確率結(jié)果,取其平均值,然后對不同k值的平均表現(xiàn)畫線連接。本例中,當(dāng)k=7的時算法表現(xiàn)最好(對應(yīng)圖中的準(zhǔn)確率峰值)。如果我們將訓(xùn)練集分成更多份數(shù),直線一般會更加平滑(噪音更少)。
—————————————————————————————————————————
實(shí)際應(yīng)用。在實(shí)際情況下,人們不是很喜歡用交叉驗(yàn)證,主要是因?yàn)樗鼤馁M(fèi)較多的計算資源。一般直接把訓(xùn)練集按照50%-90%的比例分成訓(xùn)練集和驗(yàn)證集。但這也是根據(jù)具體情況來定的:如果超參數(shù)數(shù)量多,你可能就想用更大的驗(yàn)證集,而驗(yàn)證集的數(shù)量不夠,那么最好還是用交叉驗(yàn)證吧。至于分成幾份比較好,一般都是分成3、5和10份。
—————————————————————————————————————————
常用的數(shù)據(jù)分割模式。給出訓(xùn)練集和測試集后,訓(xùn)練集一般會被均分。這里是分成5份。前面4份用來訓(xùn)練,黃色那份用作驗(yàn)證集調(diào)優(yōu)。如果采取交叉驗(yàn)證,那就各份輪流作為驗(yàn)證集。最后模型訓(xùn)練完畢,超參數(shù)都定好了,讓模型跑一次(而且只跑一次)測試集,以此測試結(jié)果評價算法。
—————————————————————————————————————————
Nearest Neighbor分類器的優(yōu)劣
現(xiàn)在對Nearest Neighbor分類器的優(yōu)缺點(diǎn)進(jìn)行思考。首先,Nearest Neighbor分類器易于理解,實(shí)現(xiàn)簡單。其次,算法的訓(xùn)練不需要花時間,因?yàn)槠溆?xùn)練過程只是將訓(xùn)練集數(shù)據(jù)存儲起來。然而測試要花費(fèi)大量時間計算,因?yàn)槊總€測試圖像需要和所有存儲的訓(xùn)練圖像進(jìn)行比較,這顯然是一個缺點(diǎn)。在實(shí)際應(yīng)用中,我們關(guān)注測試效率遠(yuǎn)遠(yuǎn)高于訓(xùn)練效率。其實(shí),我們后續(xù)要學(xué)習(xí)的卷積神經(jīng)網(wǎng)絡(luò)在這個權(quán)衡上走到了另一個極端:雖然訓(xùn)練花費(fèi)很多時間,但是一旦訓(xùn)練完成,對新的測試數(shù)據(jù)進(jìn)行分類非常快。這樣的模式就符合實(shí)際使用需求。
Nearest Neighbor分類器的計算復(fù)雜度研究是一個活躍的研究領(lǐng)域,若干Approximate Nearest Neighbor (ANN)算法和庫的使用可以提升Nearest Neighbor分類器在數(shù)據(jù)上的計算速度(比如:FLANN)。這些算法可以在準(zhǔn)確率和時空復(fù)雜度之間進(jìn)行權(quán)衡,并通常依賴一個預(yù)處理/索引過程,這個過程中一般包含kd樹的創(chuàng)建和k-means算法的運(yùn)用。
Nearest Neighbor分類器在某些特定情況(比如數(shù)據(jù)維度較低)下,可能是不錯的選擇。但是在實(shí)際的圖像分類工作中,很少使用。因?yàn)閳D像都是高維度數(shù)據(jù)(他們通常包含很多像素),而高維度向量之間的距離通常是反直覺的。下面的圖片展示了基于像素的相似和基于感官的相似是有很大不同的:
—————————————————————————————————————————
在高維度數(shù)據(jù)上,基于像素的的距離和感官上的非常不同。上圖中,右邊3張圖片和左邊第1張原始圖片的L2距離是一樣的。很顯然,基于像素比較的相似和感官上以及語義上的相似是不同的。
—————————————————————————————————————————
這里還有個視覺化證據(jù),可以證明使用像素差異來比較圖像是不夠的。z這是一個叫做t-SNE的可視化技術(shù),它將CIFAR-10中的圖片按照二維方式排布,這樣能很好展示圖片之間的像素差異值。在這張圖片中,排列相鄰的圖片L2距離就小。
—————————————————————————————————————————
上圖使用t-SNE的可視化技術(shù)將CIFAR-10的圖片進(jìn)行了二維排列。排列相近的圖片L2距離小。可以看出,圖片的排列是被背景主導(dǎo)而不是圖片語義內(nèi)容本身主導(dǎo)。
——————————————————————————————————————————
具體說來,這些圖片的排布更像是一種顏色分布函數(shù),或者說是基于背景的,而不是圖片的語義主體。比如,狗的圖片可能和青蛙的圖片非常接近,這是因?yàn)閮蓮垐D片都是白色背景。從理想效果上來說,我們肯定是希望同類的圖片能夠聚集在一起,而不被背景或其他不相關(guān)因素干擾。為了達(dá)到這個目的,我們不能止步于原始像素比較,得繼續(xù)前進(jìn)。
小結(jié)
簡要說來:
- 介紹了圖像分類問題。在該問題中,給出一個由被標(biāo)注了分類標(biāo)簽的圖像組成的集合,要求算法能預(yù)測沒有標(biāo)簽的圖像的分類標(biāo)簽,并根據(jù)算法預(yù)測準(zhǔn)確率進(jìn)行評價。
- 介紹了一個簡單的圖像分類器:最近鄰分類器(Nearest Neighbor classifier)。分類器中存在不同的超參數(shù)(比如k值或距離類型的選取),要想選取好的超參數(shù)不是一件輕而易舉的事。
- 選取超參數(shù)的正確方法是:將原始訓(xùn)練集分為訓(xùn)練集和驗(yàn)證集,我們在驗(yàn)證集上嘗試不同的超參數(shù),最后保留表現(xiàn)最好那個。
- 如果訓(xùn)練數(shù)據(jù)量不夠,使用交叉驗(yàn)證方法,它能幫助我們在選取最優(yōu)超參數(shù)的時候減少噪音。
- 一旦找到最優(yōu)的超參數(shù),就讓算法以該參數(shù)在測試集跑且只跑一次,并根據(jù)測試結(jié)果評價算法。
- 最近鄰分類器能夠在CIFAR-10上得到將近40%的準(zhǔn)確率。該算法簡單易實(shí)現(xiàn),但需要存儲所有訓(xùn)練數(shù)據(jù),并且在測試的時候過于耗費(fèi)計算能力。
- 最后,我們知道了僅僅使用L1和L2范數(shù)來進(jìn)行像素比較是不夠的,圖像更多的是按照背景和顏色被分類,而不是語義主體分身。
在接下來的課程中,我們將專注于解決這些問題和挑戰(zhàn),并最終能夠得到超過90%準(zhǔn)確率的解決方案。該方案能夠在完成學(xué)習(xí)就丟掉訓(xùn)練集,并在一毫秒之內(nèi)就完成一張圖片的分類。
小結(jié):實(shí)際應(yīng)用k-NN
如果你希望將k-NN分類器用到實(shí)處(最好別用到圖像上,若是僅僅作為練手還可以接受),那么可以按照以下流程:
拓展閱讀
下面是一些你可能感興趣的拓展閱讀鏈接:
- A Few Useful Things to Know about Machine Learning,文中第6節(jié)與本節(jié)相關(guān),但是整篇文章都強(qiáng)烈推薦。
- Recognizing and Learning Object Categories,ICCV 2005上的一節(jié)關(guān)于物體分類的課程。
圖像分類筆記全文翻譯完畢。
譯者反饋
作者:杜客
鏈接:https://zhuanlan.zhihu.com/p/20900216
來源:知乎
總結(jié)
以上是生活随笔為你收集整理的CS231n课程笔记翻译:图像分类笔记(下)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CS231n课程笔记翻译:图像分类笔记(
- 下一篇: 学会这9招,你也能成为演讲高手