2011-12-02 26 views
8

Python'da scikits.learn kullanarak bir grup RBF SVM'si eğitmiş ve daha sonra da Sonuçları Pickled. Bunlar görüntü işleme görevleri içindir ve test yapmak istediğim bir şey, bazı test görüntülerinin her bir pikselinde her bir sınıflandırıcıyı çalıştırır. Yani, özellik vektörünü piksel (i, j) üzerinde ortalanmış bir pencereden ayıklayın, her sınıflandırıcıyı bu özellik vektöründe çalıştırın ve ardından bir sonraki piksele geçin ve tekrarlayın. Bu Python ile çok yavaş.Daha sonra scikits.learn sınıflandırıcıdan bilgi ayıklamak için C kodunda kullanın:

Açıklama: Ben dediğimde Ben kullandığı scikits.learn bile LIBSVM altında-luk kod çok yavaş olduğu anlamına "Bu ... çok yavaş". Aslında GPU için manuel karar fonksiyonu yazıyor, böylece her pikseldeki sınıflama paralel olarak gerçekleşiyor.

Sınıflandırıcılar Pickle ile yüklemek ve sonra kararın özellik vektöründen nasıl hesaplandığını açıklayan ve sonra bu bilgileri kendi C koduma ileten bir özellik yakalamam mümkün mü? Doğrusal SVM'lerde, ağırlık vektörünü ve önyargı vektörünü çıkartabilir ve bunları bir C işlevine girdi olarak ekleyebilirim. Fakat RBF sınıflandırıcıları için yapılması gereken eşdeğer şey nedir ve bu bilgiyi scikits.learn nesnesinden nasıl edinebilirim?

Eklenme: İlk çözümde denemeler.

Sınıflandırıcı nesnesinin, dizinin her dizisi olarak destek vektörlerini içeren support_vectors_ özniteliğine sahip olduğu anlaşılıyor. dual_coef_ özniteliği de vardır, bu da 1 len(support_vectors_) katsayıları dizisidir. Doğrusal olmayan SVM'ler standart öğreticiler bakıldığında, kişinin aşağıdakileri yapmanız gerektiğini daha sonra görünür:

  • hesaplayın test altında veri noktasından özellik vektörü v. Bu, support_vectors_ satırlarıyla aynı uzunluktaki bir vektör olacaktır.
  • support_vectors_'daki i numaralı her satır için, d[i] numaralı destek karesini, bu destek vektörü ile v arasında hesaplayın. gamma, gamma'un RBF parametresi olduğu t[i] olarak t[i] olarak hesaplayın.
  • Toplamı kadar dual_coef_[i] * t[i] tüm i bitti. Scikits.learn sınıflandırıcısının intercept_ özniteliğinin değerini bu toplama ekleyin. gerçekten Sınıflandırıcının intercept_ nitelik önyargı terimini tutan bahseder numaralı Sayfada 9 bu documentation link at: toplamı pozitifse
  • , 0.

Eklendi olarak sınıflandırmak, Aksi 1 olarak sınıflandırmak . Bunu yansıtmak için yukarıdaki adımları güncelledim.

+0

dokümantasyon bağlantı düşünceli cevap için – ademar111190

cevap

9

Evet, çözümünüz iyi görünüyor. C programa doğrudan numpy dizinin ham hafızasını geçmek için size ctypes helpers from numpy kullanın veya Cython ile size C programı sarın ve numpy dizi (ayrıntılı bilgi için http://cython.org de belgeye bakın) geçirerek doğrudan diyebiliriz.

Ancak, GPU'daki tahmini hızlandırmayı hızlandırmanın en kolay yol olduğuna emin değilim: Kernel destek vektörü makineleri karmaşıklıklarının doğrudan doğruya destek vektörlerinin sayısına bağlı olması nedeniyle tahmin zamanında yavaş olduğu bilinmektedir. Son derece doğrusal olmayan (çok modlu) problemler için yüksek.

Tahmin zamanlarında daha hızlı olan alternatif yaklaşımlar, sinir ağlarını (muhtemelen sadece 2 hipermetre C ve gamma içeren SVM'lerden daha karmaşık, daha yavaş antrenman) veya verilerinizi, mesafelere göre doğrusal olmayan bir dönüşümle dönüştürmeyi içerir. prototipler + eşikleme + maksimum görüntü alanları üzerinde havuzlama (sadece görüntü sınıflandırması için). İlk yöntem için

bu sayfada bakabilirsiniz ikinci Son olarak da kimin düzenlilestirme parametre nu donatılmış modelinde destek vektörlerin sayısına üzerinde doğrudan etkisi vardır NuSVC modellerini kullanmayı deneyebilirsiniz: daha az destek vektörler kontrol (daha hızlı tahmin süreleri ortalama doğruluk, sonunda tahmin hızı ve doğruluk arasındaki bir ticaret olacaktır.

+0

Teşekkür bozuldu. Bu tavsiye yolda gerçekten yararlı olacak, ama mevcut proje için ne yazık ki diğer kısıtlamaları nedeniyle SVM'ler kullanarak takılıp ediyorum. – ely

+0

Sonra sklearn.svm.NuSVC' 'de bakabilirsiniz ve trade-off SVS sayısını ilk denemelisiniz. Görmek kadarıyla – ogrisel

+0

, sklearn 0.9 NuSVC() nu parametre sadece destek vektörlerin sayısına bağlı bir alt verir. Ben tren, ben aslında daha rahat ediyoruz nu çok büyük hale sürece, benim veri için sadece çok destek vektörleri almaya devam. Daha az destek vektörünü nasıl sağlayacağını göremiyorum. – ely

İlgili konular