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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

使用SVM分类器进行图像多分类

發布時間:2023/12/9 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用SVM分类器进行图像多分类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ResNet backbone + SVM分類器

對于樣本較為均衡小型數據集,SVM作為分類器的效果與MLP的效果相近。
從經驗上看,對于樣本不均衡的大型數據集,MLP的效果強于SVM。
本博客在自己的小型數據集上進行實驗,本來使用MLP已經達到很好的效果,但導師讓試一下SVM分類器,可能會對樣本量較小的數據集表現稍好。雖然在心里覺得SVM這種方法不太可能有提高,但趁此機會學習一下SVM還是有好處的。

SVM相關知識:

這里僅作簡單陳述,詳細地可百度或B站,特別多資源
基本理念:最初的SVM是用來作二分類的,目標是在特征空間中找到一個超平面,讓任意樣本的點到平面的距離大于等于1。
如果樣本線性不可分,則需要使用核函數來進行非線性分類,也就是得到非線性超平面。

核函數

SVM可以通過核方法(kernel method)進行非線性分類,是常見的核學習(kernel learning)方法之一。一些線性不可分的問題可能是非線性可分的,即特征空間存在超曲面(hypersurface)將正類和負類分開。使用非線性函數可以將非線性可分問題從原始的特征空間映射至更高維的希爾伯特空間(Hilbert space)H ,從而轉化為線性可分問題。

常見的核函數有:多項式核(階為1時稱為線性核)、徑向基函數核(又稱RBF核、高斯核)、拉普拉斯核、Sigmoid核。
常用線性核和高斯核。
參考自b站:https://www.bilibili.com/video/BV1mP4y137U4?p=2

線性核函數

解決問題從簡單的出發,先試一下線性核函數的效果!
公式注意是內積
適用于:特征已經比較豐富了,樣本數據量大,即十萬、百萬這數量級。

多項式核函數(了解即可,不常用):
給定3個參數,Q控制高次項,越高次對應越復雜的邊界,計算量也相應越大,具體視任務情況而定

γ和Q就是要調的超參,得在煉丹過程中調整。

高斯核函數——最常用的

公式如下:

高斯核函數能把低維特征映射為無窮維的特征,比如有m個數據,每個數據是10維,那么根據公式可得到每個數據Xi和任意數據Xk的“距離”Dx,有m個數據,就計算m次,得到m個Xi與Xk的“距離”,然后將Xi里的第k個元素更換為Xi和Xk的“距離”,也就是變成m維了,因此可用于擴充特征維度,讓模型對數據點有更好的認識和區分。

σ越小,越陡,特征越鮮明,可能對分類效果略好,但是風險越大,可以看第二張圖。

SVM多分類

SVM如何做多分類呢?有直接法和間接法,但直接法不常用,間接法中常用的時一對一(ovo)和一對多(ovr)策略
具體可以來看這篇文章

總結

一對一就是訓練 m(m-1)/2 個分類器(m為類別總數),也就是每兩個類別之間訓練一個分類器,然后用投票法,將預測的變量輸入到所有分類器中,預測為label k,則k的得票+1,統計所有的分類器的輸出結果,得票最多的類別就是最終預測結果。
優劣:當類別很多時,model的個數是m(m-1)/2,代價很大哦

一對多就是對于第k個類別,將label k的樣本設為正類,而其他類別的樣本都設為負類,最后訓練 m個分類器(m為類別總數)。預測時,將變量輸入到所有分類器中,如果只有一個分類器輸出正值,則可直接判定結果為該分類器對應的類別,否則選取判別函數值最大的分類器所對應的類別為最終預測結果。
優點:訓練m個分類器,個數較少,其分類速度相對較快。
缺點:每個分類器的訓練都是講全部的樣本作為訓練樣本,如果不是線性可分數據,訓練速度會隨著訓練樣本的數量增加而急劇減慢;同時由于負類樣本的數據要遠遠大于正類樣本的數據,從而出現了樣本不對稱的情況,且這種情況隨著訓練數據的增加而趨向嚴重。解決不對稱的問題可以引入不同的懲罰因子,對樣本點來說較少的正類采用較大的懲罰因子。還有就是當有新的類別加進來時,需要對所有的模型進行重新訓練。

SVM的優缺點:引用

1、SVM算法對大規模訓練樣本難以實施

