我已经完成了原始HMAX模型的计算,并在C2层获得了结果。现在我还有一个调整层,换句话说,就是要使用osusvm。
在我的项目中,我有两个目录。一个包含训练图像,另一个包含测试图像。
参考资料: lennon310在训练图像和测试图像中的回答
首先,我想向您展示我在C2层的成果(当然,这些结果应该是向量)。请注意,我在S2层只提取了2个原型(在我的项目中我使用了256个原型,但在本问题中,假设我只使用了2个原型),以及四种原型大小:[4 8 12 16]
。因此,对于每张图像,我们会得到8个C2单元(2个原型 x 4个补丁大小 = 8)。
C2res{1}:对于六张训练图像:
0.0088 0.0098 0.0030 0.0067 0.0063 0.0057 0.0300 0.0315 0.0251 0.0211 0.0295 0.0248 0.1042 0.1843 0.1151 0.1166 0.0668 0.1134 0.3380 0.2529 0.3709 0.2886 0.3938 0.3078 0.2535 0.3255 0.3564 0.2196 0.1681 0.2827 3.9902 5.3475 4.5504 4.9500 6.7440 4.4033 0.8520 0.8740 0.7209 0.7705 0.4303 0.7687 6.3131 7.2560 7.9412 7.1929 9.8789 6.6764
C2res{2}:对于两张测试图像:
0.0080 0.01320.0240 0.00010.1007 0.22140.3055 0.02490.2989 0.34834.6946 4.27620.7048 1.27916.7595 4.7728
其次,我下载了osu-svm的matlab工具箱,并添加了其路径:
addpath(genpath('./osu-svm/')); %在这里添加您自己的osusvm路径 useSVM = 1; %如果您没有安装osusvm,您可以将其设置为0,这样分类器将使用NN分类器 %注意:对于这些特征,NN不是一个很好的分类器
然后我使用了下面的代码:
%简单的分类代码XTrain = [C2res{1}]; %训练样本作为列 XTest = [C2res{2}]; %训练集的标签ytrain = [ones(size(C2res{1},2),1)];%测试样本作为列ytest = [ones(size(C2res{2},2),1)]; %测试集的真实标签if useSVM Model = CLSosusvm(XTrain,ytrain); %训练 [ry,rw] = CLSosusvmC(XTest,Model); %预测新标签else %使用最近邻分类器 Model = CLSnn(XTrain, ytrain); %训练 [ry,rw] = CLSnnC(XTest,Model); %预测新标签end successrate = mean(ytest==ry) %一个简单的分类得分
上面的代码是否正确?为什么我总是得到successrate=1?我认为在某些地方我做错了。请帮帮我。如果这是正确的,还有没有其他计算方法?我可以使用什么来代替successrate,以便获得更好的结果?
注意:
函数CLSosusvm是:
function Model = CLSosusvm(Xtrain,Ytrain,sPARAMS);%function Model = CLSosusvm(Xtrain,Ytrain,sPARAMS);%%构建一个SVM分类器%这只是osu svm的一个包装函数%它要求osu svm(http://www.ece.osu.edu/~maj/osu_svm/)已安装并包含在路径中%X包含数据点作为列,即X是nfeatures \times nexamples%y是一个包含所有标签的列向量。y是nexamples \times 1%sPARAMS是一个参数结构:%sPARAMS.KERNEL指定内核类型%sPARAMS.C指定正则化常数%sPARAMS.GAMMA, sPARAMS.DEGREE是内核函数的参数%Model包含由osu svm返回的SVM模型的参数Ytrain = Ytrain';if nargin<3 SETPARAMS = 1;elseif isempty(sPARAMS) SETPARAMS = 1;else SETPARAMS = 0;endif SETPARAMS sPARAMS.KERNEL = 0; sPARAMS.C = 1;endswitch sPARAMS.KERNEL, case 0, [AlphaY, SVs, Bias, Parameters, nSV, nLabel] = ... LinearSVC(Xtrain, Ytrain, sPARAMS.C); case 1, [AlphaY, SVs, Bias, Parameters, nSV, nLabel] = ... PolySVC(Xtrain, Ytrain, sPARAMS.DEGREE, sPARAMS.C, 1,0); case 2, [AlphaY, SVs, Bias, Parameters, nSV, nLabel] = ... PolySVC(Xtrain, Ytrain, sPARAMS.DEGREE, sPARAMS.C, 1,sPARAMS.COEF); case 3, [AlphaY, SVs, Bias, Parameters, nSV, nLabel] = ... RbfSVC(Xtrain, Ytrain, sPARAMS.GAMMA, sPARAMS.C); endModel.AlphaY = AlphaY;Model.SVs = SVs;Model.Bias = Bias;Model.Parameters = Parameters;Model.nSV = nSV;Model.nLabel = nLabel;Model.sPARAMS = sPARAMS;
函数CLSosusvmC是:
function [Labels, DecisionValue]= CLSosusvmC(Samples, Model);%function [Labels, DecisionValue]= CLSosusvmC(Samples, Model);%%osu svm分类的包装函数%Samples包含要分类的数据点作为列,即它是nfeatures \times nexamples%Model是由CLSosusvm返回的模型%Labels是预测的标签%DecisionValue是模型分配给点的数值(Labels = sign(DecisionValue))[Labels, DecisionValue]= SVMClass(Samples, Model.AlphaY, ... Model.SVs, Model.Bias, ... Model.Parameters, Model.nSV, Model.nLabel);Labels = Labels';DecisionValue = DecisionValue';
回答:
你的代码在我看来是正确的。
由于你只有2张测试图像,可能的成功率将限于0、0.5、1。并且有25%的概率达到100%的准确率([0 1],[1 0],[1 1],[0 0])。你可以打乱数据,并多次重新选择8张中的2张作为测试,然后观察准确率。
还可以尝试添加更多图像到训练和测试样本中。