使用自定义数据的 sidekit 训练 UBM
training UBM with sidekit from custom data
我正在尝试根据我已经使用 SIDEKIT 提取的用于情感识别的数据来训练 GMM-UBM 模型(与说话人识别几乎相同。我也不了解 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)吗?我可能是错的。请给我一个提示
你可能已经想通了,但我想我也可以 post 一个可能的解决方案。
以下代码创建 运行 维度为 (2,100) 的 dom 数据,并尝试使用 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: ope运行ds 无法与形状一起广播 (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 documentation 中的教程。此外,hdfview 允许您查看 h5 文件的内容,这对于稍后评分时的调试非常方便。
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)
我正在尝试根据我已经使用 SIDEKIT 提取的用于情感识别的数据来训练 GMM-UBM 模型(与说话人识别几乎相同。我也不了解 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)吗?我可能是错的。请给我一个提示
你可能已经想通了,但我想我也可以 post 一个可能的解决方案。
以下代码创建 运行 维度为 (2,100) 的 dom 数据,并尝试使用 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: ope运行ds 无法与形状一起广播 (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 documentation 中的教程。此外,hdfview 允许您查看 h5 文件的内容,这对于稍后评分时的调试非常方便。
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)