日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

斯坦福大学李飞飞团队图像分类课程笔记

發布時間:2023/11/28 生活经验 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 斯坦福大学李飞飞团队图像分类课程笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

斯坦福大學李飛飛團隊圖像分類課程筆記

    Stanford image classification course notes

這是斯坦福CS231n課程圖像分類基礎知識。

目標:這一節先介紹圖像分類基本特征。

圖像分類,簡單的來說其實就是一個輸入圖像,輸出對該圖像內容分類的描述結果的問題。圖像分類是計算機視覺領域核心知識之一,實際應用廣泛。圖像分類的傳統方法是特征描述及檢測,這可能對于一些簡單的圖像分類是非常有效,但現實生活中的實際情況非常復雜,傳統的分類方法效果較差。其主要任務是給定一個輸入圖片,在一定的標簽幾個中,輸出該輸入對應的集合中其中一類的標簽。

舉例:在下面貓的圖片中,圖片被表示成一個3維數字矩陣(RGB彩色圖片)。其中,圖像分類的目標就是將這組數字矩陣轉換到一個單獨的標簽(如“Cat”),主要任務是對于一個給定的圖片,預測其類別標簽。

困難&挑戰:對于人類來說,識別貓已經是特別簡單的事情,因為之前就大量接觸貓這類圖像,對其獨特的特征有深入的認識,所以人類識別貓就是一個簡單的任務,但是對于計算機,那就難于上青天。

在下面,列舉了至今計算機視覺領域的棘手問題,也是現在亟待需解決的困難:

·
剛體&非剛體的變化:不同類型其變化都不一樣;

·
多視角:收集同一個物體圖像,獲取的角度是多變的;

·
多尺度:在實際應用中,很多物體的尺寸都是千變萬化;

·
隨機遮擋:圖片中的目標可能被隨意擋住。有時候只有小部分是可見的,學習特征較偏面;

·
光照條件:在像素層面上,光照的影響非常大;

·
類內差異:一類物體的個體之間有許多不同的對象,每個都有自己的外形。

數據驅動方法:如何寫一個圖像分類的算法呢?怎么寫一個從圖像中認出貓的算法?

因此,采取的方法和教小孩兒看圖識物類似:給模型很多圖像數據,讓其不斷去學習,學習到每個類的特征。這就是數據驅動方法!

既然第一步需要將已經做好分類標注的圖片作為訓練集,下面就看看訓練數據集長什么樣?如下圖:

圖像分類流程。在課程視頻中,圖像分類就是輸入元素為像素值的數組(灰色圖片和彩色圖片維度不一樣),然后給它分配一個分類標簽。完整流程如下:

·
輸入:輸入是包含N個圖像的集合,每個圖像的標簽是K種分類標簽中的一種。這個集合稱為訓練集。

·
訓練:該階段的任務是使用訓練集來學習每個類到底長什么樣,也就是學習每個類別獨特的特征。一般該步驟叫做訓練分類器或者訓練一個分類模型。

·
測試:讓分類器來預測它未曾見過的圖像的分類標簽,并以此來評價分類器的質量。會把分類器預測的標簽和圖像真正的分類標簽對比。毫無疑問,分類器預測的分類標簽和圖像真正的分類標簽如果一致,那就是好事,這樣的情況越多越好。

Nearest Neighbor分類器

實現一個Nearest
Neighbor分類器。雖然這個分類器和卷積神經網絡沒有任何關系,實際中也極少使用,但通過實現它,可以讓讀者對于解決圖像分類問題的方法有個基本的認識。

圖像分類數據集:CIFAR-10。一個非常流行的圖像分類數據集是CIFAR-10。這個數據集包含了60000張32X32的小圖像,一共有10個類別。這60000張圖像被分為包含50000的訓練集和包含10000的測試集。在下圖中可以看見10個類的10張隨機圖片。

