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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CS231n课程笔记翻译:图像分类笔记(上)

發(fā)布時間:2025/3/21 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CS231n课程笔记翻译:图像分类笔记(上) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.


譯者注:本文翻譯自斯坦福CS231n課程筆記image classification notes,由課程教師Andrej Karpathy授權(quán)進(jìn)行翻譯。本篇教程由杜客翻譯完成。ShiqingFan對譯文進(jìn)行了仔細(xì)校對,提出了大量修改建議,態(tài)度嚴(yán)謹(jǐn),幫助甚多。鞏子嘉對幾處術(shù)語使用和翻譯優(yōu)化也提出了很好的建議。張欣等亦有幫助。

原文如下

這是一篇介紹性教程,面向非計算機(jī)視覺領(lǐng)域的同學(xué)。教程將向同學(xué)們介紹圖像分類問題和數(shù)據(jù)驅(qū)動方法。下面是內(nèi)容列表


  • 圖像分類、數(shù)據(jù)驅(qū)動方法和流程
  • Nearest Neighbor分類器
    • k-Nearest Neighbor 譯者注:上篇翻譯截止處
  • 驗證集、交叉驗證集和超參數(shù)調(diào)參
  • Nearest Neighbor的優(yōu)劣
  • 小結(jié)
  • 小結(jié):應(yīng)用kNN實踐
  • 拓展閱讀

圖像分類

目標(biāo):這一節(jié)我們將介紹圖像分類問題。所謂圖像分類問題,就是已有固定的分類標(biāo)簽集合,然后對于輸入的圖像,從分類標(biāo)簽集合中找出一個分類標(biāo)簽,最后把分類標(biāo)簽分配給該輸入圖像。雖然看起來挺簡單的,但這可是計算機(jī)視覺領(lǐng)域的核心問題之一,并且有著各種各樣的實際應(yīng)用。在后面的課程中,我們可以看到計算機(jī)視覺領(lǐng)域中很多看似不同的問題(比如物體檢測和分割),都可以被歸結(jié)為圖像分類問題。

例子:以下圖為例,圖像分類模型讀取該圖片,并生成該圖片屬于集合 {cat, dog, hat, mug}中各個標(biāo)簽的概率。需要注意的是,對于計算機(jī)來說,圖像是一個由數(shù)字組成的巨大的3維數(shù)組。在這個例子中,貓的圖像大小是寬248像素,高400像素,有3個顏色通道,分別是紅、綠和藍(lán)(簡稱RGB)。如此,該圖像就包含了248X400X3=297600個數(shù)字,每個數(shù)字都是在范圍0-255之間的整型,其中0表示全黑,255表示全白。我們的任務(wù)就是把這些上百萬的數(shù)字變成一個簡單的標(biāo)簽,比如“貓”。

—————————————————————————————————————————

圖像分類的任務(wù),就是對于一個給定的圖像,預(yù)測它屬于的那個分類標(biāo)簽(或者給出屬于一系列不同標(biāo)簽的可能性)。圖像是3維數(shù)組,數(shù)組元素是取值范圍從0到255的整數(shù)。數(shù)組的尺寸是寬度x高度x3,其中這個3代表的是紅、綠和藍(lán)3個顏色通道。

—————————————————————————————————————————

