def __init__(self, num_phonemes, num_features, var_diag_interval, var_offdiag_interval): self.num_features = num_features self.num_phonemes = num_phonemes self._labels = tuple("label%d" % i for i in range(num_phonemes)) # Randomly choose num_phonemes vectors # KJB - need something more sophisticated here to ensure minimum # distance between phonemes self._targets = tuple(tuple(random() for i in range(num_features)) for j in range(num_phonemes)) def buildOneCovarMatrix(): uni = (uniform(var_offdiag_interval[0], var_offdiag_interval[1]) for i in xrange(num_features**2)) mat = numpy.fromiter(uni, 'float64').reshape(num_features, num_features) # Make symetric lower_tri = numpy.tril(mat) # lower triangular mat = lower_tri + lower_tri.transpose() # Now clobber diagonal with other values for i in range(num_features): mat[i,i] = uniform(var_diag_interval[0], var_diag_interval[1]) return mat # Build covar matrices covars = tuple(buildOneCovarMatrix() for i in range(num_phonemes)) # Create a dictionary from _labels to SimpleGaussianModels self._models = dict() for i,label in enumerate(self._labels): m = SimpleGaussianModel(num_features, SimpleGaussianModel.FULL_COVARIANCE) m.set_model(self._targets[i], covars[i]) self._models[label] = m
def __init__(self, primary_classifier, variant_labels): self._variant_labels = variant_labels self._variant_models = {} for label in variant_labels: model = SimpleGaussianModel() # KJB - this guy shouldn't have to know so much about models - # maybe do some kind of cloning from models in the classifier? model.set_model(primary_classifier.num_features, 'diagonal') self._variant_models[label] = model self._primary = primary_classifier self._variant_classifier = None
def __init__(self, primary_classifier, variant_labels): self._variant_labels = variant_labels self._variant_models = {} for label in variant_labels: model = SimpleGaussianModel() # KJB - this guy shouldn't have to know so much about models - # maybe do some kind of cloning from models in the classifier? model.set_model(primary_classifier.num_features, 'diagonal') self._variant_models[label] = model self._primary = primary_classifier self._variant_classifier = None
def test2a(num_obs, num_passes): dimension = 2 # Data generator setup target_means = (1,1) target_vars = (0.1,0.1) generator = SimpleGaussianModel(dimension, SimpleGaussianModel.DIAGONAL_COVARIANCE) generator.set_model(target_means, target_vars) SimpleGaussianModel.seed(0) data = [generator.sample() for i in xrange(num_obs)] # Gmm setup num_mixtures = 2 gmm0 = make_gmm_diag(dimension, num_mixtures) gmm1 = make_gmm_diag(dimension, num_mixtures) mm = GmmMgr((gmm1,)) # Hmm setup # A transition probability matrix with a p ~= 1 self-loop for the real state. # The entry state feeds into the real state with p=1. We use p ~= 1 for the # second self loop since we need *some* probability of finishing. trans = array(((0.0, 1.0, 0.0), (0.0, 0.999999999999, 0.000000000001), (0.0, 0.0, 0.0))) hmm0 = Hmm(1, log_domain=True) hmm0.build_model(mm, (0,), 1, 1, trans) print hmm0.to_string(True) + '\n' print gmm0 print '\n\n' # Try some adaptation for p in xrange(num_passes): mm.set_adaptation_state("INITIALIZING") mm.clear_all_accumulators() hmm0.begin_adapt("STANDALONE") mm.set_adaptation_state("ACCUMULATING") hmm0.adapt_one_sequence(data) mm.set_adaptation_state("APPLYING") hmm0.end_adapt() mm.apply_all_accumulators() mm.set_adaptation_state("NOT_ADAPTING") really_print = False with DebugPrint("gaussian", "gaussian_pt", "gaussian_gmm_score") if really_print else DebugPrint(): gmm0.adapt(data, max_iters = num_passes) print hmm0.to_string(True) + '\n' print gmm0
def test1(num_obs, num_passes): dimension = 2 # Data generator setup target_means = (1,1) target_vars = (0.1,0.1) generator = SimpleGaussianModel(dimension, SimpleGaussianModel.DIAGONAL_COVARIANCE) generator.set_model(target_means, target_vars) SimpleGaussianModel.seed(0) GaussianMixtureModel.seed(0) # Gmm setup num_mixtures = 2 gmm0 = make_gmm(dimension, num_mixtures) gmm1 = make_gmm(dimension, num_mixtures) mm = GmmMgr((gmm1,)) # Hmm setup hmm0 = Hmm(1, log_domain=True) # A transition probability matrix with a p=1/2 exit for the real state. # The entry state feeds into the real state with p=1. trans = array(((0.0, 1.0, 0.0), (0.0, 0.5, 0.5), (0.0, 0.0, 0.0))) hmm0.build_model(mm, (0,), 1, 1, trans) print hmm0.to_string(True) print gmm0 # Try some adaptation. Note that we are feeding the entire data set as one stream # to the Hmm adaption call. data = [generator.sample() for i in xrange(num_obs)] for p in xrange(num_passes): mm.set_adaptation_state("INITIALIZING") mm.clear_all_accumulators() hmm0.begin_adapt("STANDALONE") mm.set_adaptation_state("ACCUMULATING") hmm0.adapt_one_sequence(data) mm.set_adaptation_state("APPLYING") hmm0.end_adapt() mm.apply_all_accumulators() mm.set_adaptation_state("NOT_ADAPTING") gmm0.adapt(data, max_iters = num_passes) print hmm0.to_string(True) print gmm0
def read_smm(stream, params, _): covariance_type, num_components, dimension = params v, smm_means = stream.read_array("means", rtype=float, dim=1, shape=(dimension,)) if covariance_type is GaussianMixtureModel.FULL_COVARIANCE: var_dim = 2 var_shape = (dimension, dimension) else: assert covariance_type is GaussianMixtureModel.DIAGONAL_COVARIANCE var_dim = 1 var_shape = (dimension,) v, smm_vars = stream.read_array("vars", rtype=float, dim=var_dim, shape=var_shape) ret = SimpleGaussianModel(dimension, covariance_type) ret.set_model(smm_means, smm_vars) return ret
def test0(num_obs, num_passes): dimension = 2 # Data generator setup target_means = (1,1) target_vars = (0.1,0.1) generator = SimpleGaussianModel(dimension, SimpleGaussianModel.DIAGONAL_COVARIANCE) generator.set_model(target_means, target_vars) SimpleGaussianModel.seed(0) GaussianMixtureModel.seed(0) mm = GmmMgr(dimension) # Hmm setup hmm0 = Hmm(0, log_domain=True) # A transition probability matrix with no real state. # The entry state feeds into the exit state with p=1. trans = array(((0.0, 1.0), (0.0, 0.0))) hmm0.build_model(mm, (), 1, 1, trans) print hmm0.to_string(True) # Try some adaptation. Note that we are feeding the entire data set as one stream # to the Hmm adaption call. data = [generator.sample() for i in xrange(num_obs)] for p in xrange(num_passes): mm.set_adaptation_state("INITIALIZING") mm.clear_all_accumulators() hmm0.begin_adapt("STANDALONE") mm.set_adaptation_state("ACCUMULATING") with DebugPrint("hmm_gxfs", "hmm_aos") if False else DebugPrint(): hmm0.adapt_one_sequence(data) mm.set_adaptation_state("APPLYING") hmm0.end_adapt() mm.apply_all_accumulators() mm.set_adaptation_state("NOT_ADAPTING") print hmm0.to_string(True)
def read_smm(stream, params, _): covariance_type, num_components, dimension = params v, smm_means = stream.read_array("means", rtype=float, dim=1, shape=(dimension, )) if covariance_type is GaussianMixtureModel.FULL_COVARIANCE: var_dim = 2 var_shape = (dimension, dimension) else: assert (covariance_type is GaussianMixtureModel.DIAGONAL_COVARIANCE) var_dim = 1 var_shape = (dimension, ) v, smm_vars = stream.read_array("vars", rtype=float, dim=var_dim, shape=var_shape) ret = SimpleGaussianModel(dimension, covariance_type) ret.set_model(smm_means, smm_vars) return ret
ncomps = 7, 3 nfeatures = numceps # mfcc, with c0: gathered from about 60,000 frames of 'train' data from Ken and Hugh skyping true_means_prime = N.array((-5.5522, -1.0517, 1.0240, 3.1609, 0.5628, -122.5789), dtype=N.float32) true_vars_prime = N.array((26.2238, 26.4064, 59.7242, 35.1180, 47.2471, 3967.2240), dtype=N.float32) false_means_prime = N.array((-9.4634, -5.3991, -4.2773, 1.7494, -0.0822, -228.6211), dtype=N.float32) false_vars_prime = N.array((3.0097, 6.0277, 8.3711, 10.7198, 13.4285, 456.7074), dtype=N.float32) # mfcc, no c0: 20,000 frames of Hugh talking true_means_prime = N.array((-4.8087, 3.9863, -0.5217, 1.3076, 0.7514, -4.6497), dtype=N.float32) true_vars_prime = N.array((26.8496, 32.6631, 32.3662, 24.2963, 36.2244, 34.1555), dtype=N.float32) false_means_prime = N.array((-6.8806, -1.3424, -3.8147, 0.4520, 0.7129, -3.1560), dtype=N.float32) false_vars_prime = N.array((2.7468, 6.2286, 7.4355, 10.1530, 13.3865, 15.9309), dtype=N.float32) true_prime = SimpleGaussianModel(nfeatures, GaussianModelBase.DIAGONAL_COVARIANCE) true_prime.set_model(true_means_prime, true_vars_prime) false_prime = SimpleGaussianModel(nfeatures, GaussianModelBase.DIAGONAL_COVARIANCE) false_prime.set_model(false_means_prime, false_vars_prime) primer = (true_prime, false_prime) GaussianMixtureModel.seed(0) gmm_mgr0 = GmmMgr(ncomps, nfeatures, GaussianModelBase.DIAGONAL_COVARIANCE, primer) gmm_mgr1 = GmmMgr(ncomps, nfeatures, GaussianModelBase.DIAGONAL_COVARIANCE, primer) classify0 = AdaptingGmmClassifier(gmm_mgr0, izip(labels, count())) classify1 = AdaptingGmmClassifier(gmm_mgr1, izip(labels, count())) classify0.set_relevance(333) classify1.set_relevance(333) classify0.set_num_em_iterations(2) classify1.set_num_em_iterations(2) classifier0 = AdaptingGmmClassProcessor(classify0)