假設現在有CIFAR-10的50000張圖片作為訓練集,希望將余下的10000作為測試集并給他們打上標簽。Nearest Neighbor算法將會拿著測試圖片和訓練集中每一張圖片去比較,然后將它認為最相似的那個訓練集圖片的標簽賦給這張測試圖片。上面右邊的圖片就展示了這樣的結果。請注意上面10個分類中,只有3個是準確的。比如第8行中,馬頭被分類為一個紅色的跑車,原因在于紅色跑車的黑色背景非常強烈,所以這匹馬就被錯誤分類為跑車了。

那么具體如何比較兩張圖片呢?在本例中,就是比較32x32x3的像素塊。最簡單的方法就是逐個像素比較,最后將差異值全部加起來。換句話說,就是將兩張圖片先轉化為兩個向量和,然后計算他們的L1距離:

這里的求和是針對所有的像素。下面是整個比較流程的圖例:

以圖片中的一個顏色通道為例來進行說明。兩張圖片使用L1距離來進行比較。逐個像素求差值,然后將所有差值加起來得到一個數值。如果兩張圖片一模一樣,那么L1距離為0,但是如果兩張圖片很是不同,那L1值將會非常大。

下面,讓我們看看如何用代碼來實現這個分類器。首先,我們將CIFAR-10的數據加載到內存中,并分成4個數組:訓練數據和標簽,測試數據和標簽。在下面的代碼中,Xtr(大小是50000x32x32x3)存有訓練集中所有的圖像,Ytr是對應的長度為50000的1維數組,存有圖像對應的分類標簽(從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

現在我們得到所有的圖像數據,并且把他們拉長成為行向量了。接下來展示如何訓練并評價一個分類器:

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) )

作為評價標準,常常使用準確率,它描述了預測正確的得分。請注意以后實現的所有分類器都需要有這個API:train(X, y)函數。該函數使用訓練集的數據和標簽來進行訓練。從其內部來看,類應該實現一些關于標簽和標簽如何被預測的模型。這里還有個predict(X)函數,它的作用是預測輸入的新數據的分類標簽。現在還沒介紹分類器的實現,下面就是使用L1距離的Nearest Neighbor分類器的實現套路:

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 dataself.Xtr = Xself.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 typeYpred = np.zeros(num_test, dtype

=
self.ytr.dtype)

# loop over all test rowsfor 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

  min_index = np.argmin(distances) # get the index with smallest distanceYpred[i] = self.ytr[min_index]

predict the label of the nearest example

return Ypred

如果用這段代碼跑CIFAR-10,會發現準確率能達到38.6%。這比隨機猜測的10%要好,但是比人類識別的水平(據研究推測是94%)和卷積神經網絡能達到的95%還是差多了。點擊查看基于CIFAR-10數據的Kaggle算法競賽排行榜。

距離選擇:計算向量間的距離有很多種方法,另一個常用的方法是L2距離,從幾何學的角度,可以理解為它在計算兩個向量間的歐式距離。L2距離的公式如下:

換句話說,依舊是在計算像素間的差值,只是先求其平方,然后把這些平方全部加起來,最后對這個和開方。在Numpy中,只需要替換上面代碼中的1行代碼就行:

distances = np.sqrt(np.sum(np.square(self.Xtr - X[i,:]), axis = 1))

注意在這里使用了np.sqrt,但是在實際中可能不用。因為求平方根函數是一個單調函數,它對不同距離的絕對值求平方根雖然改變了數值大小,但依然保持了不同距離大小的順序。所以用不用它,都能夠對像素差異的大小進行正確比較。如果在CIFAR-10上面跑這個模型,正確率是35.4%,比剛才低了一點。

L1和L2比較。比較這兩個度量方式是挺有意思的。在面對兩個向量之間的差異時,L2比L1更加不能容忍這些差異。也就是說,相對于1個巨大的差異,L2距離更傾向于接受多個中等程度的差異。L1和L2都是在p-norm常用的特殊形式。

k-Nearest Neighbor分類器

