Python 使用自定义数据中的sidekit培训UBM

Python 使用自定义数据中的sidekit培训UBM,python,voice-recognition,gmm,sidekit,Python,Voice Recognition,Gmm,Sidekit,我正在尝试从我已经提取的数据中训练GMM-UBM模型,以便使用SIDEKIT进行情感识别(与说话人识别几乎相同。我也不了解HDF5功能文件系统)。我的数据是一个带形状的数据数组(1101,78)[78是声学特征的数量,1101是特征向量(帧)的数量 引发的错误是: line 394, in _compute_all self.A = (numpy.square(self.mu) * self.invcov).sum(1) - 2.0 * (numpy.log(self.w) + nump

我正在尝试从我已经提取的数据中训练GMM-UBM模型,以便使用SIDEKIT进行情感识别(与说话人识别几乎相同。我也不了解HDF5功能文件系统)。我的数据是一个带形状的数据数组(1101,78)[78是声学特征的数量,1101是特征向量(帧)的数量

引发的错误是:

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)吗?我可能是错的。请给我一个提示,你可能已经知道了,但我想我还是发布一个可能的解决方案为好

以下代码创建维度为(2100)的随机数据,并尝试使用EM_统一算法训练128个混合gmm:

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:操作数无法与形状(128100)(128,0)一起广播

我怀疑在Sidekit.mixed.\u init\u uniform()中如何计算gmm.invcov存在一些错误,因此我用Sidekit.mixe.\u 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文件,请查看教程。此外,hdfview允许您查看h5文件的内容,这对于以后进行评分时的调试非常方便。

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)

非常感谢您的正确答案,Jørgen a。是的,我发现invcov矩阵的初始化中有一个bug。您是否有sidekit中带有GMM-UBM示例的github帐户?您是否知道使用numpy阵列中自己的数据运行UBM-GMM系统的方法?我的意思是没有功能服务器和hdf5文件。因为我已经提取了wn custom features.如果你问什么我不能对此发表评论,因为我没有50%的声誉。但是你能帮我回答吗?
ubm=sk.Mixture()
 llk = ubm.EM_split(features_server=server,
                     feature_list=ubm_list,
                     distrib_nb=512,
                     num_thread=8,
                     save_partial=False)