1. 程式人生 > >cs231n作業:assignment1 - svm

cs231n作業:assignment1 - svm


title: ‘cs231n作業:assignment1 - svm’
id: cs231n-1h-2
tags:

  • cs231n
  • homework
    categories:
  • AI
  • Deep Learning
    date: 2018-09-27 14:17:45

GitHub地址:https://github.com/ZJUFangzh/cs231n
個人部落格:fangzh.top
完成了一個基於SVM的損失函式。

資料集

載入的資料集依舊是:

Train data shape:  (49000, 32, 32, 3)
Train labels shape:  (49000,)
Validation data shape:  (1000, 32, 32, 3)
Validation labels shape:  (1000,)
Test data shape:  (1000, 32, 32, 3)
Test labels shape:  (1000,)

而後進行32 * 32 * 3的影象拉伸,得到:

Training data shape:  (49000, 3072)
Validation data shape:  (1000, 3072)
Test data shape:  (1000, 3072)
dev data shape:  (500, 3072)

進行一下簡單的預處理,減去影象的平均值

# Preprocessing: subtract the mean image
# first: compute the image mean based on the training data
mean_image = np.mean(X_train,
axis=0) print(mean_image[:10]) # print a few of the elements plt.figure(figsize=(4,4)) plt.imshow(mean_image.reshape((32,32,3)).astype('uint8')) # visualize the mean image plt.show()
# second: subtract the mean image from train and test data
X_train -= mean_image
X_val -= mean_image
X_test -= mean_image
X_dev -= mean_image
# third: append the bias dimension of ones (i.e. bias trick) so that our SVM
# only has to worry about optimizing a single weight matrix W.
X_train = np.hstack([X_train, np.ones((X_train.shape[0], 1))])
X_val = np.hstack([X_val, np.ones((X_val.shape[0], 1))])
X_test = np.hstack([X_test, np.ones((X_test.shape[0], 1))])
X_dev = np.hstack([X_dev, np.ones((X_dev.shape[0], 1))])

print(X_train.shape, X_val.shape, X_test.shape, X_dev.shape)
(49000, 3073) (1000, 3073) (1000, 3073) (500, 3073)

SVM分類器

然後就可以開始來編寫cs231n/classifiers/linear_svm.py的SVM分類器了。在這裡先介紹一下SVM的基本公式和原理。

參考CS231n:線性分類

SVM損失函式想要SVM在正確分類上的比分始終比不正確的比分高出一個邊界值 \triangle

第i個數據影象為 x i x_i ,正確分類為 y i y_i ,然後根據 f ( x i , W ) f(x_i,W) 來計算不同分類的值,將分類簡寫為 s s ,那麼第j類的得分就是 s j = f ( x i , W ) j s_j = f(x_i,W)_j ,針對第i個數據的多類SVM的損失函式定義為:

L i = j y i m a x ( 0 , s j s y i + ) L_i = \sum_{j \neq y_i} max(0, s_j - s_{y_i} + \triangle)

如:假設有3個分類, s = [ 13 , 7 , 11 ] s = [ 13,-7,11] ,第一個分類是正確的,也就是 y i = 0 y_i = 0 ,假設 = 10 \triangle=10 ,那麼把所有不正確的分類加起來( j y i j \neq y_i ),

L i = m a x ( 0 , 7 13 + 10 ) + m a x ( 0 , 11 13 + 10 ) L_i = max(0,-7-13+10)+max(0,11-13+10)

因為SVM只關心差距至少要大於10,所以 L i = 8 L_i = 8

那麼把公式套入:

L i = j y i m a x ( 0 , w j x i w y i x i + ) L_i = \sum_{j \neq y_i} max(0, w_j x_i - w_{y_i} x_i + \triangle)

加入正則後:

L = 1 N i j y i m a x ( 0 , f ( x i ; W ) j f ( x i ; W ) y i + ) + λ k l W k , l 2 L = \frac{1}{N} \sum_i \sum_{j \neq y_i}max(0, f(x_i ;W)_{j} - f(x_i ; W)_{y_i} + \triangle) + \lambda \sum_k \sum_l W^{2}_{k,l}

到目前為止計算了loss,然後還需要計算梯度下降的grads,

官方並沒有給推導過程,這才是cs231n作業難的地方所在。。。

詳細可以看這一篇文章CS 231 SVM 求導

總之就是兩個公式:

而後開始編寫compute_loss_naive 函式,先用迴圈來感受一下:

def svm_loss_naive(W, X, y, reg):
  """
  Structured SVM loss function, naive implementation (with loops).

  Inputs have dimension D, there are C classes, and we operate on minibatches
  of N examples.

  Inputs:
  - W: A numpy array of shape (D, C) containing weights.
  - X: A numpy array of shape (N, D) containing a minibatch of data.
  - y: A numpy array of shape (N,) containing training labels; y[i] = c means
    that X[i] has label c, where 0 <= c < C.
  - reg: (float) regularization strength

  Returns a tuple of:
  - loss as single float
  - gradient with respect to weights W; an array of same shape as W
  """
  dW = np.zeros(W.shape) # initialize the gradient as zero

  # compute the loss and the gradient
  num_classes = W.shape[1]
  num_train = X.shape[0]
  loss = 0.0
  #逐個計算每個樣本的loss
  for i in xrange(num_train):
    #計算每個樣本的各個分類得分
    scores = X[i].dot(W)
    correct_class_score = scores[y[i]]
    #計算每個分類的得分,計入loss中
    for j in xrange(num_classes):
      # 根據公式,j==y[i]的就是本身的分類,不用算了
      if j == y[i]:
        continue
      margin = scores[j] - correct_class_score + 1 # note delta = 1
      #如果計算的margin > 0,那麼就要算入loss,
      if margin > 0
            
           