可能注意到了,為什么只用最相似的1張圖片的標簽來作為測試圖像的標簽呢?這不是很奇怪嗎!是的,使用k-Nearest Neighbor分類器就能做得更好。它的思想很簡單:與其只找最相近的那1個圖片的標簽,找最相似的k個圖片的標簽,然后讓他們針對測試圖片進行投票,最后把票數最高的標簽作為對測試圖片的預測。所以當k=1的時候,k-Nearest Neighbor分類器就是Nearest Neighbor分類器。從直觀感受上就可以看到,更高的k值可以讓分類的效果更平滑,使得分類器對于異常值更有抵抗力。

上面示例展示了Nearest Neighbor分類器和5-Nearest Neighbor分類器的區別。例子使用了2維的點來表示,分成3類(紅、藍和綠)。不同顏色區域代表的是使用L2距離的分類器的決策邊界。白色的區域是分類模糊的例子(即圖像與兩個以上的分類標簽綁定)。需要注意的是,在NN分類器中,異常的數據點(比如:在藍色區域中的綠點)制造出一個不正確預測的孤島。5-NN分類器將這些不規則都平滑了,使得它針對測試數據的泛化(generalization)能力更好(例子中未展示)。注意,5-NN中也存在一些灰色區域,這些區域是因為近鄰標簽的最高票數相同導致的(比如:2個鄰居是紅色,2個鄰居是藍色,還有1個是綠色)。

在實際中,大多使用k-NN分類器。但是k值如何確定呢?

用于超參數調優的驗證集

在機器學習或者深度學習領域,參數和超參數是一個常見的問題,根據經驗給出了一個很狹隘的區分這兩種參數的方法。

參數:就是模型可以根據數據可以自動學習出的變量。如:深度學習的權重等;

超參數:就是用來確定模型的一些參數,超參數不同,模型是不同的(這個模型不同的意思就是有微小的區別,比如假設都是CNN模型,如果層數不同,模型不一樣,雖然都是CNN模型。),超參數一般就是根據經驗確定的變量。在深度學習中,超參數有:學習速率,迭代次數,層數等等。

在選擇模型算法的同時會有很多選擇,比如KNN中k的選擇等案例。所有這些選擇,被稱為超參數。一般來說,這些超參數的設置或取值是模型訓練艱難的過程之一。

主要是通過實驗來決定選擇哪個值。就是這么做的,但這樣做的時候要非常細心。特別注意:決不能使用測試集來進行調優。如果這樣實施后,會發現效果特征好,但是算法在實際運行的時候,遇到新來的特征,會發現效果特別差,遠遠低于之前的預期,這種情況在該領域也有專有的稱呼——過擬合。

所以,最終測試的時候再使用測試集,可以很好地近似度量所設計的分類器的泛化性能。

測試數據只用一次,在模型訓練和驗證結束后,最終才會使用該數據,主要為了評價模型的好壞。

針對這,其實有很多調優的方法。可以從訓練集中取出一部分數據用來調優,稱之為驗證集(validation set)。最后,會作圖分析哪個k值表現最好,然后用這個k值來運行測試集,并作出對算法的評價。

交叉驗證。是用來驗證分類器的性能一種統計分析方法,基本思想是把在某種意義下將原始數據(dataset)進行分組,一部分做為訓練集(train set),另一部分做為驗證集(validation set),首先用訓練集對分類器進行訓練,在利用驗證集來測試訓練得到的模型(model),以此來做為評價分類器的性能指標。常見CV的方法如下:

§
Hold-Out Method

    將原始數據隨機分為兩組,一組做為訓練集,一組做為驗證集,利用訓練集訓練分類器,然后利用驗證集驗證模型,記錄最后的分類準確率為此分類器的性能指標。此種方法的好處的處理簡單,只需隨機把原始數據分為兩組即可,其實嚴格意義來說Hold-Out Method并不能算是CV,因為這種方法沒有達到交叉的思想,由于是隨機的將原始數據分組,所以最后驗證集分類準確率的高低與原始數據的分組有很大的關