困難和挑戰(zhàn):對于人來說,識別出一個像“貓”一樣視覺概念是簡單至極的,然而從計算機(jī)視覺算法的角度來看就值得深思了。我們在下面列舉了計算機(jī)視覺算法在圖像識別方面遇到的一些困難,要記住圖像是以3維數(shù)組來表示的,數(shù)組中的元素是亮度值。

  • 視角變化(Viewpoint variation:同一個物體,攝像機(jī)可以從多個角度來展現(xiàn)。
  • 大小變化(Scale variation:物體可視的大小通常是會變化的(不僅是在圖片中,在真實世界中大小也是變化的)。
  • 形變(Deformation:很多東西的形狀并非一成不變,會有很大變化。
  • 遮擋(Occlusion:目標(biāo)物體可能被擋住。有時候只有物體的一小部分(可以小到幾個像素)是可見的。
  • 光照條件(Illumination conditions:在像素層面上,光照的影響非常大。
  • 背景干擾(Background clutter:物體可能混入背景之中,使之難以被辨認(rèn)。
  • 類內(nèi)差異(Intra-class variation:一類物體的個體之間的外形差異很大,比如椅子。這一類物體有許多不同的對象,每個都有自己的外形。

面對以上所有變化及其組合,好的圖像分類模型能夠在維持分類結(jié)論穩(wěn)定的同時,保持對類間差異足夠敏感。

—————————————————————————————————————————

—————————————————————————————————————————

數(shù)據(jù)驅(qū)動方法:如何寫一個圖像分類的算法呢?這和寫個排序算法可是大不一樣。怎么寫一個從圖像中認(rèn)出貓的算法?搞不清楚。因此,與其在代碼中直接寫明各類物體到底看起來是什么樣的,倒不如說我們采取的方法和教小孩兒看圖識物類似:給計算機(jī)很多數(shù)據(jù),然后實現(xiàn)學(xué)習(xí)算法,讓計算機(jī)學(xué)習(xí)到每個類的外形。這種方法,就是數(shù)據(jù)驅(qū)動方法。既然該方法的第一步就是收集已經(jīng)做好分類標(biāo)注的圖片來作為訓(xùn)練集,那么下面就看看數(shù)據(jù)庫到底長什么樣:

—————————————————————————————————————————

一個有4個視覺分類的訓(xùn)練集。在實際中,我們可能有上千的分類,每個分類都有成千上萬的圖像。

—————————————————————————————————————————

圖像分類流程。在課程視頻中已經(jīng)學(xué)習(xí)過,圖像分類就是輸入一個元素為像素值的數(shù)組,然后給它分配一個分類標(biāo)簽。完整流程如下:

  • 輸入:輸入是包含N個圖像的集合,每個圖像的標(biāo)簽是K種分類標(biāo)簽中的一種。這個集合稱為訓(xùn)練集。
  • 學(xué)習(xí):這一步的任務(wù)是使用訓(xùn)練集來學(xué)習(xí)每個類到底長什么樣。一般該步驟叫做訓(xùn)練分類器或者學(xué)習(xí)一個模型。
  • 評價:讓分類器來預(yù)測它未曾見過的圖像的分類標(biāo)簽,并以此來評價分類器的質(zhì)量。我們會把分類器預(yù)測的標(biāo)簽和圖像真正的分類標(biāo)簽對比。毫無疑問,分類器預(yù)測的分類標(biāo)簽和圖像真正的分類標(biāo)簽如果一致,那就是好事,這樣的情況越多越好。

Nearest Neighbor分類器

作為課程介紹的第一個方法,我們來實現(xiàn)一個Nearest Neighbor分類器。雖然這個分類器和卷積神經(jīng)網(wǎng)絡(luò)沒有任何關(guān)系,實際中也極少使用,但通過實現(xiàn)它,可以讓讀者對于解決圖像分類問題的方法有個基本的認(rèn)識。

圖像分類數(shù)據(jù)集:CIFAR-10。一個非常流行的圖像分類數(shù)據(jù)集是CIFAR-10。這個數(shù)據(jù)集包含了60000張32X32的小圖像。每張圖像都有10種分類標(biāo)簽中的一種。這60000張圖像被分為包含50000張圖像的訓(xùn)練集和包含10000張圖像的測試集。在下圖中你可以看見10個類的10張隨機(jī)圖片。

—————————————————————————————————————————

左邊:從CIFAR-10數(shù)據(jù)庫來的樣本圖像。右邊:第一列是測試圖像,然后第一列的每個測試圖像右邊是使用Nearest Neighbor算法,根據(jù)像素差異,從訓(xùn)練集中選出的10張最類似的圖片。

—————————————————————————————————————————

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

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

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

—————————————————————————————————————————

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

—————————————————————————————————————————

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

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

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

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

import numpy as npclass NearestNeighbor(object):def __init__(self):passdef 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 = ydef 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 = 1)min_index = np.argmin(distances) # get the index with smallest distanceYpred[i] = self.ytr[min_index] # predict the label of the nearest examplereturn Ypred

如果你用這段代碼跑CIFAR-10,你會發(fā)現(xiàn)準(zhǔn)確率能達(dá)到38.6%。這比隨機(jī)猜測的10%要好,但是比人類識別的水平(據(jù)研究推測是94%)和卷積神經(jīng)網(wǎng)絡(luò)能達(dá)到的95%還是差多了。點擊查看基于CIFAR-10數(shù)據(jù)的Kaggle算法競賽排行榜

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


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

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

注意在這里使用了np.sqrt,但是在實際中可能不用。因為求平方根函數(shù)是一個單調(diào)函數(shù),它對不同距離的絕對值求平方根雖然改變了數(shù)值大小,但依然保持了不同距離大小的順序。所以用不用它,都能夠?qū)ο袼夭町惖拇笮∵M(jìn)行正確比較。如果你在CIFAR-10上面跑這個模型,正確率是35.4%,比剛才低了一點。

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

k-Nearest Neighbor分類器

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

—————————————————————————————————————————

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

—————————————————————————————————————————

在實際中,大多使用k-NN分類器。但是k值如何確定呢?接下來就討論這個問題。

圖像分類筆記(上)完。

點擊查看圖像分類筆記(下)。

譯者反饋

  • 因CS231n的單篇課程筆記長度長,完整閱讀需較長時間。知友張欣等建議對其進(jìn)行適當(dāng)分拆。故本次翻譯將圖像分類筆記拆分為上下篇,每篇閱讀量控制在1萬字左右,降低閱讀成本。效果如何,請知友們點評;
  • 知乎專欄的公式編輯器可以使用LaTeX語法,贊。但公式居中需手動空格,有無更優(yōu)雅的方式?請知友們評論指教;
  • 翻譯中的任何不足之處,請知友們在評論中批評指正,我們會及時討論并作出反饋;
  • 本翻譯是無償行為,知乎專欄首發(fā)。允許轉(zhuǎn)載,請全文保留并注明出處。
  • 作者:杜客
    鏈接:https://zhuanlan.zhihu.com/p/20894041
    來源:知乎

    總結(jié)

    以上是生活随笔為你收集整理的CS231n课程笔记翻译:图像分类笔记(上)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。