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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CS231n 学习笔记(2)——神经网络 part2 :线性分类器,SVM

發布時間:2023/12/29 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CS231n 学习笔记(2)——神经网络 part2 :线性分类器,SVM 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
*此系列為斯坦福李飛飛團隊的系列公開課“cs231n convolutional neural network for visual recognition ”的學習筆記。本文主要是對module 1 的part2 Linear classification: Support Vector Machine, Softmax 的翻譯與學習。KNN并不適用于圖像識別,其原因在于,KNN的時間復雜度和空間復雜度都很高。(在測試階段,我們需要將測試圖像和訓練集里的每一張圖像進行比較。)

線性分類器

線性分類器中有兩個重要的部分:判別函數( score function)用于建立數據和分類之間的對應關系,和損失函數(loss function )用于估計預測值與真實值之間的誤差。線性分類器的問題可以概括為用最優化方法求取得分函數中的最佳參數的問題。何為最佳參數?就是使得損失函數最小的那組參數。首先,我們需要定義每一類圖像的判別函數,確定圖像中的像素值與得分函數的映射關系。仍舊是以CIFAR-10為例,判別函數是要建立基于像素的圖像和圖像分類之間的映射關系,用數學的語言表示就是:

其中訓練集中的每一張圖片都屬于集合RD,D是每一張圖像的大小,每一張圖象的標簽都屬于集合Rk,k是類別總數。線性分類器就是要建立映射函數:f(Xi,W,b)=WXi+bW是一個矩陣,大小為K*D,通常被稱為權值(其實也是參數)。b是偏置向量,b會影響最終的輸出,但并沒有直接和圖像Xi作用。需要注意的是:1.W中的每一行是對一個類別的判別。2.圖像和標簽是給定的,我們所要做的就是調整W和b,提高判別函數的正確率。3.正確的分類判別函數的輸出值應當高于其他不正確的判別函數的輸出值。

下圖是一個具體的線性分類器進行圖像識別的例子:

假設上圖中,貓的圖像只有4個單色像素,不考慮RGB三個通道,只考慮灰度圖像。我們將圖像拉伸成一個列向量,與W矩陣相乘,可以看出,在上圖中,貓這一類別的判別函數的權值取得并不理想,通過判別函數,電腦更傾向于認為這是一只狗而不是貓。值得注意的是,線性分類器要計算三個顏色通道的權值總和,通過正確的設定權值參數,在圖像的某個顏色通道的某個區域,分類器就可以計算出圖像究竟是“像”還是“不像”某一個類別。舉例來說,例如,對于“船”這個分類,如果圖像的某一部分出現大量的藍色像素,那么就可以在藍色的通道中,設置正(positive)的權值。而在紅色和綠色的通道,則設定負(negative)的權值。

將圖像看作是高維空間中的一個點

既然圖像可以被拉伸為高維列向量,我們不妨將圖像看作是高維空間中的一個點,以CIFAR-10 數據集為例,我們可以把一副圖像看成是3072(32x32x3像素)維空間中的一個點。我們無法將3072維空間可視化,但是我們可以將整個空間劃分成兩塊。如下圖所示:

在上圖中,以汽車為例,紅色的直線是汽車這個類別的判別函數取值為0的空間,箭頭方向表示判別函數取值增長的方向,紅線右邊取值為正,左邊取值為負。 W中的每一行都是一個類別的判別函數。在幾何上的可以做這樣的解釋:如果我們改變了W中的某一行,相應的判別直線就會向其他方向旋轉。偏置向量b使得判別直線在高維空間中平移。如果沒有偏置向量b,所有的判別直線都將通過原點。(因為Xi=0時,無論W是多少,輸出函數都為0.)

線性分類器也可以看作是模板匹配。

判別函數可以看作是某個類別的模板,這個模板是通過對訓練集進行機器學習后獲得的。在對測試集的圖像進行分類時,每一張圖像和每一個類別的模板分別做內積。找出最“符合”的模板。線性分類器也可以看做是鄰域分類器。不同之處在于:1.我們不需要和訓練集的每一幅圖像求算距離,而是由訓練集自動學習出合適的模板,再跟模板求距離。2.求算的距離并不是歐氏距離,而是內積。

上圖是線性分類器生成的模板。不出所料,船的模板有很多藍色。馬的模板有兩個頭,這可能是因為在訓練集中,馬的圖像中,包含面向兩個方向站立的。汽車圖片面向各個方向,所以模板里圍成了一個圈,模板呈現紅色,這可能是由于訓練集里汽車的圖像紅色居多。線性分類器并不能區分汽車的顏色,型號等信息,但是神經網絡可以。

