5

Próbuję nauczyć realizację HMM GMM i stworzył prosty model wykryć jakieś pewne dźwięki (połączenia zwierzęce itp)MATLAB Murphy'ego HMM Toolbox

Staram się trenować HMM (Ukryty model Markowa) sieci z GMM (Mieszanki Gaussa) w MATLAB.

Mam kilka pytań, nie mogłem być w stanie znaleźć żadnych informacji na temat.

1) Jeżeli mhmm_em() funkcja nazywa się w pętli dla każdego HMM-państwa lub jest automatycznie zrobić?

Przykładowo:

for each state 
     Initialize GMM’s and get parameters (use mixgauss_init.m) 
    end 
    Train HMM with EM (use mhmm_em.m) 

2)

[LL, prior1, transmat1, mu1, Sigma1, mixmat1] = ... 
          mhmm_em(MFCCs, prior0, transmat0, mu0, Sigma0, mixmat0, 'max_iter', M); 

ostatni parametr powinien być liczba Gaussians ORa number_of_states-1?

3) Jeśli szukamy maksymalnego prawdopodobieństwa, to gdzie do gry wchodzi Viterbi?

Powiedz, czy chcę wykryć pewien rodzaj zwierzęcego/ludzkiego połączenia po treningu mojego modelu z wektorami cech akustycznych, które wydobyłem, czy nadal powinienem potrzebować algorytmu Viterbiego w trybie testowym?

To trochę dezorientuje mnie i będę bardzo wdzięczny za wyjaśnienie tej części.

Wszelkie uwagi dotyczące kodu pod względem logiki HMM GMM również będą mile widziane.

Dzięki

Oto moja rutyna MATLAB;

O = 21;   % Number of coefficients in a vector(coefficient) 
M = 10;   % Number of Gaussian mixtures 
Q = 3;    % Number of states (left to right) 
% MFCC Parameters 
Tw = 128;   % analysis frame duration (ms) 
Ts = 64;   % analysis frame shift (ms) 
alpha = 0.95;  % preemphasis coefficient 
R = [ 1 1000 ]; % frequency range to consider 
f_bank = 20;  % number of filterbank channels 
C = 21;   % number of cepstral coefficients 
L = 22;   % cepstral sine lifter parameter(?) 

%Training 
[speech, fs, nbits ] = wavread('Train.wav'); 
[MFCCs, FBEs, frames ] = mfcc(speech, fs, Tw, Ts, alpha, hamming, R, f_bank, C, L); 
cov_type = 'full'; %the covariance type that is chosen as ҦullҠfor gaussians. 
prior0 = normalise(rand(Q,1)); 
transmat0 = mk_stochastic(rand(Q,Q)); 
[mu0, Sigma0] = mixgauss_init(Q*M, dat, cov_type, 'kmeans'); 

mu0 = reshape(mu0, [O Q M]); 
Sigma0 = reshape(Sigma0, [O O Q M]); 
mixmat0 = mk_stochastic(rand(Q,M)); 
[LL, prior1, transmat1, mu1, Sigma1, mixmat1] = ... 
mhmm_em(MFCCs, prior0, transmat0, mu0, Sigma0, mixmat0, 'max_iter', M); 

%Testing 
for i = 1:length(filelist) 
    fprintf('Processing %s\n', filelist(i).name); 
    [speech_tst, fs, nbits ] = wavread(filelist(i).name); 
    [MFCCs, FBEs, frames ] = ... 
    mfcc(speech_tst, fs, Tw, Ts, alpha, hamming, R, f_bank, C, L); 
    loglik(i) = mhmm_logprob(MFCCs,prior1, transmat1, mu1, Sigma1, mixmat1); 
end; 
[Winner, Winner_idx] = max(loglik); 

Odpowiedz

1

1) Nie, EM szacuje model jako całość po zainicjowaniu go przez kmeans. Nie szacuje stanów osobno.

2) Ani ostatni parametr w kodzie nie jest wartością "max_iter", jest to liczba iteracji EM. Zwykle jest to coś około 6. Nie powinno być M.

3) Tak, potrzebujesz Viterbi w trybie testowym.

+0

Wielkie dzięki za odpowiedź Nikolay. – bluemustang