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

あなたがあなたの答えを受け入れたかどうかはわかりませんが、あなたの状況について私が予測することをお話しさせてください。60.000 の例は、LibSVM のようなパワー トレーナーには多くありません。現在、私は 6000 例のトレーニング セットに取り組んでおり、トレーニングに 3 ~ 5 秒かかります。ただし、パラメーターの選択は重要であり、おそらく時間がかかるものです。データ セット内の固有の特徴の数が多すぎる場合、どの例でも、存在しない特徴に対してゼロの特徴値が多数存在します。ツールがトレーニング セットにデータ スケーリングを実装している場合、ほとんどの場合、これらのゼロの特徴値の多くはゼロ以外の特定の値にスケーリングされ、すべての例で天文学的な数の一意のゼロ以外の値の特徴が残ります。

簡単に言うと、SVM ツールについて十分な調査を行い、私が言っていることを理解している場合は、トレーニング コマンドを実行する前にパラメーター値を割り当てるか、固有の機能の数を減らす方法を見つけます。まだお持ちでない場合は、LibSVM の最新バージョンをダウンロードして、ツールの Web サイトから ReadME ファイルと FAQ をお読みください。

これらのいずれにも当てはまらない場合は、お時間をいただき申し訳ありません:) 頑張ってください。

于 2012-11-28T16:12:05.393 に答える
0

データの特性を考えると、収束の問題である可能性があります。

デフォルトで選択されているカーネルを確認して変更します。また、パッケージの停止基準を確認してください。さらに、より高速な実装を探している場合は、SVM の並列実装である MSVMpack を確認してください。

最後に、あなたの場合の機能選択が望まれます。持っているもののほぼ半分の優れた機能サブセットになる可能性があります。さらに、トレーニングにはデータの一部のみが必要です。たとえば、60 ~ 70 % で十分です。

于 2012-11-16T11:07:26.790 に答える
-1

まず第一に、60kはトレーニング用の膨大なデータです。スーパーコンピューティングがない限り、線形カーネルを使用してその量のデータをトレーニングするには、非常に時間がかかります。また、次数1の線形カーネル関数を選択しました。ガウスまたはそれ以上の次数の多項式カーネルを使用することをお勧めします(同じデータセットで使用される次数4は、良好な変換精度を示しました)。-cコスト-mメモリキャッシュサイズ-e終了基準のイプシロン許容値(デフォルトは0.001)のLIBSVMオプションを追加してみてください。最初に、4度のガウス/多項式で1000個のサンプルを実行し、精度を比較します。

于 2012-11-18T03:51:50.147 に答える