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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

svm训练完保存权重_assignment1-SVM

發(fā)布時間:2025/3/12 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 svm训练完保存权重_assignment1-SVM 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

理論知識

這次的分類器要比之前的KNN更加得靈活,效果也會更好。這種方法主要有兩部分組成:一個是評分函數(score function),它是原始圖像數據到類別分值的映射。另一個是損失函數(loss function),它是用來量化預測分類標簽的得分與真實標簽之間一致性的。該方法可轉化為一個最優(yōu)化問題,在最優(yōu)化過程中,將通過更新評分函數的參數來最小化損失函數值。

評分函數可以表示為:

對于

,可以看下面的圖片:

當然更好的方法是把W和b合并:

的選取也有很多,這里看做對 不做處理。

評分函數在正確的分類的位置應當得到最高的評分(score)。使用損失函數(Loss Function)(有時也叫代價函數Cost Function或目標函數Objective)來衡量我們對結果的不滿意程度。直觀地講,當評分函數輸出結果與真實結果之間差異越大,損失函數輸出越大,反之越小。

損失函數的形式很多,這里使用的是SVM損失函數。

對于第j個類別的得分為

,針對第i個數據的多分類SVM的損失函數定義如下:

SVM的損失函數想要正確分類類別

的分數比不正確類別分數高,而且至少要高。如果不滿足這點,就開始計算損失值。

那么根據之前的評分函數,最終的損失函數為:

被稱為折葉損失(hinge loss)

正則化(Regularization):課程中是這么解釋的,由于使所有樣本都能正確分類的

并不唯一,可能有很多相似的W都能夠正確地分類所有數據,比如對于每個數據,損失值都為0,那么對于 時,任何 都可以使損失值為0。那么哪個 最好呢?

正則化的想法就是向某些特定的權重W添加一些偏好,對其他權重則不添加,以此來消除這種模糊性。常用的正則化懲罰是L2范數:

可以看出,對于比較大的權重,它可以使其損失函數更大,從而抑制大數值的權重。

我的理解是:在訓練完后發(fā)現(xiàn)了過擬合,那么此時雖然訓練集的損失很小了,但是還不是最好的W,所以要調整W,W還有偏好的含義,越大表示對某個特征反應越激烈,而較大的W在預測中往往有著決定性的作用,所以要降低這些權重,對大數值進行懲罰,來讓分類器把所有維度上的特征都利用起來,從而提升其泛化能力。

最后的loss如下:

不想再輸公式了。。。

算法實現(xiàn)

