Comment extraire les informations de classificateur scikits.learn pour ensuite utiliser dans le code C
-
27-10-2019 - |
Question
J'ai formé un groupe de RBF en utilisant SVM scikits.learn en Python, puis marinées les résultats. Ce sont des tâches de traitement d'image et une chose que je veux faire pour le test est exécuté chaque classificateur sur chaque pixel de quelques images de test. Autrement dit, extraire le vecteur de caractéristique à partir d'une fenêtre centrée sur pixel (i, j), chaque classificateur exécuter sur ce vecteur de caractéristiques, et ensuite passer au pixel suivant et répétition. Cela est beaucoup trop lent à faire avec Python.
Précision: Quand je dis « cela est beaucoup trop lent ... » Je veux dire que même le libsvm sous le capot code qui utilise des scikits.learn est trop lent. Je vous écris en fait une fonction de décision manuelle pour le GPU si le classement à chaque pixel se produit en parallèle.
Est-il possible pour moi de charger les classificateurs avec Pickle, puis faites une sorte d'attribut qui décrit comment la décision est calculée à partir du vecteur de fonction, et ensuite passer cette information à mon propre code C? Dans le cas des SVM linéaires, je pouvais extraire le vecteur de poids et vecteur de polarisation et les ajouter comme entrées à une fonction C. Mais quelle est la chose à faire pour équivalent classificateurs de RBF, et comment puis-je obtenir cette information de l'objet scikits.learn?
Ajout:. Les premières tentatives d'une solution
Il semble que l'objet classificateur a la support_vectors_
d'attribut qui contient les vecteurs de support que chaque rangée d'un tableau. Il y a aussi la dual_coef_
d'attribut qui est un 1 par tableau len(support_vectors_)
de coefficients. Des tutoriels standard sur SVM non-linéaire, il apparaît alors que l'on devrait faire ce qui suit:
- Compute la fonction vecteur
v
de votre point à l'essai des données. Ce sera un vecteur qui est la même longueur que les lignes desupport_vectors_
. - Pour chaque
i
de ligne danssupport_vectors_
, calculer le carré ded[i]
distance euclidienne entre ce vecteur de support etv
. - Compute
t[i]
commegamma * exp{-d[i]}
oùgamma
est le paramètre RBF. - Résumer
dual_coef_[i] * t[i]
sur toutei
. Ajoutez la valeur de l'attributintercept_
du classificateur scikits.learn à cette somme. - Si la somme est positive, classer comme 1. Dans le cas contraire, classer comme 0.
Ajouté: À la page numérotée 9 à ce
La solution Oui, votre solution semble bien. Pour passer la mémoire brute d'un tableau numpy directement à un programme C, vous pouvez utiliser le ctypes aides de numpy ou vous envelopper programme C avec cython et appelez directement en passant le tableau numpy (voir le doc http://cython.org pour plus de détails). Cependant, je ne suis pas sûr que d'essayer de speedup la prédiction sur un GPU est l'approche la plus simple: machines support du noyau de vecteur sont connus pour être lent au moment de la prédiction car leur complexité dépendent directement du nombre de vecteurs de support qui peut être élevé pour des problèmes hautement non-linéaire (multimodaux). D'autres approches qui sont plus rapides à l'instant de prédiction comprennent des réseaux de neurones (probablement plus complexes ou plus lentement pour former droit de SVM qui ont seulement 2 hyper-paramètres C et gamma) ou transformer les données d'une transformation non linéaire sur la base de distances de prototypes + + seuillage mise en commun max sur les zones d'image (seulement pour la classification d'images). pour la première méthode, vous trouverez une bonne documentation sur le apprentissage en profondeur tutoriel pour la deuxième lecture des articles récents par Adam Coates et jeter un oeil à cette page sur kmeans disposent d'extraction Enfin, vous pouvez aussi utiliser des modèles NuSVC dont le paramètre de régularisation
nu
a un impact direct sur le nombre de vecteurs de support dans le modèle ajusté: moins des vecteurs de support moyenne plus rapide temps de prédiction (vérifier l'exactitude cependant, il sera un compromis entre la vitesse de prédiction et la précision à la fin).