分层支持向量机

时间:2021-05-04 21:50:56

标签: svm hierarchical

我想使用分层 SVM 对 Cifar-10 数据集进行分类。我知道 CNN 是最佳选择,但我需要预处理这些数据,然后使用分层 SVM。我看到了一篇帖子 hierarchical classification with SVM,但我仍然对 cifar10 感到困惑。我为一个层次结构尝试了以下代码,但它不满足我,因为我只获得了 90% 的准确度。请参阅下面的代码。任何帮助将不胜感激。

rootFolder = 'cifar10Train';
categories = {'Deer','Dog','Frog','Cat','truck','ship','airplane','horse',...
    'bird','automobile'};
imds = imageDatastore(fullfile(rootFolder, categories), 'LabelSource',...
    'foldernames');

%Load test data
rootFolder = 'cifar10Test';
imds_test = imageDatastore(fullfile(rootFolder, categories), ...
    'LabelSource', 'foldernames');

% Hierarchical SVM
% data generation suffix 'T' is used for test dataset
Y = imds.Labels;
YT = imds_test.Labels;
L = length(Y);
LT = length(YT);
X = zeros(32*32*3,L);
XT = zeros(32*32*3,LT);
% New labels for hierarchy
Y1 = (Y=='Deer');
Y2 = (Y=='Dog');
Y3 = (Y=='Frog');
Y4 = (Y=='Cat');
Y5 = (Y=='truck');
Y6 = (Y=='ship');
Y7 = (Y=='airplane');
Y8 = (Y=='horse');
Y9 = (Y=='bird');
Y10= (Y=='automobile');
% for test dataset
Y1T = (YT=='Deer');
Y2T = (YT=='Dog');
Y3T = (YT=='Frog');
Y4T = (YT=='Cat');
Y5T = (YT=='truck');
Y6T = (YT=='ship');
Y7T = (YT=='airplane');
Y8T = (YT=='horse');
Y9T = (YT=='bird');
Y10T= (YT=='automobile');
% train Samples
for i=1:L
    img = readimage(imds,i);
    X(:,i) = double(img(:));
end
% test data
for i=1:LT
    img = readimage(imds_test,i);
    XT(:,i) = double(img(:));
end
%First Linear classification
c1 = fitclinear(X',Y1);
pred1 = predict(c1,XT');%
Acc = sum(pred1==Y1T)/LT;'''

我为它编写了另一个压缩代码。但让我困惑的是,我将是 9 个分类器,而不是一个。我是否应该期望一个分类器可以对所有类进行分层分类。

function [Classifier Accuracy] = HSVM_mine(Num_of_Classes)
    % training data rows consitute samples and column features
    [Xtrain,Ytrain,Xtest,Ytest] = data_generate(filename_train,filename_test);
    Accuracy = zeros(Num_of_Classes,1)
    Classifier = {};
    Labels = {'class 1','class 2', 'class 3'...}
    Num_of_TrainSamples_per_class= m; 
    m= size(Xtrain,1)/Num_of_Classes;
    Num_of_TestSamples_per_class= n; 
    n= size(Xtest,1)/Num_of_Classes;
    for i=1:Num_of_Classes
        X1 = Xtrain((1+(i-1)*m):size(Xtrain,1));
        Y1 = (Yrain((1+(i-1)*m):size(Xtrain,1))==Ytrain(Labels(i));
        XT = Xtest((1+(i-1)*n):size(Xest,1));
        YT = (Yest((1+(i-1)*n):size(Xest,1))==Ytest(Labels(i));
        Classifier{i} = fitclinear(X1,Y1)
        Pred = predict(Classifier{i},XT);
        Accuracy(i) = sum(Pred==YT)/length(YT)

    end

0 个答案:

没有答案