整個線性分類器的設計過程總結如下:

  • 對數據集進行預處理。包括劃分訓練集,驗證集和測試集。零均值化和歸一化。
  • 設計損失函數
  • 計算梯度和loss
  • 設計優(yōu)化算法進行權重更新
  • 訓練
  • 調優(yōu)
  • 算法框架如下:

    class LinearClassifier(object):def __init__(self):self.W = Nonedef train(self, X, y, learning_rate=1e-3, reg=1e-5, num_iters=100,batch_size=200, verbose=False):passreturn loss_historydef predict(self, X):passreturn y_preddef loss(self, X_batch, y_batch, reg):pass class LinearSVM(LinearClassifier):""" A subclass that uses the Multiclass SVM loss function """def loss(self, X_batch, y_batch, reg):return svm_loss_vectorized(self.W, X_batch, y_batch, reg)

    因為不同損失函數的train和predict的代碼是相同的,所以作業(yè)中使用了繼承來復用這些代碼,以后只需要寫loss的代碼即可。

    train代碼實現(xiàn):

    def train(self, X, y, learning_rate=1e-3, reg=1e-5, num_iters=100,batch_size=200, verbose=False):num_train, dim = X.shapenum_classes = np.max(y) + 1 # 這里用 0...K-1 來表示不同的標簽#權重初始化,使用小隨機數if self.W is None:# lazily initialize Wself.W = 0.001 * np.random.randn(dim, num_classes)#使用GD進行W的優(yōu)化loss_history = []for it in range(num_iters):X_batch = Noney_batch = Nonenum_train = X.shape[0]batch_indices = np.random.choice(num_train, batch_size)X_batch = X[batch_indices]y_batch = y[batch_indices]loss, grad = self.loss(X_batch, y_batch, reg)loss_history.append(loss)self.W -=learning_rate*gradif verbose and it % 100 == 0:#用于觀察loss的情況print('iteration %d / %d: loss %f' % (it, num_iters, loss))return loss_history

    這里說明下batch_size,epoch的區(qū)別。

    當一個完整的數據集通過了分類器一次并且完成了一次梯度更新,這個過程稱為一個epoch。然而,當一個 epoch 對于計算機而言太龐大的時候,就需要把它分成多個小塊。分成的塊數就是batch的數量,每一個batch的大小就為batchsize。現(xiàn)在變成了每一個batch進行一次梯度更新。batch_size和梯度下降也有一定關系:

    批量梯度下降(BGD)。batch_size=訓練集的大小

    隨機梯度下降(SGB)。batch_size= 1

    小批量梯度下降(MBGD)。1 <batch_size<訓練集的大小

    predict的代碼實現(xiàn):

    def predict(self, X):y_pred = np.zeros(X.shape[0])y_pred = np.argmax(X.dot(self.W),axis=1)return y_pred

    svm_loss_vectorized的實現(xiàn):

    def svm_loss_vectorized(W, X, y, reg):loss = 0.0dW = np.zeros(W.shape) # initialize the gradient as zeroscores = X.dot(W) # N by Cnum_train = X.shape[0]num_classes = W.shape[1]#計算loss#numpy的這種技巧要記牢啊scores_correct = scores[np.arange(num_train), y] #1 by Nscores_correct = np.reshape(scores_correct, (num_train, 1)) # N by 1margins = scores - scores_correct + 1.0 # N by Cmargins[np.arange(num_train), y] = 0.0 margins[margins <= 0] = 0.0loss += np.sum(margins) / num_trainloss += 0.5 * reg * np.sum(W * W)#計算梯度margins[margins > 0] = 1.0 # 示性函數的意義row_sum = np.sum(margins, axis=1) # 1 by Nmargins[np.arange(num_train), y] = -row_sum dW += np.dot(X.T, margins)/num_train + reg * W # D by Creturn loss, dW

    (關于loss和梯度計算的實現(xiàn)想專門總結下)

    訓練集和驗證集的正確率為:

    調優(yōu)

    這次直接使用驗證集來進行調整學習率和正則化系數,具體代碼如下:

    learning_rates = [1e-7,5e-5] regularization_strengths = [2.5e4,5e4] #對于每一個超參數集合,用訓練集訓練一個SVM,計算訓練集和驗證集的準確率,并存放在 #result字典中,存放最好的驗證集準確率在best_val中,最好的模型放在best_svm中 #result中是(learning_rate, regularization_strength):(training_accuracy, validation_accuracy) results = {} best_val = -1 best_svm = None for lr in learning_rates:for rs in regularization_strengths:svm = LinearSVM()loss_hist = svm.train(X_train, y_train, learning_rate=lr, reg=rs,num_iters=500, verbose=False)#num_iters設為500,調高查找速度y_train_pred = svm.predict(X_train)train_accuracy = np.mean(y_train == y_train_pred)y_val_pred = svm.predict(X_val)validation_accuracy = np.mean(y_val == y_val_pred)results[(lr,rs)] = (train_accuracy,validation_accuracy)if best_val < validation_accuracy:best_svm = svmbest_val = validation_accuracy # Print out results. for lr, reg in sorted(results):train_accuracy, val_accuracy = results[(lr, reg)]print('lr %e reg %e train accuracy: %f val accuracy: %f' % (lr, reg, train_accuracy, val_accuracy)) print('best validation accuracy achieved during cross-validation: %f' % best_val)

    正確率與超參數的關系如下:

    在原有的數量上又增加了一些取值

    左上方的顏色為深紅色,表明準確率最高。學習率為1e-7 ,正則化系數為 5e4,驗證集上的準確率為38%左右。

    之后要注意的是在對測試集進行預測之前,要把num_iters調到較大的值,這里是1500,來更好地優(yōu)化W。最后測試集的準確率為37%左右。

    作業(yè)中還把權重矩陣中各個類別的權重繪圖,結果如下:

    可以發(fā)現(xiàn),SVM分類器是在進行著模板匹配的工作。

    一些問題:

    1.多類SVM損失函數的最大/最小值是多少?

    最小值:0 最大值:無窮大

    2.如果初始化時w和b很小,損失L會是多少?

    設標簽數為n,單個樣本的L為n-1。這可以驗證編碼是否正確

    3.考慮所有類別(包括j=yi),損失Li會有什么變化?

    會比原來多1

    4.在求總損失L計算時,如果用求和代替平均?

    沒有什么影響,可以調學習率

    5.如果使用

    會使損失值變很大,對最終的效果有影響。

    與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的svm训练完保存权重_assignment1-SVM的全部內容,希望文章能夠幫你解決所遇到的問題。

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