2017-05-10 3 views
0

Ich versuche, GMM-UBM-Modell aus Daten zu trainieren, die ich bereits für Emotionserkennung mit SIDEKIT extrahiert habe (so ziemlich wie Sprechererkennung. Ich verstehe auch nicht die HDF5 Feature-Datei System). Meine Daten sind ein Array mit Form (1101,78) [78 sind die Anzahl der akustischen Merkmale und 1101 die Anzahl der Merkmalsvektoren (Frames).Training UBM mit Sidekit von benutzerdefinierten Daten

UBM = sidekit.Mixture()

llks = ubm.EM_uniform (Zorn, distribNb, iteration_min = 3, iteration_max = 10, llk_gain = 0,01, do_init = True)

Der Fehler, der ausgelöst wird, : Zeile 394, in _compute_all self.A = (numpy.square (self.mu) * self.invcov) .sum (1) - 2.0 * (numpy.log (self.w) + numpy.log (Selbst. cst))

ValueError: Operanden konnten nicht zusammen mit Shapes gesendet werden (512,78) (512,0)

was bedeutet, dass die Kovarianzmatrix eine Form hat (512,0). Ist das falsch? Sollte es wie (512,78) sein? Ich kann mich irren. Bitte geben Sie mir einen Tipp

Antwort

1

Sie könnten es bereits herausgefunden haben, aber ich dachte, ich könnte auch eine mögliche Lösung zu diesem Thema.

Der folgende Code erstellt Zufallsdaten mit Abmessungen (2,100) und versucht, eine 128-Mischung gmm unter Verwendung des EM_uniform Algorithmus zu trainieren:

import sidekit 
import numpy as np 
import random as rn 

gmm = sidekit.Mixture() 
data = np.array([[rn.random() for i in range(100)],[rn.random() for i in range(100)]]) 
gmm.EM_uniform(data, 
       distrib_nb=128, 
       iteration_min=3, 
       iteration_max=10, 
       llk_gain=0.01, 
       do_init=True) 

Dies führt jedoch in den gleichen Fehler, wie Sie berichtet: ValueError: Operanden konnten nicht zusammen mit shapes ausgestrahlt werden (128,100) (128,0)

Ich vermute, dass es einen Bug in der Berechnung von gmm.invcov in Sidekit.Mixture._init_uniform() gibt, also habe ich a herausgefunden manuelle Initialisierung der Mischung mit Code von Sidekit.Mixture._init() (die Initialisierungsfunktion für den EM_ split() - Algorithmus).

Der folgende Code lief ohne Fehler auf meinem Computer:

import sidekit 
import numpy as np 
import random as rn 
import copy 

gmm = sidekit.Mixture() 
data = np.array([[rn.random() for i in range(100)],[rn.random() for i in range(100)]]) 

# Initialize the Mixture with code from Sidekit.Mixture._init() 
mu = data.mean(0) 
cov = (data**2).mean(0) 
gmm.mu = mu[None] 
gmm.invcov = 1./cov[None] 
gmm.w = np.asarray([1.0]) 
gmm.cst = np.zeros(gmm.w.shape) 
gmm.det = np.zeros(gmm.w.shape) 
gmm.cov_var_ctl = 1.0/copy.deepcopy(gmm.invcov) 
gmm._compute_all() 

# Now run EM without initialization 
gmm.EM_uniform(data, 
       distrib_nb=128, 
       iteration_min=3, 
       iteration_max=10, 
       llk_gain=0.01, 
       do_init=False) 

Die folgende Ausgabe gab: [-31,419146414931213, 54,759037708692404, 54,759037708692404, 54,759037708692404], , die die Log-Likelihood-Werte nach jeder Iteration (Konvergenz nach 4 Iterationen. Beachten Sie, dass diese Beispieldaten zu klein sind, um ein Gmm zu trainieren.)

Ich kann nicht garantieren, dass dies später zu Fehlern führt, hinterlassen Sie einen Kommentar, wenn das der Fall ist!

Wie für HDF5-Dateien, lesen Sie die h5py documentation für Tutorials. Außerdem können Sie mit hdfview in den Inhalt der h5-Dateien schauen, was für das spätere Debugging sehr praktisch ist.

+0

Vielen Dank für die richtige Antwort Jørgen A. Ja, ich habe herausgefunden, dass es einen Fehler bei der Initialisierung der Invcov-Matrix gibt. Haben Sie ein Github-Konto mit GMM-UBM-Beispielen im Sidekit? – stefos

+1

Kennen Sie auch eine Möglichkeit, UBM-GMM-System mit eigenen Daten in numply Arrays zu betreiben? Ich meine, ohne einen Feature Server und hdf5 Dateien. Weil ich meine eigenen benutzerdefinierten Funktionen extrahiert habe. – stefos

Verwandte Themen