系,所以這種方法得到的結果其實并不具有說服性。

§
Double Cross
Validation(2-fold Cross
Validation,記為2-CV)

   做法是將數據集分成兩個相等大小的子集,進行兩回合的分類器訓練。在第一回合中,一個子集作為training set,另一個便作為testing set;在第二回合中,則將training set與testing set對換后,再次訓練分類器,而其中比較關心的是兩次testing sets的辨識率。不過在實務上2-CV并不常用,主要原因是training set樣本數太少,通常不足以代表母體樣本的分布,導致testing階段辨識率容易出現明顯落差。此外,2-CV中分子集的變異度大,往往無法達到“實 驗過程必須可以被復制”的要求。

§
K-fold Cross
Validation(K-折交叉驗證,記為K-CV)

   將原始數據分成K組(一般是均分),將每個子集數據分別做一次驗證集,其余的K-1組子集數據作為訓練集,這樣會得到K個模型,用這K個模型最終的驗證 集的分類準確率的平均數作為此K-CV下分類器的性能指標。K一般大于等于2,實際操作時一般從3開始取,只有在原始數據集合數據量小的時候才會嘗試取 2。K-CV可以有效的避免過學習以及欠學習狀態的發生,最后得到的結果也比較具有說服性。

§
Leave-One-Out Cross
Validation(記為LOO-CV)

     如果設原始數據有N個樣本,那么LOO-CV就是N-CV,即每個樣本單獨作為驗證集,其余的N-1個樣本作為訓練集,所以LOO-CV會得到N個模 型,用這N個模型最終的驗證集的分類準確率的平均數作為此下LOO-CV分類器的性能指標。相比于前面的K-CV,LOO-CV有兩個明顯的優點:

(1)每一回合中幾乎所有的樣本皆用于訓練模型,因此最接近原始樣本的分布,這樣評估所得的結果比較可靠。

(2)實驗過程中沒有隨機因素會影響實驗數據,確保實驗過程是可以被復制的。

但LOO-CV的缺點則是計算成本高,因為需要建立的模型數量與原始數據樣本數量相同,當原始數據樣本數量相當多時,LOO-CV在實作上便有困難幾乎就是不顯示,除非每次訓練分類器得到模型的速度很快,或是可以用并行化計算減少計算所需的時間。

這就是5份交叉驗證對k值調參結果。

實際應用。在實際情使用中由于耗時而不選擇交叉驗證。一般直接把訓練集按比例分成訓練集和驗證集,但這也是根據具體情況來定的:如果超參數數量多,可能就想用更大的驗證集,而驗證集的數量不夠,那么最好還是用交叉驗證。

常用的數據分割模式。給出訓練集和測試集后,訓練集一般會被均分。這里是分成5份。前面4份用來訓練,黃色那份用作驗證集調優。如果采取交叉驗證,那就各份輪流作為驗證集。最后模型訓練完畢,超參數都定好了,讓模型跑一次測試集,以此測試結果就是模型的評價結果。

Nearest Neighbor分類器的優劣

Nearest Neighbor分類器在某些特定情況(比如數據維度較低)下,可能是不錯的選擇。但是在實際的圖像分類工作中很少使用。因為圖像都是高維度數據,而高維度向量之間的距離通常是反直覺的。下面的圖片展示了基于像素的相似和基于感官的相似是有很大不同的:

在高維數據上,基于像素的的距離和感官上的非常不同。上圖中,右邊3張圖片和左邊第1張原始圖片的L2距離是一樣的。很顯然,基于像素比較的相似和感官上以及語義上的相似是不同的。

這里還有個視覺化證據,可以證明使用像素差異來比較圖像是不夠的。z這是一個叫做t-SNE的可視化技術,它將CIFAR-10中的圖片按照二維方式排布,這樣能很好展示圖片之間的像素差異值。在這張圖片中,排列相鄰的圖片L2距離就小。