SVM的空間消耗主要是存儲訓練樣本和核矩陣,由于SVM是借助二次規劃來求解支持向量,而求解二次規劃將涉及m階矩陣的計算(m為樣本的個數),當m數目很大時該矩陣的存儲和計算將耗費大量的機器內存和運算時間。針對以上問題的主要改進有有J.Platt的SMO算法、T.Joachims的SVM、C.J.C.Burges等的PCGC、張學工的CSVM以及O.L.Mangasarian等的SOR算法。如果數據量很大,SVM的訓練時間就會比較長,如垃圾郵件的分類檢測,沒有使用SVM分類器,而是使用了簡單的naive bayes分類器,或者是使用邏輯回歸模型分類。

2、用SVM解決多分類問題存在困難

經典的支持向量機算法只給出了二類分類的算法,而在數據挖掘的實際應用中,一般要解決多類的分類問題??梢酝ㄟ^多個二類支持向量機的組合來解決。主要有一對多組合模式、一對一組合模式和SVM決策樹;再就是通過構造多個分類器的組合來解決。主要原理是克服SVM固有的缺點,結合其他算法的優勢,解決多類問題的分類精度。如:與粗集理論結合,形成一種優勢互補的多類問題的組合分類器。

3、對缺失數據敏感,對參數和核函數的選擇敏感

支持向量機性能的優劣主要取決于核函數的選取,所以對于一個實際問題而言,如何根據實際的數據模型選擇合適的核函數從而構造SVM算法。目前比較成熟的核函數及其參數的選擇都是人為的,根據經驗來選取的,帶有一定的隨意性.在不同的問題領域,核函數應當具有不同的形式和參數,所以在選取時候應該將領域知識引入進來,但是目前還沒有好的方法來解決核函數的選取問題。

實現

用scikit-learn包(sklearn)中的svm即可:官網地址
SVC
LinearSVC
我的實現是使用ResNet50作為特征提取器(去掉最后一層),先加上MLP預訓練35個epoch,然后將特征提取器的輸出降維(1024維的特征)輸入到SVM中進行訓練并得到輸出,然后評估結果即可。
在我的小型數據集上實現時,后續要做添加懲罰因子的實驗

Class Classifer(nn.Module):def __init__(self):super(Classifier,self).__init__()renet50 = torchvision.models.resnet50(pretrained)modules = list(resnet.children())[:-1] #delete the last fc layer.self.resnet = nn.Sequential(*modules)self.linear0 = nn.Linear(resnet.fc.in_features, 1024)def forward(self,images):features = self.resnet(images)features = features.reshape(features.size(0), -1)self.featuremap2048 = copy.deepcopy(features.detach())#ResNet的輸出features = self.linear0(features)features = self.relu(features)self.featuremap1024 = copy.deepcopy(features.detach())#用一層全連接層降維后的輸出...省略掉MLP的forward for i, (images, classes, lengths) in enumerate(train_loader):# Set mini-batch datasetimages = images.to(device)classes = classes.to(device) targets = classeswith torch.no_grad():outputs = classifier(images)# featuremap是一個Tensor(batchsize, 2048),2048是resnet50去除掉最后一層后的feature輸出featuremap = classifier.featuremap1024#將featuremap tensor 轉為numpy array:(batchsize,2048)featuremap_np = featuremap.cpu().numpy()targets_np = targets.cpu().numpy()#用SVM進行訓練svm_clf.fit(featuremap_np,targets_np)#測試np_targets_long = [] # 存整個test集的真實值outputs_label_long_list = [] # 存對整個test集的預測值for m, (images, classes, lengths) in enumerate(test_loader):images_test = images.to(device)with torch.no_grad():outputs_test_tensor = classifier(images_test)#前向計算,提取中間輸出featuremap_np_test = classifier.featuremap1024.cpu().numpy()# 將targets和outputs都轉為np.arraynp_targets = classes.numpy()np_outputs = svm_clf.predict(featuremap_np_test)# 將整個test集的真實值和預測值都保存np_targets_long.extend(np_targets)outputs_label_long_list.extend(np_outputs)# test finish,多分類時average選micro就是求準確度accuracytestset_acc = precision_score(np_targets_long, outputs_label_long_list, average='micro')

總結

以上是生活随笔為你收集整理的使用SVM分类器进行图像多分类的全部內容,希望文章能夠幫你解決所遇到的問題。

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