此筆記基于斯坦福cs231n課程找岖。
作者:武秉文Jerry赂蠢,bingwenwu@foxmail.com
轉(zhuǎn)載請(qǐng)注明出處
目錄
- 圖像分類介紹两曼,數(shù)據(jù)驅(qū)動(dòng)(data-driven)方法仆邓,pipeline廓握。
- 最近鄰分類器
- k-Nearest Neighbor
- Validation sets, 交叉驗(yàn)證, hyperparameter tuning(調(diào)整)
- 最近鄰方法的優(yōu)缺點(diǎn)
- 總結(jié)
- 總結(jié):在實(shí)踐中運(yùn)用kNN
- 擴(kuò)展閱讀
圖像分類
Motivation. 這部分我們會(huì)介紹圖像分類問題,它的任務(wù)是從一個(gè)固定的標(biāo)簽?zāi)夸浿袨檩斎氲膱D片分配一個(gè)標(biāo)簽烫止。這是計(jì)算機(jī)視覺的核心問題之一蒋荚,盡管看似很簡(jiǎn)單,但有很大的應(yīng)用領(lǐng)域馆蠕。另外期升,很多其他看似不相干的計(jì)算機(jī)視覺問題(比如物體檢測(cè),分割)可以被簡(jiǎn)化為圖像分類問題互躬。
Example. 下圖中播赁,一個(gè)圖像分類模型取一張圖片并且分配可能性到4個(gè)類別。{cat, dog, hat, mug} 但像圖中所示吼渡,記住對(duì)于電腦而言容为,一個(gè)圖片由一個(gè)三維數(shù)組表示。這個(gè)例子中寺酪,貓圖片248 pixels寬坎背, 400
pixels長(zhǎng),有三種原色表示(RGB)寄雀。因此得滤,這個(gè)圖片包括248 * 400 * 3個(gè)數(shù)據(jù),總共297,600個(gè)數(shù)字盒犹。每個(gè)數(shù)字是一個(gè)0 - 255范圍內(nèi)的整數(shù)懂更。我們的任務(wù)是將這么多數(shù)字轉(zhuǎn)為一個(gè)單獨(dú)的標(biāo)簽眨业,比如cat。
圖像分類的任務(wù)就是對(duì)給定的圖片預(yù)測(cè)一個(gè)標(biāo)簽(或者是標(biāo)簽概率的分布沮协,如圖中所示)龄捡。圖像是一個(gè)三維數(shù)組表示,從0到255慷暂,尺寸是長(zhǎng)乘寬聘殖。3表示三原色,Red,Green,Blue呜呐。
Challenges. 因?yàn)樽R(shí)別物體(比如“貓”)對(duì)于人類是很簡(jiǎn)單的就斤,所以從計(jì)算機(jī)視覺算法的角度考慮挑戰(zhàn)是有價(jià)值的。下面列出了很多挑戰(zhàn)蘑辑,注意圖片的原始表示是三維數(shù)組洋机。
- 視角變化。一個(gè)對(duì)象的實(shí)例可以從不同角度觀察洋魂。
- 尺寸變化绷旗。對(duì)象的大小會(huì)不同。
- 畸變副砍∠沃可能圖片中的對(duì)象發(fā)生變形。
- 不完整豁翎。圖片中的對(duì)象不是完整的顯現(xiàn)出來角骤,可能部分被遮擋。
- 照明條件心剥。光照影響在像素級(jí)上影響很大邦尊。
- 背景混亂。對(duì)象可能隱藏在背景中优烧。
- 同類別變化蝉揍。同一類對(duì)象可能有不同的樣子,比如貓就很多種類畦娄,樣子不同又沾。
良好的圖像分類模型必須對(duì)所有這些變量的交叉乘積保持不變,同時(shí)保持對(duì)類間變化的敏感性熙卡。
數(shù)據(jù)驅(qū)動(dòng)方法(Data-driven approach)杖刷。我們?nèi)绾螌懸粋€(gè)算法去將圖片分到對(duì)應(yīng)的類別?不同于寫一個(gè)排序算法驳癌,寫一個(gè)識(shí)別貓的圖片的算法不是那么簡(jiǎn)單直接滑燃。不是直接在代碼中指定每種感興趣的類別,而是要為計(jì)算機(jī)提供每個(gè)類別的很多實(shí)例喂柒,然后構(gòu)建學(xué)習(xí)算法不瓶,學(xué)習(xí)每一類圖片。這個(gè)方法叫做你數(shù)據(jù)驅(qū)動(dòng)方法灾杰。(data-drvien approach)蚊丐。因?yàn)樗紫纫蕾囉谝粋€(gè)有標(biāo)簽的訓(xùn)練集(training set)。這里是一個(gè)這樣的數(shù)據(jù)集的示例:
一個(gè)四類物體的訓(xùn)練集示例艳吠。實(shí)際中可能有幾千個(gè)分類麦备,每個(gè)類別下有幾百?gòu)垐D片。
The Image classification pipeline. 完整的流程可以簡(jiǎn)化為如下三步:
- Input昭娩。我們的輸入包括一個(gè)N張圖片的集合凛篙,每張圖片都有對(duì)應(yīng)的標(biāo)簽。我們把這個(gè)集合叫做訓(xùn)練集(training set)栏渺。
- Learning呛梆。我們的任務(wù)是使用訓(xùn)練集去學(xué)習(xí)每個(gè)分類應(yīng)該長(zhǎng)什么樣。我們把這一步叫做訓(xùn)練一個(gè)分類器(training a classifier)磕诊,或者學(xué)習(xí)一個(gè)模型(learning a model)填物。
- Evaluation。最后霎终,我們要評(píng)價(jià)分類器的性能滞磺,方式是對(duì)一組沒有見過的圖片進(jìn)行分類。然后比較正確的標(biāo)簽和分類器分類后的標(biāo)簽莱褒。
最近鄰分類器 Nearest Neighbor Classifier
作為我們的第一種方法击困,我們將先構(gòu)建一種叫做最近鄰分類器。這種分類器和CNN沒有關(guān)系并且實(shí)際中很少使用广凸,但它能讓我們對(duì)圖片分類問題的基本方法有一點(diǎn)了解阅茶。
Example Image classification dataset: CIFAR-10。一個(gè)很流行的圖片分類數(shù)據(jù)庫(kù)炮障。這個(gè)數(shù)據(jù)庫(kù)包括60,000圖片目派,32 x 32像素。每一個(gè)圖片都被10個(gè)標(biāo)簽中的一個(gè)標(biāo)注了胁赢。這60,000圖片被分為50,000的訓(xùn)練集和10,000的測(cè)試集企蹭。下面的圖片能看到十個(gè)分類中隨機(jī)的十個(gè)圖片。
左側(cè):CIFAR-10中的圖片智末。右側(cè):第一列顯示一些測(cè)試圖片谅摄,后面顯示的是訓(xùn)練集中根據(jù)像素相似度差異計(jì)算后最接近的10個(gè)鄰居。
假定現(xiàn)在我們給定了CIFAR-10中的50,000張訓(xùn)練集圖片(每個(gè)標(biāo)簽5000張)系馆,然后我們希望去標(biāo)注剩下的10,000張送漠。最近鄰分類器會(huì)去一張測(cè)試圖片,拿他和每一張訓(xùn)練圖片對(duì)比由蘑,然后取相似度最高的訓(xùn)練集圖片標(biāo)簽作為該測(cè)試圖片的標(biāo)簽闽寡。上圖中右側(cè)的圖片就是10張測(cè)試圖片的結(jié)果代兵。注意10張圖片中只有3張測(cè)試正確,其他7張出現(xiàn)了錯(cuò)誤爷狈。比如第8行與馬頭最接近的圖片是紅色汽車植影,似乎是因?yàn)楸尘暗脑颍员诲e(cuò)誤標(biāo)注成了一輛車涎永。
你可能已經(jīng)注意到我們沒有具體說如何比較兩張圖片思币。在這個(gè)例子中,是兩個(gè)32x32x3的數(shù)組羡微。最簡(jiǎn)單的方式是每個(gè)像素進(jìn)行比較谷饿,然后每個(gè)像素的差異求和。換句話說妈倔,給定兩張圖片并且將他們表示為兩個(gè)向量I_1和I_2博投,比較他們的一個(gè)合理的方法是L1 distance:
\begin{equation}
d_1 (I_1, I_2) = \sum_{p} \left| I^p_1 - I^p_2 \right|
\end{equation}
這里有一個(gè)可視化的過程:
可以看出如果兩張圖片完全一樣的話,結(jié)果為0启涯。兩張圖片差別越大贬堵,結(jié)果也就越大。
現(xiàn)在看一下如何用代碼實(shí)現(xiàn)分類器结洼。首先我們要載入CIFAR-10數(shù)據(jù)到內(nèi)存中黎做。形式是4個(gè)數(shù)組:訓(xùn)練數(shù)據(jù)、訓(xùn)練數(shù)據(jù)標(biāo)簽松忍、測(cè)試數(shù)據(jù)蒸殿、測(cè)試數(shù)據(jù)標(biāo)簽。在下面的代碼中鸣峭,Xtr(50000 x 32 x 32 x 3)保存訓(xùn)練集中所有的圖片信息宏所,Ytr(50000 x 1)對(duì)應(yīng)測(cè)試集的標(biāo)簽(0-9):
Xtr, Ytr, Xte, Yte = load_CIFAR10('data/cifar10/') # a magic function we provide
# flatten out all images to be one-dimensional
Xtr_rows = Xtr.reshape(Xtr.shape[0], 32 * 32 * 3) # Xtr_rows becomes 50000 x 3072
Xte_rows = Xte.reshape(Xte.shape[0], 32 * 32 * 3) # Xte_rows becomes 10000 x 3072
既然我們把所有的圖片信息拉成一個(gè)向量,下面是我們就能訓(xùn)練和評(píng)價(jià)分類器了:
nn = NearestNeighbor() # create a Nearest Neighbor classifier class
nn.train(Xtr_rows, Ytr) # train the classifier on the training images and labels
Yte_predict = nn.predict(Xte_rows) # predict labels on the test images
# and now print the classification accuracy, which is the average number
# of examples that are correctly predicted (i.e. label matches)
print 'accuracy: %f' % ( np.mean(Yte_predict == Yte) )
注意作為評(píng)價(jià)的標(biāo)準(zhǔn)摊溶,常常使用accuracy爬骤,意思預(yù)測(cè)正確的百分比。注意我們構(gòu)建的所有分類器滿足一個(gè)通用的API:他們有一個(gè)train(X,y)函數(shù)莫换,輸入訓(xùn)練數(shù)據(jù)和對(duì)應(yīng)的標(biāo)簽霞玄。內(nèi)部看,這個(gè)類會(huì)構(gòu)建某種模型用于預(yù)測(cè)標(biāo)簽拉岁。并且還有一個(gè)predict(X)函數(shù)坷剧,輸入新的數(shù)據(jù)然后輸出預(yù)測(cè)的標(biāo)簽。下面是一個(gè)簡(jiǎn)單的使用L1距離的最近鄰分類器的實(shí)現(xiàn):
import numpy as np
class NearestNeighbor(object):
def __init__(self):
pass
def train(self, X, y):
""" X is N x D where each row is an example. Y is 1-dimension of size N """
# the nearest neighbor classifier simply remembers all the training data
self.Xtr = X
self.ytr = y
def predict(self, X):
""" X is N x D where each row is an example we wish to predict label for """
num_test = X.shape[0]
# lets make sure that the output type matches the input type
Ypred = np.zeros(num_test, dtype = self.ytr.dtype)
# loop over all test rows
for i in xrange(num_test):
# find the nearest training image to the i'th test image
# using the L1 distance (sum of absolute value differences)
distances = np.sum(np.abs(self.Xtr - X[i,:]), axis = 1)
min_index = np.argmin(distances) # get the index with smallest distance
Ypred[i] = self.ytr[min_index] # predict the label of the nearest example
return Ypred
如果你跑這段代碼喊暖,你會(huì)發(fā)現(xiàn)這個(gè)分類器在CIFAR-10上只有38.6%的準(zhǔn)確率惫企。雖然比隨機(jī)猜一個(gè)的準(zhǔn)確率高不少,但離人類的水平(大約94%)和最先進(jìn)的CNN(95%)還差了很多陵叽。
The choice of distance狞尔。有很多種方法計(jì)算兩個(gè)向量之間的距離丛版。另一個(gè)常用的選擇是使用L2 Distance,它是計(jì)算兩個(gè)向量之間歐式距離的幾何解釋偏序。形式如下:
\begin{equation}
d_2 (I_1, I_2) = \sqrt{\sum_{p} \left( I^p_1 - I^p_2 \right)^2}
\end{equation}
換句話說硼婿,我們還和之前一樣計(jì)算像素之間的差距,但是這一次我們將它平方禽车,再求和,之后在開方刊殉。在numpy中殉摔,用下面的代碼我們只需要替換一行代碼即可。計(jì)算距離的那一行代碼:
distances = np.sqrt(np.sum(np.square(self.Xtr - X[i,:]), axis = 1))
注意我們包括了np.sqrt的調(diào)用记焊,但是在實(shí)際的最近鄰應(yīng)用中我們丟掉了開方操作因?yàn)殚_方是一個(gè)單調(diào)函數(shù)逸月。只是距離大小值發(fā)生了變化,但還是保留了排序遍膜,所以對(duì)于最近鄰而言碗硬,有沒有開方都是一樣的。如果這時(shí)在CIFAR-10上面測(cè)試瓢颅,準(zhǔn)確率為35.4%恩尾。(比L1還要低一點(diǎn)點(diǎn))。
L1 vs. L2挽懦。討論兩種測(cè)量方法的不同是很有意思的翰意。特別是,當(dāng)涉及到兩個(gè)向量的不同時(shí)L2更加不可饒恕信柿。也就是說冀偶,L2更偏向于大的不同。L1 and L2 distance (or equivalently the L1/L2 norms of the differences between a pair of images) are the most commonly used special cases of a p-norm渔嚷。
k-Nearest Neighbor Classifier(k階最近鄰分類器)
你可能已經(jīng)發(fā)現(xiàn)單單只看距離最近的圖片的標(biāo)簽是很奇怪的进鸠。確實(shí),幾乎任何情況下形病,用k-Nearest Neighbor Classifier的效果都更好客年。原理很簡(jiǎn)單:不只找訓(xùn)練集中差別最小的一幅圖片,我們找差距最小的k張圖片窒朋,然后這k張圖片投票產(chǎn)生測(cè)試圖片的標(biāo)簽搀罢。實(shí)際中,當(dāng)k=1侥猩,就是最近鄰分類器榔至。較高的k值對(duì)類別之間的邊界起到了光滑作用。
上圖說明了NN和k-NN之間的區(qū)別欺劳。不同顏色區(qū)域表示分類器用L2距離的分類邊界唧取。白色區(qū)域是無法分類的點(diǎn)(即至少兩個(gè)類別的投票結(jié)果相同)铅鲤。注意NN中在藍(lán)色點(diǎn)之間的一個(gè)綠色點(diǎn),這個(gè)點(diǎn)生成了一小片可能錯(cuò)誤預(yù)測(cè)的區(qū)域枫弟。但是在5-NN中消失了邢享,所以分類器更加一般化。
實(shí)際中淡诗,k-NN總是你的選擇骇塘,但是k值應(yīng)該用多少呢?我們下面討論韩容。
Validation sets for Hyperparameter tuning
用于調(diào)整超參數(shù)的驗(yàn)證集合
k-NN分類器需要給定一個(gè)k值款违。但是多少最合適呢?另外群凶,我們看到有很多計(jì)算距離的方法插爹,比如L1和L2。這些選擇叫做hyperparameter(超參數(shù))请梢,他們?cè)谠O(shè)計(jì)機(jī)器學(xué)習(xí)算法中常常出現(xiàn)赠尾,而且通常很難直觀的知道應(yīng)該選擇哪一個(gè)。
你可能會(huì)想到我們把不同值都試一下毅弧,看哪個(gè)表現(xiàn)最好气嫁。這是個(gè)好想法并且也確實(shí)是我們要做的,但要非常謹(jǐn)慎的去做够坐。特別是杉编,我們不能用測(cè)試集去調(diào)整超參數(shù)。在設(shè)計(jì)機(jī)器學(xué)習(xí)算法的任何時(shí)候咆霜,你都應(yīng)將測(cè)試集當(dāng)做很珍貴的資源邓馒,直到最后才能使用。否則蛾坯,很可能你的超參數(shù)在測(cè)試集上性能很好光酣,但真正部署以后,性能會(huì)大大下降脉课。實(shí)際上救军,我們將這樣的情況稱作overfit(過擬合)測(cè)試集。從另一個(gè)角度看倘零,如果在測(cè)試集上調(diào)整超參數(shù)唱遭,你實(shí)際上將測(cè)試集也當(dāng)做了訓(xùn)練集。但如果你最后只用了一次測(cè)試集呈驶,它能夠保證分類器良好的generalization(一般性)拷泽。
只在最后用測(cè)試集進(jìn)行一次性能評(píng)估。
幸運(yùn)的是,有一種方法可以在不碰測(cè)試集的情況下調(diào)整超參數(shù)司致。這個(gè)想法是將訓(xùn)練集分為兩部分:一個(gè)相對(duì)較小的訓(xùn)練集拆吆,我們叫做validation set(驗(yàn)證集)。用CIFAR-10當(dāng)例子脂矫,我們可以用49000當(dāng)做訓(xùn)練集枣耀,剩下1000作為驗(yàn)證集。這個(gè)驗(yàn)證集實(shí)際上是一個(gè)假的測(cè)試集庭再,用于調(diào)整超參數(shù)捞奕。
# 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 data
nn = NearestNeighbor()
nn.train(Xtr_rows, Ytr)
# here we assume a modified NearestNeighbor class that can take a k as input
Yval_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 set
validation_accuracies.append((k, acc))
這個(gè)過程的最后,我們能夠畫出一張圖拄轻,顯示出哪個(gè)k值效果最好缝彬。然后我們可以固定這個(gè)值去在測(cè)試集上進(jìn)行評(píng)估。
將訓(xùn)練集分為一個(gè)訓(xùn)練集和一個(gè)驗(yàn)證集哺眯。使用驗(yàn)證集去調(diào)整超參數(shù)。最后在測(cè)試集上評(píng)估效果扒俯。
Cross-validation(交叉驗(yàn)證)奶卓。如果你的訓(xùn)練集相對(duì)較小,人們有時(shí)使用更復(fù)雜的一種方法用于調(diào)整超參數(shù)撼玄,叫做cross-validation(交叉驗(yàn)證)夺姑。使用之前的例子,想法不是簡(jiǎn)單的隨機(jī)選出1000個(gè)圖片當(dāng)做驗(yàn)證集掌猛,剩下的當(dāng)訓(xùn)練集盏浙。你可以通過對(duì)不同的驗(yàn)證集進(jìn)行迭代并對(duì)這些性能進(jìn)行平均,您可以得到一個(gè)更好且較少噪聲的估計(jì)k的某個(gè)值的工作情況荔茬。比如5折交叉驗(yàn)證废膘,我們將訓(xùn)練集平均分為5個(gè)部分,其中4個(gè)用于訓(xùn)練慕蔚,1個(gè)用于驗(yàn)證丐黄。然后我們迭代5次,讓每一個(gè)部分都能當(dāng)一次驗(yàn)證集孔飒,評(píng)估分類器的性能灌闺,最后在不同折上取平均性能。
一個(gè)例子坏瞄,針對(duì)k值的5折交叉驗(yàn)證桂对。對(duì)于每一個(gè)k值我們?cè)?折上訓(xùn)練然后在第5折上驗(yàn)證。因此鸠匀,對(duì)于每一個(gè)k值我們有5個(gè)準(zhǔn)確率結(jié)果蕉斜。(準(zhǔn)確率在圖中為y軸,每一個(gè)結(jié)果是一個(gè)點(diǎn)。趨勢(shì)線是每個(gè)k值5個(gè)結(jié)果的平均值連接而成蛛勉,上下邊界表示標(biāo)準(zhǔn)差鹿寻。注意在這個(gè)例子中,交叉驗(yàn)證顯示k=7時(shí)分類器效果最好诽凌。(對(duì)應(yīng)圖片中趨勢(shì)線的峰值)毡熏。如果我們使用更多折的交叉驗(yàn)證,我們會(huì)看到更加平滑的曲線侣诵。
In practice痢法。實(shí)際過程中,人們一般更偏向于避免使用交叉驗(yàn)證杜顺,而是分出一個(gè)獨(dú)一無二的驗(yàn)證集财搁,因?yàn)榻徊骝?yàn)證的計(jì)算成本比較高。一般使用訓(xùn)練集的50%-90%用于訓(xùn)練躬络,剩下的數(shù)據(jù)用于驗(yàn)證尖奔。然而分割訓(xùn)練集數(shù)據(jù)依賴于很多條件:比如如果超參數(shù)的數(shù)量比較多那么你應(yīng)該使用更大的驗(yàn)證集。如果驗(yàn)證集中的樣本數(shù)量較少(可能只有幾百個(gè))穷当,最好使用交叉驗(yàn)證提茁。典型的選擇是3折,5折馁菜,10折交叉驗(yàn)證茴扁。
一般的數(shù)據(jù)分割。一個(gè)訓(xùn)練集和一個(gè)測(cè)試集是給定的汪疮。訓(xùn)練集被分為若干折(這里是5折)峭火。1-4折成為訓(xùn)練集嘿棘。一折(這里黃色的fold 5)作為驗(yàn)證集用于調(diào)整超參數(shù)肪获。交叉驗(yàn)證的下一步就是迭代,讓每一折都做一次驗(yàn)證集帮坚,這就是5折交叉驗(yàn)證盏道。最后一旦模型訓(xùn)練完成并且所有最優(yōu)超參數(shù)都已經(jīng)被確定坯苹,就可以用測(cè)試集(紅色部分)評(píng)估性能了。
最近鄰分類器的優(yōu)缺點(diǎn)
顯然摇天,一個(gè)優(yōu)點(diǎn)就是很容易理解和實(shí)現(xiàn)粹湃。另外這種分類器不需要時(shí)間去訓(xùn)練,因?yàn)樗枰闹皇谴鎯?chǔ)記憶訓(xùn)練集數(shù)據(jù)泉坐。然而在測(cè)試階段我們需要花費(fèi)不少算力为鳄,因?yàn)榻o一個(gè)測(cè)試用例分類需要和每一個(gè)訓(xùn)練樣本比較。這就是它的缺點(diǎn)腕让,因?yàn)閷?shí)際中我們更關(guān)注的是測(cè)試時(shí)的分類效率孤钦,而不是訓(xùn)練時(shí)的效率歧斟。實(shí)際上,之后我們學(xué)習(xí)的深度神經(jīng)網(wǎng)絡(luò)將這種權(quán)衡提升到了另外一個(gè)極端:訓(xùn)練時(shí)需要很大的算力偏形,但是一但訓(xùn)練結(jié)束静袖,分類時(shí)效率極高。這是實(shí)際中我們所期待的俊扭。
另外一方面队橙,最近鄰分類器的計(jì)算復(fù)雜度是很活躍的一個(gè)研究領(lǐng)域,一些近似最近鄰算法(Approximate Nearest Neighbor)(ANN)和存在的庫(kù)文件可以加速最近鄰在數(shù)據(jù)集中的查找速度(e.g. FLANN萨惑,這些算法允許在檢索期間將最近鄰居檢索的正確性與空間/時(shí)間復(fù)雜度進(jìn)行權(quán)衡捐康,并且通常依賴于涉及構(gòu)建kdtree或運(yùn)行k-means算法的預(yù)處理/索引階段。
最近鄰分類器有時(shí)在某些設(shè)定下是一個(gè)很好的選擇(尤其是當(dāng)數(shù)據(jù)是低維度的時(shí)候)庸蔼,但是實(shí)際中很少使用它去進(jìn)行圖片分類解总。一個(gè)問題是圖片都是高維度的對(duì)象(即圖片一般包含很多像素),計(jì)算高維度空間的距離是很不直觀姐仅。下面的圖片說明了我們之前構(gòu)建的基于像素之間L2相似度的想法和感知相似度是不同的:
在高維度基于像素的距離可以是很不直觀的花枫。一張?jiān)紙D片(左側(cè))和三張其他圖片的L2距離是完全相同的。顯然掏膏,像素間距離不能對(duì)應(yīng)所有的感知或者語(yǔ)義的相似程度劳翰。
這里有一個(gè)更加可視化的例子證明使用像素差異去比較圖片是不合適的。我們可以使用一個(gè)可視化工具叫做t-SNE壤追,使用CIFAR-10圖片,將它們嵌入到兩個(gè)維度之中供屉,以便保持它們(局部)距離行冰。在此可視化的基礎(chǔ)上,根據(jù)我們構(gòu)建的L2距離伶丐,附近的圖片被認(rèn)為是非常接近的:
使用t-SNE將CIFAR-10圖片嵌入到二維空間中悼做。基于L2距離哗魂,彼此靠近的圖片被認(rèn)為是很相似的肛走。注意圖片背景相比于圖片中真正的對(duì)象鎖帶來的更大影響。點(diǎn)擊這里看更完整的可視化結(jié)果录别。
注意彼此靠近的圖片更多是因?yàn)樗麄冾伾姆植即笾孪嗤嗌蛘呤潜尘邦愋痛笾孪嗤皇菆D片中的對(duì)象相同组题。比如葫男,一只狗可以被看做很接近一只狐貍因?yàn)閮蓮垐D片的背景都是白色。理想情況下崔列,我們希望所有10個(gè)類的圖像都能形成自己的簇梢褐,以便相同類的圖像彼此靠近,而不管無關(guān)的特征和變化(如背景)。 但是盈咳,要獲得此屬性耿眉,我們必須跨越原始像素。
總結(jié)
- 我們引入了圖像分類的問題鱼响,我們給定一組圖片鸣剪,這些圖片都標(biāo)注一個(gè)類別。然后我們想預(yù)測(cè)這些類別的一組新的測(cè)試圖片热押,并且測(cè)量預(yù)測(cè)的準(zhǔn)確性西傀。
- 我們引入了一個(gè)簡(jiǎn)單的分類器。稱為最近鄰分類器桶癣。我們看到有多個(gè)超參數(shù)(比如k的值拥褂,或者用于比較圖片差異的距離類型)與此分類器有關(guān),并且沒有直接明顯的選擇方式牙寞。
- 我們看到設(shè)置超參數(shù)的正確方法收益將訓(xùn)練集數(shù)據(jù)分為兩部分:訓(xùn)練集和驗(yàn)證集饺鹃。我們嘗試不同的超參數(shù)值,并且保留能讓驗(yàn)證集效果最好的超參數(shù)值间雀。
- 如果缺乏訓(xùn)練集數(shù)據(jù)悔详,我們引入交叉驗(yàn)證的方法,它可以幫助減少估計(jì)哪些超參數(shù)效果最好的噪聲惹挟。
- 一旦找到好的超參數(shù)茄螃,我們就用實(shí)際的測(cè)試集去執(zhí)行單一評(píng)估。
- 我們看到连锯,最近鄰在CIFAR-10上可以取得接近40%的準(zhǔn)確率归苍。實(shí)施起來很簡(jiǎn)單,但是需要存儲(chǔ)整個(gè)訓(xùn)練集运怖,并且測(cè)試時(shí)的計(jì)算成本非常高拼弃。
- 最后,我們看到在原始像素上使用L1或者L2距離是不夠的摇展,因?yàn)榫嚯x與圖像的背景和顏色分布相比與其語(yǔ)義內(nèi)容相關(guān)性更強(qiáng)吻氧。