偏置向量處理

有兩種處理方式:左邊根據方程來,右邊是在W中加上一列b,每一幅圖片拉伸成列向量之后再加一行,這一行的元素是1.

圖像數據預處理

在機器學習中,首先需要“將數據居中”。例如,圖像的原始像素取值范圍是在[0,255],應當居中調整為[-127,127],再歸一化到[-1,1]區間。

損失函數

用于衡量判別函數的效果,如果判別函數效果好,損失函數的取值低,反之亦然。我們要做的就是通過調整判別函數中的權值W,減小損失函數,獲得更好的判別效果。

多類別支持向量機損失(Multiclass Support Vector Machine loss)

定義式:

上式表示第i個樣本(圖像Xi,標簽Yi)的損失函數,式中Sj是將圖像Xi帶入第j類判別函數后,得到的輸出。

Δ是固定差值。在幾何上,損失函數的值表示樣本距離邊緣的程度。它用于度量判別函數的性能。

Multiclass Support Vector Machine要求對正確類別的判別函數輸出值高于對錯誤類別圖像的判別函數輸出值。如果有某個類別的判別函數值落在了紅色區域內,就會造成累計誤差。我們需要做的,就是通過訓練集調整權值W,找出滿足條件并且損失函數值最小的W。

損失函數標準化

在上面的損失函數定義式中,有一個bug。如果有一個矩陣W可以使得分類器正確的分類所有的樣本。所有Xi的損失函數Li都為0。此時用參數λ與W相乘得到 λW(λ>1),也使得所有損失函數都是0.所有的判別函數邊界都重合。這會造成模棱兩可的歧義。(當樣本落在判決函數上,如何分類?)為了解決這個歧義,我們需要修改損失函數的定義式。首先我們引入了一個新的式子,叫做懲罰( regularization penalty )

R(W)并不是關于數據的函數,而是關于權值矩陣W的函數。修正后的損失函數有兩部分組成:

展開后,得到新的損失函數如下:

其中,N是訓練樣本的個數。加入懲罰后,可以篩選出更合適的W。例如,對于樣本x=[1,1,1,1],現在有兩個W矩陣w1=[1,0,0,0],

w2=[0.25,0.25,0.25,0.25],與X做內積的結果都是1。進過修正之后的損失函數W1的懲罰是1,W2 的懲罰是0.25。按照新的規則,選取W2作為權值矩陣。因為W2更小,也更加離散化。這樣選取出的W2可以考慮到所有方向上的情況,用它來做圖像分類時,可以應對過擬合。

損失函數的python代碼如下:

def L_i(x, y, W):"""unvectorized version. Compute the multiclass svm loss for a single example (x,y)- x is a column vector representing an image (e.g. 3073 x 1 in CIFAR-10)with an appended bias dimension in the 3073-rd position (i.e. bias trick)- y is an integer giving index of correct class (e.g. between 0 and 9 in CIFAR-10)- W is the weight matrix (e.g. 10 x 3073 in CIFAR-10)"""delta = 1.0 # see notes about delta later in this sectionscores = W.dot(x) # scores becomes of size 10 x 1, the scores for each classcorrect_class_score = scores[y]D = W.shape[0] # number of classes, e.g. 10loss_i = 0.0for j in xrange(D): # iterate over all wrong classesif j == y:# skip for the true class to only loop over incorrect classescontinue# accumulate loss for the i-th exampleloss_i += max(0, scores[j] - correct_class_score + delta)return loss_idef L_i_vectorized(x, y, W):"""A faster half-vectorized implementation. half-vectorizedrefers to the fact that for a single example the implementation containsno for loops, but there is still one loop over the examples (outside this function)"""delta = 1.0scores = W.dot(x)# compute the margins for all classes in one vector operationmargins = np.maximum(0, scores - scores[y] + delta)# on y-th position scores[y] - scores[y] canceled and gave delta. We want# to ignore the y-th position and only consider margin on max wrong classmargins[y] = 0loss_i = np.sum(margins)return loss_idef L(X, y, W):"""fully-vectorized implementation :- X holds all the training examples as columns (e.g. 3073 x 50,000 in CIFAR-10)- y is array of integers specifying correct class (e.g. 50,000-D array)- W are weights (e.g. 10 x 3073)"""# evaluate loss over all examples in X without using any for loops# left as exercise to reader in the assignment

.

總結

以上是生活随笔為你收集整理的CS231n 学习笔记(2)——神经网络 part2 :线性分类器,SVM的全部內容,希望文章能夠幫你解決所遇到的問題。

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