【问题标题】:training UBM with sidekit from custom data使用自定义数据训练 UBM
【发布时间】:2017-10-09 06:40:54
【问题描述】:

我正在尝试从我已经提取的数据中训练 GMM-UBM 模型,用于使用 SIDEKIT 进行情绪识别(与说话人识别几乎相同。我也不了解 HDF5 特征文件系统)。我的数据是一个形状为 (1101,78) 的 ndarray [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)吗?我可能错了。请给我一个提示

【问题讨论】:

    标签: python voice-recognition gmm sidekit


    【解决方案1】:

    您可能已经想通了,但我想我不妨发布一个可能的解决方案。

    以下代码创建维度为 (2,100) 的随机数据,并尝试使用 EM_uniform 算法训练 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: 操作数不能与形状一起广播 (128,100) (128,0)

    我怀疑在 Sidekit.Mixture._init_uniform() 中计算 gmm.invcov 的方式存在一些错误,所以我想出了使用 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 documentation 获取教程。此外,hdfview 允许您查看 h5 文件的内容,这对于以后进行评分时的调试非常方便。

    【讨论】:

    • 非常感谢 Jørgen A 的正确回答。是的,我发现 invcov 矩阵的初始化存在错误。你有在 sidekit 中包含 GMM-UBM 示例的 github 帐户吗?
    • 您还知道一种在 numpy 数组中使用您自己的数据运行 UBM-GMM 系统的方法吗?我的意思是没有功能服务器和 hdf5 文件。因为我已经提取了自己的自定义特征。
    【解决方案2】:

    sidekit.UBM 采用的参数 'feature_list' 的内容是什么?

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

    【讨论】:

    • 如果您要问什么,应该是评论
    • 我无法对此发表评论,因为我没有 50 声望。但是你能帮忙解答吗?
    猜你喜欢
    • 2020-10-16
    • 2020-06-13
    • 2017-06-19
    • 2022-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 2017-07-27
    相关资源
    最近更新 更多