Entrenamiento de UBM con sidekit de datos personalizados

Estoy tratando de entrenar el modelo GMM-UBM a partir de los datos que ya he extraído para el reconocimiento de emociones con SIDEKIT (más o menos lo mismo que el reconocimiento de los altavoces. Tampoco entiendo el sistema de archivos de características HDF5). Mis datos son un ndarray con forma (1101,78) [78 son el número de características acústicas y 1101 el número de vectores de características (cuadros).

ubm = sidekit.Mixture() llks = ubm.EM_uniform(anger, distribNb, iteration_min=3, iteration_max=10, llk_gain=0.01, do_init=True) 

El error que se produce es:

 line 394, in _compute_all self.A = (numpy.square(self.mu) * self.invcov).sum(1) - 2.0 * (numpy.log(self.w) + numpy.log(self.cst)) ValueError: operands could not be broadcast together with shapes (512,78) (512,0) 

lo que significa que la matriz de covarianza es de forma (512,0). ¿Es eso incorrecto? ¿Debería ser como (512,78)? Puedo estar equivocado. Por favor dame una pista

Es posible que ya lo hayas descubierto, pero pensé que también podría publicar una posible solución para esto.

El siguiente código crea datos aleatorios con dimensiones (2,100) e intenta entrenar un gmm de 128 mezclas utilizando el algoritmo EM_uniform:

 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) 

Sin embargo, esto produce el mismo error que ha informado: ValueError: los operandos no se pudieron transmitir junto con las formas (128,100) (128,0)

Sospecho que hay un error en cómo se calcula gmm.invcov en Sidekit.Mixture._init_uniform (), así que he descubierto una inicialización manual de la mezcla con el código de Sidekit.Mixture._init () (la función de inicialización para EM_split ()-algoritmo).

El siguiente código se ejecutó sin errores en mi computadora:

 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) 

Esto dio el siguiente resultado: [-31.419146414931213, 54.759037708692404, 54.759037708692404, 54.759037708692404], que son los valores de probabilidad logarítmica después de cada iteración (convergencia después de 4 iteraciones. Tenga en cuenta que los datos de este ejemplo son muy pequeños para entrenar a la máquina).

No puedo garantizar que esto genere errores más adelante, ¡deje un comentario si ese es el caso!

En cuanto a los archivos HDF5, consulte la documentación de h5py para ver los tutoriales. Además, hdfview te permite ver el contenido de los archivos h5, lo que es bastante conveniente para depurar más tarde cuando llegas a la puntuación.

¿Cuál es el contenido del parámetro ‘feature_list’ que toma el sidekit.UBM?

 ubm=sk.Mixture() llk = ubm.EM_split(features_server=server, feature_list=ubm_list, distrib_nb=512, num_thread=8, save_partial=False)