0

我正在使用 SVMLib 在 MNIST 数据集上训练一个简单的 SVM。它包含 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 上运行它。我应该等待更长的时间吗?

4

3 回答 3

1

我不知道你是否接受了你的回答,但让我告诉你我对你的情况的预测。对于像 LibSVM 这样的动力训练器来说,60.000 个示例并不多。目前,我正在研究一个包含 6000 个示例的训练集,训练需要 3 到 5 秒。但是,参数选择很重要,这可能需要很长时间。如果数据集中唯一特征的数量太多,那么对于任何示例,不存在的特征都会有很多零特征值。如果该工具在您的训练集上实施数据缩放,那么很可能这些零特征值将被缩放到某个非零值,从而为每个示例留下天文数字的唯一和非零值特征。

长话短说,如果您对 SVM 工具有足够的研究并理解我的意思,您可以在执行训练命令之前为其分配参数值,或者找到减少独特特征数量的方法。如果您还没有,请继续下载最新版本的 LibSVM,阅读自述文件以及工具网站上的常见问题解答。

如果不是这些情况,那么很抱歉占用您的时间:) 祝你好运。

于 2012-11-28T16:12:05.393 回答
0

考虑到数据的特征,这可能是一个收敛问题。

检查您作为默认选择的内核并更改它。另外,检查包裹的停止标准。此外,如果您正在寻找更快的实现,请查看 MSVMpack,它是 SVM 的并行实现。

最后,需要在您的情况下进行特征选择。您最终可以获得几乎一半的功能子集。此外,您只需要一部分数据进行训练,例如 60~70 % 就足够了。

于 2012-11-16T11:07:26.790 回答
-1

首先,60k 是用于训练的巨大数据。除非您拥有超级计算,否则使用线性内核训练这么多数据将花费大量时间。此外,您还选择了 1 次线性核函数。最好使用高斯或更高次多项式核函数(使用相同数据集的 4 次函数显示出良好的转换精度)。尝试为 -c cost -m memory cachesize -e epsilon 终止标准容差添加 LIBSVM 选项(默认为 0.001)。首先使用 4 度的高斯/多项式运行 1000 个样本并比较准确度。

于 2012-11-18T03:51:50.147 回答