Domanda

Mi sono allenato un gruppo di RBF SVMs utilizzando scikits.imparare Python e poi in Salamoia i risultati.Questi sono per l'elaborazione di immagini compiti e una cosa che voglio fare per il test viene eseguito ogni classificatore su ogni pixel di alcune immagini di prova.Che è, estrarre la funzione vettoriale da una finestra centrata su pixel (i,j) eseguire ogni classificatore su che funzione vettoriale, e poi passare al successivo pixel e ripetere.Questo è troppo lento a che fare con Python.

Chiarimento: Quando dico "questo è troppo lento..." voglio dire che anche il Libsvm sotto la cappa di codice che scikits.imparare usi è troppo lento.In realtà sto scrivendo un manuale di decisione funzione per la GPU in modo di classificazione per ogni pixel avviene in parallelo.

È possibile caricare i classificatori con Salamoia, e poi prendere un qualche tipo di attributo che descrive come la decisione viene calcolato dalla funzione vettoriale, e quindi passare l'info al mio codice C?In caso di lineare SVMs, potrei estrarre il peso vettoriale e bias vettoriale e aggiungere quelli come input di una funzione.Ma che cosa è l'equivalente cosa da fare per RBF classificatori, e come faccio a ottenere queste informazioni dal scikits.imparare oggetto?

Aggiunto il: Primi tentativi di una soluzione.

Sembra che la classificazione in oggetto con attributo support_vectors_ che contiene il supporto vettori di ogni riga di una matrice.C'è anche l'attributo dual_coef_ che è un 1 da len(support_vectors_) matrice dei coefficienti.Da standard tutorial sulla non-lineare SVMs, sembra allora che si deve effettuare le seguenti operazioni:

  • Calcolare la funzione di vettore v dal tuo punto di dati in prova.Questo sarà un vettore che è la stessa lunghezza come le righe di support_vectors_.
  • Per ogni riga i in support_vectors_, calcolare il quadrato della distanza Euclidea d[i] tra quella di vettore di sostegno e v.
  • Calcolo t[i] come gamma * exp{-d[i]} dove gamma è RBF parametro.
  • Sum up dual_coef_[i] * t[i] su tutti i.Aggiungere il valore della intercept_ attributo del scikits.imparare classificatore a questa somma.
  • Se la somma è positiva, classificare come 1.In caso contrario, classificare come 0.

Aggiunto il: Sulla pagina numerata 9 a questo documentazione link si informa che, anzi, il intercept_ attributo di classificazione detiene il termine bias.Ho aggiornato la procedura descritta sopra per riflettere questo.

È stato utile?

Soluzione

Sì, la tua soluzione sembra bene.Per passare il raw memoria di un array numpy direttamente a un programma in C è possibile utilizzare il ctypes aiutanti numpy o avvolgere programma in C con cython e chiamare direttamente passando un array numpy (vedi il doc a http://cython.org per ulteriori dettagli).

Tuttavia, io non sono sicuro che cercando di velocizzare la previsione su una GPU è l'approccio più semplice:kernel support vector machines sono noti per essere lento per la stima del tempo dal loro complessità dipendono direttamente il numero di vettori che possono essere altamente non-lineare (multi-modale) problemi.

Approcci alternativi che sono più veloci al periodo di previsione includono le reti neurali (probabilmente più complicato o più lento il treno giusto che SVMs che hanno solo 2 hyper-parametri C e gamma) o trasformare i dati non lineari trasformazione basata su distanze di prototipi + soglia + max pooling su aree dell'immagine (solo per la classificazione di immagini).

Infine, si può anche provare a utilizzare NuSVC modelli il cui parametro di regolarizzazione nu ha un impatto diretto sul numero di vettori di supporto a incasso modello:meno supporto vettori media più veloce di previsione volte (controllare la precisione, però, sarà un trade-off tra la previsione velocità e la precisione alla fine).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top