質問

Pythonでscikits.learnを使用してRBF SVMの束を訓練し、結果を漬けました。これらは画像処理タスク用であり、テストにしたいことの1つは、いくつかのテスト画像のすべてのピクセルで各分類子を実行することです。つまり、ピクセル(i、j)を中心としたウィンドウから機能ベクトルを抽出し、その機能ベクトルで各分類子を実行し、次のピクセルに移動して繰り返します。これは、Pythonで行うには遅すぎます。

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

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

追加した: 最初に解決策を試みます。

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

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

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

役に立ちましたか?

解決

はい、あなたのソリューションは大丈夫に見えます。 numpy配列の生のメモリをCプログラムに直接渡すには、 numpyのctypesヘルパー または、You CプログラムをCythonでラップし、Numpyアレイを渡して直接呼び出します(docを参照してください http://cython.org 詳細については)。

ただし、GPUの予測をスピードアップしようとすることが最も簡単なアプローチであるかどうかはわかりません。カーネルサポートベクトルマシンは、その複雑さが直接的に依存するため、予測時間に遅いことが知られています。 -Linear(Multi-Modal)問題。

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

最後に、正規化パラメーターを持つNUSVCモデルを使用することもできます nu 適合モデルのサポートベクターの数に直接影響を与えます。サポートベクトルの減少は、予測時間をより速くすることを意味します(ただし、精度を確認してください。予測速度と最終的に精度のトレードオフになります)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top