上圖使用t-SNE的可視化技術將CIFAR-10的圖片進行了二維排列。排列相近的圖片L2距離小。可以看出,圖片的排列是被背景主導而不是圖片語義內容本身主導。

具體說來,這些圖片的排布更像是一種顏色分布函數,或者說是基于背景的,而不是圖片的語義主體。比如,狗的圖片可能和青蛙的圖片非常接近,這是因為兩張圖片都是白色背景。從理想效果上來說,肯定是希望同類的圖片能夠聚集在一起,而不被背景或其他不相關因素干擾。為了達到這個目的,不能止步于原始像素比較,得繼續前進。

小結

簡要說來:

·
介紹了圖像分類問題。在該問題中,給出一個由被標注了分類標簽的圖像組成的集合,要求算法能預測沒有標簽的圖像的分類標簽,并根據算法預測準確率進行評價。

·
介紹了一個簡單的圖像分類器:最近鄰分類器(Nearest Neighbor classifier)。分類器中存在不同的超參數(比如k值或距離類型的選取),要想選取好的超參數不是一件輕而易舉的事。

·
選取超參數的正確方法是:將原始訓練集分為訓練集和驗證集,在驗證集上嘗試不同的超參數,最后保留表現最好那個。

·
如果訓練數據量不夠,使用交叉驗證方法,它能幫助在選取最優超參數的時候減少噪音。

·
一旦找到最優的超參數,就讓算法以該參數在測試集跑且只跑一次,并根據測試結果評價算法。

·
最近鄰分類器能夠在CIFAR-10上得到將近40%的準確率。該算法簡單易實現,但需要存儲所有訓練數據,并且在測試的時候過于耗費計算能力。

·
最后,知道了僅僅使用L1和L2范數來進行像素比較是不夠的,圖像更多的是按照背景和顏色被分類,而不是語義主體分身。

在接下來的課程中,將專注于解決這些問題和挑戰,并最終能夠得到超過90%準確率的解決方案。該方案能夠在完成學習就丟掉訓練集,并在一毫秒之內就完成一張圖片的分類。

小結:實際應用k-NN

如果希望將k-NN分類器用到實處(最好別用到圖像上,若是僅僅作為練手還可以接受),那么可以按照以下流程:

預處理的數據:對數據中的特征進行歸一化(normalize),讓其具有零平均值(zero mean)和單位方差(unit variance)。在后面的小節會討論這些細節。本小節不討論,是因為圖像中的像素都是同質的,不會表現出較大的差異分布,也就不需要標準化處理了。

如果數據是高維數據,考慮使用降維方法,比如PCA(wiki ref, CS229ref, blog
ref)或隨機投影。

將數據隨機分入訓練集和驗證集。按照一般規律,70%-90% 數據作為訓練集。這個比例根據算法中有多少超參數,以及這些超參數對于算法的預期影響來決定。如果需要預測的超參數很多,那么就應該使用更大的驗證集來有效地估計它們。如果擔心驗證集數量不夠,那么就嘗試交叉驗證方法。如果計算資源足夠,使用交叉驗證總是更加安全的(份數越多,效果越好,也更耗費計算資源)。

在驗證集上調優,嘗試足夠多的k值,嘗試L1和L2兩種范數計算方式。

如果分類器跑得太慢,嘗試使用Approximate Nearest Neighbor庫(比如FLANN)來加速這個過程,其代價是降低一些準確率。

對最優的超參數做記錄。記錄最優參數后,是否應該讓使用最優參數的算法在完整的訓練集上運行并再次訓練呢?因為如果把驗證集重新放回到訓練集中(自然訓練集的數據量就又變大了),有可能最優參數又會有所變化。在實踐中,不要這樣做。千萬不要在最終的分類器中使用驗證集數據,這樣做會破壞對于最優參數的估計。直接使用測試集來測試用最優參數設置好的最優模型,得到測試集數據的分類準確率,并以此作為的kNN分類器在該數據上的性能表現。

總結

以上是生活随笔為你收集整理的斯坦福大学李飞飞团队图像分类课程笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。