8

Python で scikits.learn を使用して一連の RBF SVM をトレーニングし、結果を Pickled しました。これらは画像処理タスク用であり、テストのためにやりたいことの 1 つは、いくつかのテスト画像のすべてのピクセルに対して各分類子を実行することです。つまり、ピクセル (i,j) を中心とするウィンドウから特徴ベクトルを抽出し、その特徴ベクトルに対して各分類子を実行してから、次のピクセルに移動して繰り返します。これは、Python で行うには遅すぎます。

明確化:「これは遅すぎる...」と言うときは、scikits.learn が使用する Libsvm の内部コードでさえ遅すぎることを意味します。GPU の手動決定関数を実際に書いているので、各ピクセルでの分類が並行して行われます。

Pickle を使用して分類器をロードし、特徴ベクトルから決定がどのように計算されるかを説明するある種の属性を取得し、その情報を自分の C コードに渡すことは可能ですか? 線形 SVM の場合、重みベクトルとバイアス ベクトルを抽出し、それらを C 関数への入力として追加するだけで済みます。しかし、RBF 分類子に対して行う同等のことは何ですか? また、scikits.learn オブジェクトからその情報を取得するにはどうすればよいでしょうか?

追加:ソリューションの最初の試み。

分類子オブジェクトにはsupport_vectors_、配列の各行としてサポート ベクターを含む属性があるようです。dual_coef_len(support_vectors_)係数の配列である属性もあります。非線形 SVM に関する標準的なチュートリアルから、次のことを行う必要があるようです。

  • vテスト対象のデータ ポイントから特徴ベクトルを計算します。これは の行と同じ長さのベクトルになりますsupport_vectors_
  • の各行についてi、そのサポート ベクターと の間support_vectors_の 2 乗ユークリッド距離を計算します。d[i]v
  • は RBF パラメータt[i]として計算gamma * exp{-d[i]}します。gamma
  • 全体を合計しdual_coef_[i] * t[i]ますiintercept_scikits.learn 分類子の属性の値をこの合計に追加します。
  • 合計が正の場合、1 として分類します。それ以外の場合、0 として分類します。

追加:このドキュメント リンクの番号付きの 9 ページで、実際にintercept_分類子の属性がバイアス項を保持していることに言及しています。これを反映するために、上記の手順を更新しました。

4

1 に答える 1

9

はい、あなたのソリューションは問題ないようです。numpy 配列の生メモリを C プログラムに直接渡すには、numpy のctypes ヘルパーを使用するか、C プログラムを cython でラップし、numpy 配列を渡して直接呼び出すことができます ( http://cython.orgのドキュメントを参照)。詳細については)。

ただし、GPU で予測を高速化しようとするのが最も簡単な方法であるかどうかはわかりません。カーネル サポート ベクター マシンは、その複雑さがサポート ベクターの数に直接依存するため、予測時に遅くなることが知られています。 -線形 (マルチモーダル) 問題。

予測時に高速な代替アプローチには、ニューラル ネットワーク (おそらく、C とガンマの 2 つのハイパーパラメーターしかない SVM よりも適切にトレーニングするのがより複雑または遅い) や、プロトタイプまでの距離に基づく非線形変換 + しきい値処理 + でデータを変換することが含まれます。画像領域の最大プーリング (画像分類のみ)。

最後に、正則化パラメーターが適合モデルのサポート ベクターの数に直接影響する NuSVC モデルを使用することもできます。nuサポート ベクターが少ないほど、予測時間が速くなります (精度を確認してください。予測速度とのトレードオフになります)。そして最終的には精度)。

于 2011-12-03T10:53:10.117 に答える