相關推薦

cs231n作業assignment1 - svm

title: ‘cs231n作業:assignment1 - svm’ id: cs231n-1h-2 tags: cs231n homework categories: AI Deep Learning date: 2018-09-27 14:17:45

cs231n作業assignment1 - softmax

title: cs231n作業:assignment1 - softmax id: cs231n-1h-3 tags: cs231n homework categories: AI Deep Learning date: 2018-09-27 16:02:

cs231n作業assignment1 - knn

title: cs231n作業:assignment1 - knn id: cs231n-1h-1 tags: cs231n homework categories: AI Deep Learning date: 2018-09-26 12:41:15

cs231n作業assignment1 - features

GitHub地址:https://github.com/ZJUFangzh/cs231n 個人部落格:fangzh.top 抽取影象的HOG和HSV特徵。 對於每張圖,我們會計算梯度方向直方圖(HOG)特徵和用HSV(Hue色調,Saturation飽和度,Value明度)顏

cs231n作業assignment1 - two_layer_net

github地址:https://github.com/ZJUFangzh/cs231n 個人部落格:fangzh.top 搭建一個兩層的神經網路。 Forward pass 先計算前向傳播過程,編輯cs231n/classifiers/neural_net.py的Two

cs231n作業assignment1

抽取影象的HOG和HSV特徵。 對於每張圖,我們會計算梯度方向直方圖(HOG)特徵和用HSV(Hue色調,Saturation飽和度,Value明度)顏色空間的色調特徵。把每張圖的梯度方向直方圖和顏色直方圖特徵合併形成我們最後的特徵向量。 粗略的講呢,HO

斯坦福cs231n課程記錄——assignment1 SVM

目錄 SVM原理 某些API解釋 SVM實現 作業問題記錄 SVM優化 SVM運用 參考文獻 一、SVM原理 線性SVM分類是給每一個樣本一個分數,其正確的分數應該比錯誤的分數大。在實際分類中,為了提高分類器的魯棒性,我們希望正確的分數比

CS231n 作業1 SVM+softmax+兩層神經網絡

clas 天都 dao mar ref har svm .com 成了 大概用了有小半個月的時間斷斷續續的完成了作業1,因為期間每天都還在讀論文,所以進度有些落後,不過做完感覺也是收獲頗豐。 附上地址 http://note.youdao.com/noteshare?id=

CS231N assignment1 SVM

from cs231n.classifiers.softmax import softmax_loss_naive 線性分類器SVM,分成兩個部分 1.a score function that maps the raw data to class scores,也就是所謂的f(w,x)

CS231n作業筆記2.1兩層全連線神經網路的分層實現

CS231n簡介 作業筆記 1. 神經網路的分層實現 全連線前向傳播:out = x.reshape([x.shape[0],-1]).dot(w)+b 全連線後向傳播: x, w, b = cache dx, dw, db = No

關於cs231n作業1的SVM和Softmax線性分類器實現的感悟

1、對於複雜的含有多Wi引數的函式L求導問題,首先是分別對單個引數求偏導數,然後放置到此引數對應的矩陣的位置。在求偏導數的矩陣表示時,一般要經歷如下兩個步驟:數字計算:分解步驟,同時計算L和導數:一般情況下,L的計算分很多步,而且每一步也十分複雜,可能涉及到數值判定等。但是隻

cs231n-assignment1-SVM/Softmax/two-layer-nets梯度求解

上週完成了cs231n的assignment1,作業中的難點是SVM/Softmax/two-layer-nets的梯度求導,特此寫篇部落格進行總結。 作業assignment1的資源連結在這裡:http://download.csdn.net/detail/

cs231nassignment1——Q2: Training a Support Vector Machine

目錄 svm.ipnb內容: Multiclass Support Vector Machine exercise Complete and hand in this completed worksheet (including it

cs231n作業一之實現SVM

這個程式碼不能在python熵執行,是官方給的程式碼,我只是按照我的意思理解了一下,並把自己的理解寫上去,如果想要找能執行的程式碼的同學請忽視,如果你找到了也可以和我分享import numpy as np from random import shuffle def s

CS231N assignment1——SVM

Multiclass Support Vector Machine exercise Complete and hand in this completed worksheet (including its outputs and any supporting

python-作業員工信息表

輸入 .get lin del 打包 staf com 字典 獲取 程序可實現以下功能:1、查詢,輸入select name,age from staff_table where age > 22,查詢到符合要求的信息; 輸入select * from staff

ufldl學習筆記與編程作業Linear Regression(線性回歸)

cal bug war 環境 art link 行數 ear sad ufldl學習筆記與編程作業:Linear Regression(線性回歸) ufldl出了新教程,感覺比之前的好。從基礎講起。系統清晰,又有編程實踐。在deep learning高質量群裏

day1作業編寫登錄窗口一個文件實現

insert size strong 文件類型 增加 機會 如果 user_list ssa 思路: 1、參考模型,這個作業我參考了linux的登錄認證流程以及結合網上銀行支付寶等鎖定規則; 1)認證流程參考的是Linux的登錄:當你輸入完用戶名

第一次互評作業MIPS匯編程序設計

lower mov small search 在屏幕上 orm sof con print 1 .data 2 3 string1: .asciiz "*\n" 4 5 6 bstring: .asciiz 7

python之路——作業高級FTP(僅供參考)

ice 靜態 enc lose 自己的 創建目錄 返回 msg 組成 一、作業需求 1. 用戶加密認證2. 多用戶同時登陸3. 每個用戶有自己的家目錄且只能訪問自己的家目錄4. 對用戶進行磁盤配額、不同用戶配額可不同5. 用戶可以登陸server後,可切換目錄6. 查看當前