注意:課程需要使用大量Python編程并使用Numpy 完成矩陣運(yùn)算技羔,所以學(xué)習(xí)本lecture的同時(shí)需要學(xué)習(xí)Python 和Numpy仔涩。使用教程:點(diǎn)擊這里
本課重點(diǎn):
-
數(shù)據(jù)驅(qū)動(dòng)方法
-
K-最近鄰算法
-
線性分類I——評(píng)分函數(shù)
0 引言
圖像分類是計(jì)算機(jī)視覺(jué)的核心任務(wù)耳高,計(jì)算機(jī)視覺(jué)領(lǐng)域中很多問(wèn)題(比如目標(biāo)檢測(cè)和分割)届搁,都可以被歸結(jié)為圖像分類問(wèn)題蚂子。圖像分類問(wèn)題萌庆,就是已有固定的分類標(biāo)簽集合燥透,然后對(duì)于輸入的圖像沙咏,從分類標(biāo)簽集合中找出一個(gè)分類標(biāo)簽辨图,最后把分類標(biāo)簽分配給該輸入圖像。
挑戰(zhàn)
計(jì)算機(jī)看到的圖像是一個(gè)像素矩陣肢藐,而人類給出的標(biāo)簽只是一個(gè)單詞故河,所以對(duì)計(jì)算機(jī)而言存在巨大的語(yǔ)義鴻溝。比如給計(jì)算機(jī)輸入下圖一張貓的圖片吆豹,計(jì)算機(jī)圖像分類模型會(huì)讀取該圖片鱼的,并計(jì)算該圖片屬于集合 {貓, 狗, 帽子, 杯子}中各個(gè)標(biāo)簽的概率。然而計(jì)算機(jī)讀取的圖像數(shù)據(jù)是一個(gè)由數(shù)字組成的巨大的3維數(shù)組痘煤。在下圖中凑阶,貓的圖像大小是寬248像素,高400像素速勇,有3個(gè)顏色通道晌砾,分別是紅、綠和藍(lán)(簡(jiǎn)稱RGB)烦磁。所以养匈,該圖像就包含了248X400X3=297600個(gè)數(shù)字,每個(gè)數(shù)字都是在范圍0-255之間的整型都伪,其中0表示全黑呕乎,255表示全白。我們的任務(wù)就是把這些數(shù)字變成一個(gè)簡(jiǎn)單的標(biāo)簽陨晶,比如“貓”猬仁。
圖像分類算法要足夠健壯(魯棒,robust)先誉,要至少能夠適應(yīng)下述變化及組合:
- 視角變化(Viewpoint variation):同一個(gè)物體湿刽,攝像機(jī)可以從多個(gè)角度來(lái)展現(xiàn)。
- 大小變化(Scale variation):物體可視的大小通常是會(huì)變化的(不僅是在圖片中褐耳,在真實(shí)世界中大小也是變化的)诈闺。
- 形變(Deformation):很多東西的形狀并非一成不變,會(huì)有很大變化铃芦。
- 遮擋(Occlusion):目標(biāo)物體可能被擋住雅镊。有時(shí)候只有物體的一小部分(可以小到幾個(gè)像素)是可見(jiàn)的。
- 光照條件(Illumination conditions):在像素層面上刃滓,光照的影響非常大仁烹。
- 背景干擾(Background clutter):物體可能混入背景之中,使之難以被辨認(rèn)咧虎。
- 類內(nèi)差異(Intra-class variation):一類物體的個(gè)體之間的外形差異很大卓缰,比如椅子。這一類物體有許多不同的對(duì)象,每個(gè)都有自己的外形征唬。
1 數(shù)據(jù)驅(qū)動(dòng)方法
如果采用硬編碼的方法編寫一個(gè)識(shí)別貓的算法震叮,可以輸入貓的圖片輸出標(biāo)簽“貓”,可以先獲取貓圖像的邊緣得到一些線條鳍鸵,然后定義規(guī)則比如三條線交叉是耳朵之類。然而這種方式的識(shí)別效果不好尉间,并且不能識(shí)別新的物體偿乖。
所以可以采用數(shù)據(jù)驅(qū)動(dòng)算法。即不具體寫出識(shí)別每個(gè)物體對(duì)應(yīng)的規(guī)則哲嘲,而是對(duì)每一類物體標(biāo)簽給計(jì)算機(jī)大量的圖片贪薪,采用機(jī)器學(xué)習(xí)的方法,計(jì)算機(jī)會(huì)收集所有的數(shù)據(jù)眠副,用某種方式總結(jié)画切,然后會(huì)生成一個(gè)分類器模型,總結(jié)出區(qū)分不同類物體的核心知識(shí)要素囱怕,然后用訓(xùn)練好的模型霍弹,識(shí)別新的圖像。過(guò)程如下:
- 輸入:輸入是包含N個(gè)圖像的集合娃弓,每個(gè)圖像的標(biāo)簽是K種分類標(biāo)簽中的一種典格。這個(gè)集合稱為訓(xùn)練集。
- 學(xué)習(xí):這一步的任務(wù)是使用訓(xùn)練集來(lái)學(xué)習(xí)每個(gè)類到底長(zhǎng)什么樣台丛。一般該步驟叫做訓(xùn)練分類器或者學(xué)習(xí)一個(gè)模型耍缴。
- 評(píng)價(jià):讓分類器來(lái)預(yù)測(cè)它未曾見(jiàn)過(guò)的圖像的分類標(biāo)簽,把分類器預(yù)測(cè)的標(biāo)簽和圖像真正的分類標(biāo)簽 (基本事實(shí)) 對(duì)比挽霉,并以此來(lái)評(píng)價(jià)分類器的質(zhì)量防嗡。
最鄰近算法(Nearest Neighbor )
第一個(gè)分類器算法。訓(xùn)練過(guò)程只是簡(jiǎn)單的記住圖像數(shù)據(jù)和標(biāo)簽侠坎,預(yù)測(cè)的時(shí)候和訓(xùn)練數(shù)據(jù)中圖片比較找出最接近的輸出標(biāo)簽蚁趁。這個(gè)分類器和卷積神經(jīng)網(wǎng)絡(luò)沒(méi)有任何關(guān)系,實(shí)際中也極少使用硅蹦,但通過(guò)實(shí)現(xiàn)它荣德,可以對(duì)解決圖像分類問(wèn)題的方法有個(gè)基本認(rèn)識(shí)。
圖像分類數(shù)據(jù)集:CIFAR-10一個(gè)非常流行的圖像分類數(shù)據(jù)集童芹。這個(gè)數(shù)據(jù)集包含10種分類標(biāo)簽涮瞻,60000張32X32的小圖像,每張圖片含有一個(gè)標(biāo)簽假褪。這60000張圖像被分為包含50000張(每種分類5000張)圖像的訓(xùn)練集和包含10000張圖像的測(cè)試集署咽。假設(shè)現(xiàn)在我們用這50000張圖片作為訓(xùn)練集,將余下的10000作為測(cè)試集并打上標(biāo)簽,Nearest Neighbor算法將會(huì)拿著測(cè)試圖片和訓(xùn)練集中每一張圖片去比較宁否,然后將它認(rèn)為最相似的那個(gè)訓(xùn)練集圖片的標(biāo)簽賦給這張測(cè)試圖片窒升。結(jié)果如下圖所示,效果并不是特別好慕匠。
那么具體如何比較兩張圖片呢?
L1距離(曼哈頓距離)
在本例中锅铅,就是比較32x32x3的像素塊酪呻。最簡(jiǎn)單的方法就是逐個(gè)像素比較,最后將差異值全部加起來(lái)盐须。即將兩張圖片先轉(zhuǎn)化為兩個(gè)向量 和
玩荠,然后計(jì)算他們的L1距離:
,其中
為像素點(diǎn)贼邓,
表示第
個(gè)像素點(diǎn)的值阶冈。
兩張圖片使用L1距離來(lái)進(jìn)行比較,即逐個(gè)像素求差值立帖,然后將所有差值加起來(lái)得到一個(gè)數(shù)值眼溶。如果兩張圖片一模一樣,那么L1距離為0晓勇,但是如果兩張圖片很是不同堂飞,那L1值將會(huì)非常大。下圖是僅一個(gè)RGB通道的4X4圖片計(jì)算L1距離绑咱。
首先绰筛,我們將CIFAR-10的數(shù)據(jù)加載到內(nèi)存中,并分成4個(gè)數(shù)組:訓(xùn)練數(shù)據(jù)和標(biāo)簽描融,測(cè)試數(shù)據(jù)和標(biāo)簽铝噩。在下面的代碼中,Xtr(大小是50000x32x32x3)存有訓(xùn)練集中所有的圖像窿克,Xte(大小是10000x3072)存有測(cè)試集中所有的圖像骏庸,Ytr 是對(duì)應(yīng)的長(zhǎng)度為50000的1維數(shù)組,存有圖像對(duì)應(yīng)的分類標(biāo)簽(從0到9)年叮,Yte 對(duì)應(yīng)長(zhǎng)度為10000的1維數(shù)組:
Xtr, Ytr, Xte, Yte = load_CIFAR10('data/cifar10/') # 這個(gè)函數(shù)可以加載CIFAR10的數(shù)據(jù)
# Xtr是一個(gè)50000x32x32x3的數(shù)組具被,一共50000個(gè)數(shù)據(jù),
# 每條數(shù)據(jù)都是32行32列的數(shù)組只损,數(shù)組每個(gè)元素都是一個(gè)三維數(shù)組一姿,表示RGB七咧。
# Xte是一個(gè)10000x32x32x3的數(shù)組;
# Ytr是一個(gè)長(zhǎng)度為50000的一維數(shù)組叮叹,Yte是一個(gè)長(zhǎng)度為10000的一維數(shù)組艾栋。
Xtr_rows = Xtr.reshape(Xtr.shape[0], 32 * 32 * 3)
# Xtr_rows是50000x3072的數(shù)組,按每個(gè)像素點(diǎn)排列蛉顽,每個(gè)像素點(diǎn)有三個(gè)值蝗砾。
Xte_rows = Xte.reshape(Xte.shape[0], 32 * 32 * 3)
# Xte_rows是10000x3072的數(shù)組
''' shape會(huì)返回?cái)?shù)組的行和列數(shù)元組:(行數(shù),列數(shù))携冤,shape[0]表示行數(shù),
Xtr.shape[0]會(huì)返回50000遥诉;Xtr.shape會(huì)返回(50000,32噪叙,32,3)
Xtr.reshape(50000霉翔,3072)會(huì)將Xtr 重構(gòu)成50000x3072數(shù)組睁蕾,等于 np.reshape(Xtr, (50000,3072))'''
現(xiàn)在我們得到所有的圖像數(shù)據(jù),每張圖片對(duì)應(yīng)一個(gè)長(zhǎng)度為3072的行向量债朵。接下來(lái)展示如何訓(xùn)練并評(píng)價(jià)一個(gè)分類器:
nn = NearestNeighbor() # 創(chuàng)建一個(gè)最鄰近分類器對(duì)象
nn.train(Xtr_rows, Ytr) # 用訓(xùn)練圖片數(shù)據(jù)和標(biāo)簽訓(xùn)練分類器
Yte_predict = nn.predict(Xte_rows) # 預(yù)測(cè)測(cè)試圖片的標(biāo)簽
# 并輸出預(yù)測(cè)準(zhǔn)確率子眶,是一個(gè)平均值
print 'accuracy: %f' % ( np.mean(Yte_predict == Yte) )
我們常常使用準(zhǔn)確率作為評(píng)價(jià)標(biāo)準(zhǔn),它描述了我們預(yù)測(cè)正確的得分序芦。請(qǐng)注意以后我們實(shí)現(xiàn)的所有分類器都需要有這個(gè)接口函數(shù)(API):train(X, y) 函數(shù)臭杰。該函數(shù)使用訓(xùn)練集的數(shù)據(jù)和標(biāo)簽來(lái)進(jìn)行訓(xùn)練谚中。從其內(nèi)部來(lái)看渴杆,類應(yīng)該實(shí)現(xiàn)一些關(guān)于標(biāo)簽和標(biāo)簽如何被預(yù)測(cè)的模型。這里還有個(gè)predict(X) 函數(shù)宪塔,它的作用是預(yù)測(cè)輸入的新數(shù)據(jù)的分類標(biāo)簽磁奖。下面就是使用L1距離的Nearest Neighbor分類器的實(shí)現(xiàn):
import numpy as np
class NearestNeighbor(object):
def __init__(self):
pass
def train(self, X, y):
""" X 是 NxD 維的數(shù)組,每一行都是一個(gè)樣本某筐,比如一張圖片比搭,D 是樣本的數(shù)據(jù)維度;
Y 是長(zhǎng)度為 N 的一維數(shù)組南誊。 """
# 最鄰近分類器只是簡(jiǎn)單的記住所有的訓(xùn)練數(shù)據(jù)
self.Xtr = X
self.ytr = y
def predict(self, X):
""" X 是 NxD 維的數(shù)組身诺,每一行都是一個(gè)希望預(yù)測(cè)其標(biāo)簽的樣本 """
num_test = X.shape[0]
# 確保輸出的標(biāo)簽數(shù)據(jù)類型和輸入的標(biāo)簽格式一致,長(zhǎng)度是測(cè)試樣本數(shù)
Ypred = np.zeros(num_test, dtype = self.ytr.dtype)
# 循環(huán)所有測(cè)試樣本數(shù)抄囚,即測(cè)試數(shù)組的行數(shù)
for i in range(num_test):
# 為第 i 張測(cè)試圖片找到最接近的訓(xùn)練圖片
# 使用 L1 距離 (差值的絕對(duì)值求和)
'''self.Xtr - X[i,:] 利用傳播機(jī)制霉赡,求測(cè)試集第 i 張圖片對(duì)應(yīng)的行向量和
訓(xùn)練集所有圖片行向量的差值,得到一個(gè)一個(gè)50000x3072的差值矩陣怠苔;
abs(self.Xtr - X[i,:] )會(huì)將矩陣所有元素求絕對(duì)值同廉;
然后axis = 1 會(huì)對(duì)差值矩陣按行求和,最終得到一個(gè)長(zhǎng)度為50000的一維
數(shù)組,存放第 i 張圖片和訓(xùn)練集所有50000張圖片的L1距離迫肖。'''
distances = np.sum(np.abs(self.Xtr - X[i,:]), axis = 1)
min_index = np.argmin(distances) # 獲取距離最小的訓(xùn)練集圖片索引
Ypred[i] = self.ytr[min_index] # 預(yù)測(cè)第 i 張測(cè)試集圖片的標(biāo)簽時(shí)與其最接近的訓(xùn)練集圖片索引
return Ypred
這段代碼的訓(xùn)練時(shí)間復(fù)雜度為 O(1)锅劝,因?yàn)橹皇呛?jiǎn)單的存儲(chǔ)數(shù)據(jù),不管數(shù)據(jù)多大蟆湖,都是一個(gè)相對(duì)固定的時(shí)間故爵;如果訓(xùn)練集有N個(gè)樣本,則預(yù)測(cè)時(shí)間復(fù)雜度為 O(N)隅津,因?yàn)闇y(cè)試圖片要和訓(xùn)練集每張圖片進(jìn)行比較诬垂。所以這是一個(gè)不好的分類器,分類器預(yù)測(cè)的時(shí)候要快伦仍,訓(xùn)練的時(shí)候可以慢结窘。
這段代碼跑CIFAR-10,準(zhǔn)確率能達(dá)到38.6%充蓝。這比隨機(jī)猜測(cè)的10%要好隧枫,但是比人類識(shí)別的水平和卷積神經(jīng)網(wǎng)絡(luò)能達(dá)到的95%還是差很多。(Kaggle算法競(jìng)賽排行榜)
L2距離(歐式距離)
另一個(gè)常用的方法是L2距離谓苟,從幾何學(xué)的角度官脓,可以理解為它在計(jì)算兩個(gè)向量間的歐式距離。L2距離的公式如下:
依舊是在計(jì)算像素間的差值涝焙,只是先求差值的平方卑笨,然后把這些平方全部加起來(lái),最后對(duì)這個(gè)和開(kāi)方仑撞。此時(shí)的代碼只需改動(dòng)一行:
distances = np.sqrt(np.sum(np.square(self.Xtr - X[i,:]), axis = 1))
'''np.square(self.Xtr - X[i,:]) 會(huì)對(duì)差值矩陣的每一個(gè)元素求平方'''
注意在這里使用了np.sqrt赤兴,但是在實(shí)際中可能不用。因?yàn)閷?duì)不同距離的絕對(duì)值求平方根雖然改變了數(shù)值大小隧哮,但依然保持了不同距離大小的順序搀缠。這個(gè)模型,正確率是35.4%近迁,比剛才低了一點(diǎn)艺普。
L1和L2比較
在 L1 距離更依賴于坐標(biāo)軸的選定,坐標(biāo)軸選擇不同L1距離也會(huì)跟著變化鉴竭,判定的數(shù)據(jù)歸類的邊界會(huì)更趨向于貼近坐標(biāo)系的軸來(lái)分割所屬區(qū)域歧譬,而 L2 的話相對(duì)來(lái)說(shuō)于坐標(biāo)系的關(guān)聯(lián)度沒(méi)那么大,會(huì)形成一個(gè)圓搏存,不跟隨坐標(biāo)軸變化瑰步;在面對(duì)兩個(gè)向量之間的差異時(shí),L2比L1更加不能容忍這些差異璧眠。也就是說(shuō)缩焦,相對(duì)于1個(gè)巨大的差異读虏,L2距離更傾向于接受多個(gè)中等程度的差異(因?yàn)闀?huì)把差值平方)。L1和L2都是在p-norm常用的特殊形式袁滥。
當(dāng)圖像中有特別在意的特征時(shí)可以選擇L1距離盖桥;當(dāng)對(duì)圖像中所有元素未知時(shí),L2距離會(huì)更自然一些题翻。最好的方式是兩種距離都嘗試揩徊,然后找出最好的那一個(gè)。
2 k-最近鄰分類器(k-Nearest Neighbor Classifier)
只用最相似的1張圖片的標(biāo)簽來(lái)作為測(cè)試圖像的標(biāo)簽很不合理嵌赠,可以使用k-Nearest Neighbor分類器塑荒。它的思想是:找最相似的k個(gè)圖片的標(biāo)簽,k中數(shù)量最多的標(biāo)簽作為對(duì)測(cè)試圖片的預(yù)測(cè)姜挺。當(dāng)k=1的時(shí)候齿税,k-Nearest Neighbor分類器就是上面所說(shuō)的最鄰近分類器。從直觀感受上就可以看到炊豪,更高的k值可以讓分類的效果更平滑偎窘,使得分類器對(duì)于異常值更有抵抗力。
2.1 超參數(shù)(hyperparameter)調(diào)優(yōu)
k-NN分類器需要設(shè)定k值滑臊,如何選擇k值最合適口芍?L1距離和L2距離選哪個(gè)比較好?還有不少選擇我們甚至都沒(méi)有考慮到(比如:點(diǎn)積)雇卷。所有這些選擇鬓椭,被稱為超參數(shù)颠猴。在基于數(shù)據(jù)進(jìn)行學(xué)習(xí)的機(jī)器學(xué)習(xí)算法設(shè)計(jì)中,超參數(shù)是很常見(jiàn)的小染。
一般說(shuō)來(lái)翘瓮,這些超參數(shù)只能在外部設(shè)置,不能自動(dòng)學(xué)習(xí)氧映,具體怎么設(shè)置或取值并不是顯而易見(jiàn)的春畔,需要嘗試不同的值,看哪個(gè)值表現(xiàn)最好就選哪個(gè)岛都。(特別注意:決不能使用測(cè)試集來(lái)進(jìn)行調(diào)優(yōu)律姨。如果使用測(cè)試集來(lái)調(diào)優(yōu),而且算法看起來(lái)效果不錯(cuò)臼疫,真正的危險(xiǎn)在于:算法實(shí)際部署后择份,性能可能會(huì)遠(yuǎn)低于預(yù)期。這種情況烫堤,稱之為算法對(duì)測(cè)試集過(guò)擬合荣赶。從另一個(gè)角度來(lái)說(shuō),如果使用測(cè)試集來(lái)調(diào)優(yōu)鸽斟,實(shí)際上就是把測(cè)試集當(dāng)做訓(xùn)練集拔创,由測(cè)試集訓(xùn)練出來(lái)的算法再預(yù)測(cè)測(cè)試集,性能自然會(huì)看起來(lái)很好富蓄,但實(shí)際部署起來(lái)效果就會(huì)差很多剩燥。所以,最終測(cè)試的時(shí)候再使用測(cè)試集立倍,可以很好地近似度量分類器的泛化性能灭红。)
測(cè)試數(shù)據(jù)集只能使用一次,而且是在訓(xùn)練完成后評(píng)價(jià)最終模型時(shí)使用口注,不可用來(lái)調(diào)優(yōu)变擒!
方法1:設(shè)置驗(yàn)證集
從訓(xùn)練集中取出一部分?jǐn)?shù)據(jù)用來(lái)調(diào)優(yōu),稱之為驗(yàn)證集(validation set)寝志。以CIFAR-10為例娇斑,可以用49000個(gè)圖像作為訓(xùn)練集,用1000個(gè)圖像作為驗(yàn)證集材部。驗(yàn)證集其實(shí)就是作為假的測(cè)試集來(lái)調(diào)優(yōu)悠菜。代碼如下:
# 假設(shè) Xtr_rows, Ytr, Xte_rows, Yte 還是和之前一樣
# Xtr_rows 是 50,000 x 3072 的矩陣
Xval_rows = Xtr_rows[:1000, :] # 取前 1000 個(gè)訓(xùn)練集樣本作為驗(yàn)證集
Yval = Ytr[:1000]
Xtr_rows = Xtr_rows[1000:, :] # 剩下的 49,000 個(gè)作為訓(xùn)練集
Ytr = Ytr[1000:]
# 找出在驗(yàn)證集表現(xiàn)最好的超參數(shù) k
validation_accuracies = []
for k in [1, 3, 5, 10, 20, 50, 100]:
# 使用一個(gè)明確的 k 值評(píng)估驗(yàn)證集
nn = NearestNeighbor()
nn.train(Xtr_rows, Ytr)
# 這里假設(shè)一個(gè)修正過(guò)的 NearestNeighbor 類,可以把 k 值作為參數(shù)輸入
Yval_predict = nn.predict(Xval_rows, k = k)
acc = np.mean(Yval_predict == Yval)
print 'accuracy: %f' % (acc,)
# 把每個(gè) k 值和相應(yīng)的準(zhǔn)確率保存起來(lái)
validation_accuracies.append((k, acc))
程序結(jié)束后败富,作圖分析出哪個(gè)k值表現(xiàn)最好悔醋,然后用這個(gè)k值來(lái)跑真正的測(cè)試集,并作出對(duì)算法的評(píng)價(jià)兽叮。
方法2:交叉驗(yàn)證
訓(xùn)練集數(shù)量較蟹医尽(因此驗(yàn)證集的數(shù)量更谢浮)時(shí),可以使用交叉驗(yàn)證的方法账阻。還是用剛才的例子蒂秘,如果是交叉驗(yàn)證集,我們就不是取1000個(gè)圖像淘太,而是將訓(xùn)練集平均分成5份姻僧,每份10000張圖片 ,其中4份用來(lái)訓(xùn)練蒲牧,1份用來(lái)驗(yàn)證撇贺。然后我們循環(huán)著取其中4份來(lái)訓(xùn)練,其中1份來(lái)驗(yàn)證冰抢,最后取所有5次驗(yàn)證結(jié)果的平均值作為算法驗(yàn)證結(jié)果松嘶。
實(shí)際情況下燥狰,深度學(xué)習(xí)不會(huì)使用交叉驗(yàn)證,主要是因?yàn)樗鼤?huì)耗費(fèi)較多的計(jì)算資源斜筐。一般直接把訓(xùn)練集按照50%-90%的比例分成訓(xùn)練集和驗(yàn)證集龙致。但是訓(xùn)練集數(shù)量不多時(shí)可以使用交叉驗(yàn)證,一般都是分成3顷链、5和10份目代。
2.2 k-Nearest Neighbor分類器的優(yōu)劣
優(yōu)點(diǎn):
易于理解,實(shí)現(xiàn)簡(jiǎn)單嗤练;算法的訓(xùn)練不需要花時(shí)間榛了,因?yàn)槠溆?xùn)練過(guò)程只是將訓(xùn)練集數(shù)據(jù)存儲(chǔ)起來(lái)。
缺點(diǎn):
1煞抬、測(cè)試要花費(fèi)大量時(shí)間霜大,因?yàn)槊總€(gè)測(cè)試圖像需要和所有存儲(chǔ)的訓(xùn)練圖像進(jìn)行比較在實(shí)際應(yīng)用中,關(guān)注測(cè)試效率遠(yuǎn)遠(yuǎn)高于訓(xùn)練效率革答;
2战坤、使用像素差異來(lái)比較圖像是不夠的曙强,圖片間L2距離小,更多的是被背景主導(dǎo)而不是圖片語(yǔ)義內(nèi)容本身主導(dǎo)途茫,往往背景相似圖片的L2距離就會(huì)小碟嘴。也就是說(shuō),在高維度數(shù)據(jù)上囊卜,基于像素的相似和基于感官上的相似非常不同娜扇。感官上不同的兩張圖片,可能有相同的L2距離栅组。
3雀瓢、維度災(zāi)難。k-NN 有點(diǎn)像訓(xùn)練數(shù)據(jù)把樣本空間分成幾塊笑窜,我們需要訓(xùn)練數(shù)據(jù)密集的分布在樣本空間里致燥,否則測(cè)試圖片的最鄰近點(diǎn)可能實(shí)際距離會(huì)非常遠(yuǎn),導(dǎo)致和最接近的訓(xùn)練集樣本實(shí)際上完全不同排截。但是如果使訓(xùn)練數(shù)據(jù)密集分布嫌蚤,需要的訓(xùn)練集數(shù)量指數(shù)倍增加,是數(shù)據(jù)維度的平方断傲。
2.3 實(shí)際應(yīng)用k-NN
1. 預(yù)處理數(shù)據(jù):對(duì)數(shù)據(jù)中的特征進(jìn)行歸一化(normalize)脱吱,讓其具有零均值(zero mean)和單位方差(unit variance)。本小節(jié)不討論认罩,是因?yàn)閳D像中的像素都是同質(zhì)的箱蝠,不會(huì)表現(xiàn)出較大的差異分布,不需要標(biāo)準(zhǔn)化處理垦垂。
2. 降維:如果數(shù)據(jù)是高維數(shù)據(jù)宦搬,考慮使用降維方法逾滥,比如PCA或者隨機(jī)投影稚伍。
3. 將數(shù)據(jù)隨機(jī)分入訓(xùn)練集和驗(yàn)證集:一般規(guī)律,70%-90% 數(shù)據(jù)作為訓(xùn)練集教寂。這個(gè)比例根據(jù)算法中有多少超參數(shù)页慷,以及這些超參數(shù)對(duì)于算法的預(yù)期影響來(lái)決定憔足。如果需要預(yù)測(cè)的超參數(shù)很多,那么就應(yīng)該使用更大的驗(yàn)證集來(lái)有效地估計(jì)它們酒繁;如果擔(dān)心驗(yàn)證集數(shù)量不夠滓彰,那么就嘗試交叉驗(yàn)證方法;如果計(jì)算資源足夠州袒,使用交叉驗(yàn)證更好(份數(shù)越多揭绑,效果越好,也更耗費(fèi)計(jì)算資源)郎哭。
4. 在驗(yàn)證集上調(diào)優(yōu):嘗試足夠多的k值洗做,嘗試L1和L2兩種范數(shù)計(jì)算方式弓叛。
5. 加速分類器:如果分類器跑得太慢,嘗試使用ANN庫(kù)(比如FLANN來(lái)加速這個(gè)過(guò)程诚纸,其代價(jià)是降低一些準(zhǔn)確率撰筷。
6. 對(duì)最優(yōu)的超參數(shù)做記錄:記錄最優(yōu)參數(shù)后,不要使用最優(yōu)參數(shù)的算法在完整的訓(xùn)練集上運(yùn)行并再次訓(xùn)練畦徘,這樣做會(huì)破壞對(duì)于最優(yōu)參數(shù)的估計(jì)毕籽。直接使用測(cè)試集來(lái)測(cè)試用最優(yōu)參數(shù)設(shè)置好的最優(yōu)模型,得到測(cè)試集數(shù)據(jù)的分類準(zhǔn)確率井辆,并以此作為你的k-NN分類器在該數(shù)據(jù)上的性能表現(xiàn)关筒。
3 線性分類I——評(píng)分函數(shù)
3.1 線性分類概述
k-NN 模型中訓(xùn)練過(guò)程中沒(méi)有使用任何參數(shù),只是單純的把訓(xùn)練數(shù)據(jù)存儲(chǔ)起來(lái)(參數(shù) k 是在預(yù)測(cè)中使用的杯缺,找出 k 個(gè)接近的圖片蒸播,然后找出標(biāo)簽最多的,并且 k 是超參數(shù)萍肆,是人為設(shè)定的袍榆。)。與之相對(duì)的是參數(shù)模型塘揣,參數(shù)模型往往會(huì)在訓(xùn)練完成后得到一組參數(shù)包雀,之后就可以完全扔掉訓(xùn)練數(shù)據(jù),預(yù)測(cè)的時(shí)候只需和這組參數(shù)做某種運(yùn)算亲铡,即可根據(jù)運(yùn)算結(jié)果做出判斷才写。線性分類器是參數(shù)模型里最簡(jiǎn)單的一種,但卻是神經(jīng)網(wǎng)絡(luò)里很重要的基礎(chǔ)模塊奖蔓。
線性分類的方法由兩部分組成赞草,一個(gè)是評(píng)分函數(shù)(score function),它是原始圖像數(shù)據(jù)到類別分值的映射吆鹤。另一個(gè)是損失函數(shù)(loss function)厨疙,它用來(lái)量化評(píng)分函數(shù)計(jì)算的分?jǐn)?shù)與真實(shí)標(biāo)簽之間的一致性。該方法可轉(zhuǎn)化為一個(gè)最優(yōu)化問(wèn)題檀头,在最優(yōu)化過(guò)程中轰异,通過(guò)更新評(píng)分函數(shù)的參數(shù)來(lái)最小化損失函數(shù)值岖沛。
評(píng)分函數(shù):從圖像到類別分值的參數(shù)化映射
評(píng)分函數(shù)將圖像的像素值映射為各個(gè)分類類別的得分暑始,得分高低代表圖像屬于該類別的可能性高低。上面的所有說(shuō)明都比較抽象婴削,下面以具體的例子說(shuō)明廊镜。
重新回到 k-NN 使用的CIFAR-10圖像分類數(shù)據(jù)集。假設(shè)我們的訓(xùn)練集有 N 個(gè)樣本唉俗,這里 N=50000嗤朴,每個(gè)樣本配椭,其中 i = 1,2,..N,這里的 D=3072雹姊;每個(gè)
對(duì)應(yīng)著一個(gè)標(biāo)簽
股缸,
在[1, K]上取值,K 表示總分類數(shù)吱雏,這里 K=10《匾觯現(xiàn)在可以定義評(píng)分函數(shù):
,即把一個(gè)D 維的圖像映射為K 個(gè)類別的分?jǐn)?shù)歧杏。
直接能想到的一個(gè)模型就是參數(shù)和輸入數(shù)據(jù)相乘的形式镰惦。比如:
,其中參數(shù)
被稱為權(quán)重犬绒,
被稱為偏差向量
在上面的公式中旺入,假設(shè)每個(gè)圖像數(shù)據(jù)都被拉長(zhǎng)為一個(gè)長(zhǎng)度為D的列向量,大小為[D x 1]凯力。其中大小為 [K x D] 的矩陣和大小為 [K x 1] 的列向量
為該函數(shù)的參數(shù)(parameters)茵瘾。還是以CIFAR-10為例,
就包含了第 i 個(gè)圖像的所有像素信息沮协,這些信息被拉成為一個(gè)[3072 x 1]的列向量龄捡,
大小為[10x3072],
的大小為[10x1]慷暂。因此聘殖,輸入3072個(gè)數(shù)字(原始像素?cái)?shù)值),函數(shù)輸出10個(gè)數(shù)字(不同分類得到的分值)行瑞,是一個(gè)3072維到10維的映射奸腺。
注意:
- 常常混用權(quán)重(weights)和參數(shù)(parameters)這兩個(gè)術(shù)語(yǔ)血久,實(shí)際上數(shù)據(jù)和參數(shù)相乘突照,就相當(dāng)于數(shù)據(jù)占的比重,這個(gè)權(quán)重就是參數(shù)值氧吐;
- 該方法的一個(gè)優(yōu)勢(shì)是訓(xùn)練數(shù)據(jù)是用來(lái)學(xué)習(xí)參數(shù)
和
的讹蘑,一旦訓(xùn)練完成,訓(xùn)練數(shù)據(jù)就可以丟棄筑舅,留下學(xué)習(xí)到的參數(shù)即可座慰。當(dāng)測(cè)試圖像時(shí)可以簡(jiǎn)單地把圖像數(shù)據(jù)輸入給函數(shù),函數(shù)計(jì)算出的分類分值來(lái)進(jìn)行分類翠拣;
- 輸入數(shù)據(jù)
是給定且不可改變的版仔,但參數(shù)
和
是可改變的。目標(biāo)就是通過(guò)改變這些參數(shù),使得計(jì)算出來(lái)的分類分值情況和訓(xùn)練集中圖像數(shù)據(jù)的真實(shí)類別標(biāo)簽相符蛮粮;
- 只需一個(gè)矩陣乘法和一個(gè)矩陣加法就能對(duì)一個(gè)測(cè)試數(shù)據(jù)分類益缎,這比k-NN中將測(cè)試圖像和所有訓(xùn)練數(shù)據(jù)做比較的方法快多了。
3.2 理解線性分類器
理解一:W是所有分類器的組合
如上圖所示然想,將小貓的圖像像素?cái)?shù)據(jù)拉伸成一個(gè)列向量xi莺奔,這里為方便說(shuō)明,假設(shè)圖像只有4個(gè)像素(都是黑白像素变泄,不考慮RGB通道)弊仪,即 D=4;有3個(gè)分類(紅色代表貓杖刷,綠色代表狗励饵,藍(lán)色代表船,顏色僅代表分類滑燃,和RGB通道沒(méi)有關(guān)系)役听,即 K=3。W 矩陣乘列向量xi表窘,得到各個(gè)分類的分值典予。實(shí)際上,我們可以看到乐严,參數(shù)矩陣 W 相當(dāng)于是三個(gè)分類器的組合瘤袖,W 的每一行都是一個(gè)分類器,分別對(duì)應(yīng)貓昂验、狗捂敌、船。每個(gè)分類器的參數(shù)個(gè)數(shù)等于圖像數(shù)據(jù)的維度既琴,每個(gè)像素和對(duì)應(yīng)的參數(shù)相乘占婉,就表示該像素在該分類器中應(yīng)占的比重。需要注意的是甫恩,這個(gè) W 一點(diǎn)也不好:貓分類的分值非常低逆济。從上圖來(lái)看,算法倒是覺(jué)得這個(gè)圖像是一只狗磺箕。
抽象一點(diǎn)的說(shuō)法奖慌,線性分類器會(huì)計(jì)算圖像中3個(gè)顏色通道中所有像素的值與權(quán)重矩陣的乘積,從而得到分類分值松靡。根據(jù)我們對(duì)權(quán)重設(shè)置的值简僧,對(duì)于圖像中的某些位置的某些顏色,函數(shù)表現(xiàn)出喜好或者厭惡(根據(jù)每個(gè)權(quán)重的符號(hào)而定)击困。舉個(gè)例子涎劈,可以想象“船”分類就是被大量的藍(lán)色所包圍(對(duì)應(yīng)的就是水)。那么“船”分類器在藍(lán)色通道上的權(quán)重就有很多的正權(quán)重(它們的出現(xiàn)提高了“船”分類的分值)阅茶,而在綠色和紅色通道上的權(quán)重為負(fù)的就比較多(它們的出現(xiàn)降低了“船”分類的分值)蛛枚。從上面的小貓示例也能看出,貓分類器對(duì)第二個(gè)位置的像素比較“厭惡”脸哀,而恰好輸入的小貓圖像第二個(gè)位置像素值很大蹦浦,從而導(dǎo)致得到一個(gè)很低的分?jǐn)?shù)。(當(dāng)然撞蜂,這個(gè)分類器是錯(cuò)誤的盲镶。)
理解二:將線性分類器看做模板匹配
把權(quán)重W的每一行看作一個(gè)分類的模板,一張圖像對(duì)應(yīng)不同分類的得分蝌诡,是通過(guò)使用內(nèi)積(也叫點(diǎn)積)來(lái)比較圖像和模板溉贿,然后找到和哪個(gè)模板最相似。從這個(gè)角度來(lái)看浦旱,線性分類器就是在利用學(xué)習(xí)到的模板宇色,針對(duì)圖像做模板匹配。從另一個(gè)角度來(lái)看颁湖,可以認(rèn)為還是在高效地使用k-NN宣蠕,不同的是我們沒(méi)有使用所有的訓(xùn)練集的圖像來(lái)比較,而是每個(gè)類別只用了一張圖片(這張圖片是我們學(xué)習(xí)到的甥捺,而不是訓(xùn)練集中的某一張)抢蚀,而且我們會(huì)使用(負(fù))內(nèi)積來(lái)計(jì)算向量間的距離,而不是使用L1或者L2距離镰禾。
理解三:將圖像看做高維度的點(diǎn)
既然定義每個(gè)分類類別的分值是權(quán)重和圖像的矩陣乘積闽烙,那么每個(gè)分類類別的分?jǐn)?shù)就是這個(gè)空間中的一個(gè)線性函數(shù)的函數(shù)值翅睛。我們沒(méi)辦法可視化3072維空間中的線性函數(shù)声搁,但假設(shè)把這些維度擠壓到二維,那么就可以看看這些分類器在做什么了:
其中每個(gè)圖像是一個(gè)點(diǎn)捕发,有3個(gè)分類器疏旨。以紅色的汽車分類器為例,紅線表示空間中汽車分類分?jǐn)?shù)為0的點(diǎn)的集合扎酷,紅色的箭頭表示分值上升的方向檐涝。所有紅線右邊的點(diǎn)的分?jǐn)?shù)值均為正,且線性升高法挨。紅線左邊的點(diǎn)分值為負(fù)谁榜,且線性降低。
從上面可以看到凡纳,W的每一行都是一個(gè)分類類別的分類器窃植。對(duì)于這些數(shù)字的幾何解釋是:如果改變其中一行的數(shù)字,會(huì)看見(jiàn)分類器在空間中對(duì)應(yīng)的直線開(kāi)始向著不同方向旋轉(zhuǎn)荐糜。而偏差b撕瞧,則允許分類器對(duì)應(yīng)的直線平移。需要注意的是狞尔,如果沒(méi)有偏差丛版,無(wú)論權(quán)重如何,在時(shí)分類分值始終為0偏序。這樣所有分類器的線都不得不穿過(guò)原點(diǎn)页畦。
3.3 偏差和權(quán)重合并
分開(kāi)處理這兩個(gè)參數(shù)(權(quán)重參數(shù)和偏差參數(shù)
)有點(diǎn)笨拙,一般常用的方法是把兩個(gè)參數(shù)放到同一個(gè)矩陣中研儒,同時(shí)列向量
就要增加一個(gè)維度豫缨,這個(gè)維度的數(shù)值是常量1,這就是默認(rèn)的偏差維度端朵。這樣新的公式就簡(jiǎn)化成下面這樣:
還是以CIFAR-10為例好芭,那么的大小就變成[3073x1],而不是 [3072x1] 了冲呢,多出了包含常量1的1個(gè)維度舍败;
大小就是[10x3073]了,
中多出來(lái)的這一列對(duì)應(yīng)的就是偏差值
敬拓,具體見(jiàn)下圖:
通過(guò)右邊這樣做邻薯,就只需要學(xué)習(xí)一個(gè)權(quán)重矩陣,而不用去學(xué)習(xí)兩個(gè)分別裝著權(quán)重和偏差的矩陣乘凸。
3.4 圖像數(shù)據(jù)預(yù)處理
在上面的例子中厕诡,所有圖像都是使用的原始像素值(從0到255)。在機(jī)器學(xué)習(xí)中营勤,對(duì)于輸入的特征做歸一化(normalization)處理是常見(jiàn)的方式灵嫌。而在圖像分類的例子中壹罚,圖像上的每個(gè)像素可以看做一個(gè)特征。在實(shí)踐中寿羞,對(duì)每個(gè)特征減去平均值來(lái)中心化數(shù)據(jù)是非常重要的猖凛。在這些圖片的例子中,該步驟是根據(jù)訓(xùn)練集中所有的圖像計(jì)算出一個(gè)平均圖像值稠曼,然后每個(gè)圖像都減去這個(gè)平均值,這樣圖像的像素值就大約分布在[-127, 127]之間了客年。下一個(gè)常見(jiàn)步驟是霞幅,讓所有數(shù)值分布的區(qū)間變?yōu)閇-1, 1]。
3.5 線性分類器難以處理的情形
這三種情形都無(wú)法找到合適的直線區(qū)分開(kāi)量瓜。case1是奇偶分類司恳,case3是有多個(gè)模型。
總結(jié)
- 圖像分類中的困難與挑戰(zhàn)绍傲;
- 數(shù)據(jù)驅(qū)動(dòng)方法扔傅、最鄰近算法、L1和L2距離烫饼;
- k-NN分類器猎塞、超參數(shù)調(diào)優(yōu)、k-NN的優(yōu)缺點(diǎn)與實(shí)際應(yīng)用杠纵;
- 線性分類的概念荠耽、評(píng)分函數(shù)的理解、參數(shù)合并比藻、數(shù)據(jù)預(yù)處理铝量。