обучение УБМ с помощью sidekit из пользовательских данных

Я пытаюсь обучить модель GMM-UBM на основе данных, которые я уже извлек для распознавания эмоций с помощью SIDEKIT (почти так же, как распознавание говорящего. Я также не понимаю файловую систему функций HDF5). Мои данные представляют собой ndarray формы (1101,78) [78 — количество акустических признаков, а 1101 — количество векторов признаков (кадров).

ubm = sidekit.Mixture()

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

Выдается ошибка:

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)

что означает, что ковариационная матрица имеет форму (512,0). Это неправильно? Должно быть как (512,78)? Я могу ошибаться. Пожалуйста, дайте мне подсказку


person stefos    schedule 10.05.2017    source источник


Ответы (2)


Возможно, вы уже поняли это, но я подумал, что могу опубликовать возможное решение этой проблемы.

Следующий код создает случайные данные с измерениями (2100) и пытается обучить gmm из 128 смесей, используя алгоритм 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)

Однако это приводит к той же ошибке, о которой вы сообщили: ValueError: операнды не могут быть переданы вместе с формами (128 100) (128,0)

Я подозреваю, что есть некоторая ошибка в том, как вычисляется gmm.invcov в Sidekit.Mixture._init_uniform(), поэтому я придумал ручную инициализацию смеси с помощью кода из Sidekit.Mixture._init() (функция инициализации для EM_split ()-алгоритм).

Следующий код работал без ошибок на моем компьютере:

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)

Это дало следующий результат: [-31.419146414931213, 54.759037708692404, 54.759037708692404, 54.759037708692404], что является логарифмическими значениями правдоподобия после каждой итерации (сходимость после 4 итераций. Обратите внимание, что данные в этом примере слишком малы для обучения gmm)

Я не могу гарантировать, что это приведет к каким-либо ошибкам позже, оставьте комментарий, если это так!

Что касается файлов HDF5, ознакомьтесь с документацией h5py для получения учебных пособий. Кроме того, hdfview позволяет просматривать содержимое h5-файлов, что очень удобно для отладки позже, когда вы доберетесь до скоринга.

person Jørgen A    schedule 31.05.2017
comment
Большое спасибо за правильный ответ Йорген А. Да, я понял, что есть ошибка в инициализации матрицы invcov. У вас есть учетная запись github с примерами GMM-UBM в sidekit? - person stefos; 05.06.2017
comment
Также знаете ли вы способ запуска системы UBM-GMM с вашими собственными данными в массивах numpy? Я имею в виду без Feature Server и файлов hdf5. Потому что я извлек свои собственные пользовательские функции. - person stefos; 06.06.2017

Каково содержание параметра «feature_list», который принимает 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)
person David Tolu    schedule 08.01.2019
comment
должен быть комментарий, если вы что-то спрашиваете - person Akber Iqbal; 08.01.2019
comment
Я не могу комментировать это, так как у меня нет репутации 50. Но не могли бы вы помочь с ответом? - person David Tolu; 08.01.2019