我正在使用SVMLib在MNIST数据集上训练一个简单的支持向量机。它包含60.000个训练数据。然而,我有几个性能问题:训练似乎是无休止的(几个小时后,我不得不手动关闭它,因为它没有响应)。我的代码非常简单,我只是在没有任何内核和任何特殊常量的情况下对数据集调用ovrtrain:
function features = readFeatures(fileName)
[fid, msg] = fopen(fileName, 'r', 'ieee-be');
header = fread(fid, 4, "int32" , 0, "ieee-be");
if header(1) ~= 2051
fprintf("Wrong magic number!");
end
M = header(2);
rows = header(3);
columns = header(4);
features = fread(fid, [M, rows*columns], "uint8", 0, "ieee-be");
fclose(fid);
return;
endfunction
function labels = readLabels(fileName)
[fid, msg] = fopen(fileName, 'r', 'ieee-be');
header = fread(fid, 2, "int32" , 0, "ieee-be");
if header(1) ~= 2049
fprintf("Wrong magic number!");
end
M = header(2);
labels = fread(fid, [M, 1], "uint8", 0, "ieee-be");
fclose(fid);
return;
endfunction
labels = readLabels("train-labels.idx1-ubyte");
features = readFeatures("train-images.idx3-ubyte");
model = ovrtrain(labels, features, "-t 0"); % doesn't respond...我的问题是:这正常吗?我在Ubuntu上运行它,一个虚拟机。我应该再等一段时间吗?
发布于 2012-11-29 00:12:05
我不知道你是否接受了你的答案,但让我告诉你我对你的情况的预测。对于像LibSVM这样的强大训练者来说,60.000个例子并不多。目前,我正在进行6000个样本的训练,训练需要3到5秒。然而,参数选择很重要,这可能需要很长时间。如果您的数据集中的独特特征的数量太高,那么对于任何示例,对于不存在的特征,都会有许多零特征值。如果该工具在您的训练集上实现数据缩放,那么很可能这些大量的零特征值将被缩放到某个非零值,从而为每个示例留下天文数字的唯一和非零值特征。对于SVM工具来说,要进入并提取有效的参数值是非常非常复杂的。
长话短说,如果你对SVM工具有足够的研究,并理解我的意思,你要么在执行训练命令之前在训练命令中分配参数值,要么找到一种方法来减少独特特征的数量。如果还没有,请继续下载最新版本的LibSVM,阅读ReadME文件以及该工具网站上的常见问题。
如果不是这样,那么很抱歉占用您的时间:)祝您好运。
发布于 2012-11-16 19:07:27
考虑到您的数据的特点,这可能是一个收敛问题。
检查作为默认选择的内核,并更改它。另外,检查包的停止标准。此外,如果您正在寻找更快的实现,请查看MSVMpack,它是支持向量机的并行实现。
最后,在您的案例中需要进行功能选择。你可以最终得到一个很好的特性子集,几乎只有一半的特性。此外,你只需要训练数据的一部分,例如60%~70%就足够了。
发布于 2012-11-18 11:51:50
首先,60k对于training.Training来说是一个巨大的数据,除非你有一个超级计算,否则使用线性内核的数据将会耗费大量的时间。你还选择了一个1次的线性核函数。最好使用高斯或更高阶的多项式核(对于相同的数据集,使用deg 4显示出很好的训练精度)。尝试添加-c cost -m memory cachesize -e epsilon终止标准容差的LIBSVM选项(默认为0.001)。首先,使用deg 4的高斯/多项式运行1000个样本,并比较其准确性。
https://stackoverflow.com/questions/13395943
复制相似问题