2016-01-07 13 views
5

Sto provando a fare la classificazione LSTM binaria usando theano. Ho seguito il codice di esempio, ma voglio costruirlo da solo.Dataset Building Speech per la classificazione binaria LSTM

Ho un piccolo set di "Hello" & "Arrivederci" registrazioni che sto usando. Li ho preprocessati estraendo le funzionalità MFCC e salvando queste funzionalità in un file di testo. Ho 20 file vocali (10 ciascuno) e sto generando un file di testo per ogni parola, quindi 20 file di testo che contengono le funzionalità MFCC. Ogni file è una matrice 13x56.

Il mio problema ora è: come utilizzo questo file di testo per addestrare l'LSTM?

Sono relativamente nuovo a questo. Ho anche passato un po 'di letteratura su questo, ma non ho trovato una buona comprensione del concetto.

Sarebbe inoltre gradito qualsiasi modo più semplice utilizzando LSTM.

risposta

6

Esistono molte implementazioni esistenti, ad esempio Tensorflow Implementation, Kaldi-focused implementation with all the scripts, è meglio verificarle prima.

Theano è troppo basso, si potrebbe provare con keras invece, come descritto in tutorial. È possibile eseguire il tutorial "così com'è" per capire come vanno le cose.

Quindi, è necessario preparare un set di dati. È necessario convertire i dati in sequenze di frame di dati e per ogni frame di dati in sequenza è necessario assegnare un'etichetta di output.

Keras supporta due tipi di RNN: i livelli restituiscono sequenze e livelli restituiscono valori semplici. Puoi provare con entrambi, nel codice devi semplicemente usare return_sequences=True o return_sequences=False

Per allenarti con sequenze puoi assegnare un'etichetta fittizia per tutti i fotogrammi eccetto l'ultima in cui puoi assegnare l'etichetta della parola che vuoi riconoscere. È necessario posizionare le etichette di input e output sugli array. Così sarà:

X = [[word1frame1, word1frame2, ..., word1framen],[word2frame1, word2frame2,...word2framen]] 

Y = [[0,0,...,1], [0,0,....,2]] 

In X ogni elemento è un vettore di 13 galleggianti. In Y ogni elemento è solo un numero - 0 per i fotogrammi intermedi e l'ID parola per il fotogramma finale.

Per addestrare con solo etichette è necessario posizionare le etichette di input e output sugli array e l'array di output è più semplice. Quindi, i dati saranno:

X = [[word1frame1, word1frame2, ..., word1framen],[word2frame1, word2frame2,...word2framen]] 

Y = [[0,0,1], [0,1,0]] 

Nota che la produzione è vettorializzare (np_utils.to_categorical) per trasformarlo a vettori, invece di solo numeri.

Quindi si crea l'architettura di rete. Puoi avere 13 float per l'input, un vettore per l'output. Nel mezzo potresti avere uno strato completamente connesso seguito da un livello lstm. Non usare strati troppo grandi, inizia con quelli piccoli.

Quindi si alimenta questo set di dati in model.fit e si allena il modello. È possibile stimare la qualità del modello sul set di prova dopo l'allenamento.

Avrete un problema con la convergenza dato che avete solo 20 esempi. Avete bisogno di ulteriori esempi, preferibilmente di migliaia per addestrare LSTM, sarete in grado di utilizzare solo modelli molto piccoli.

+0

Ehi, grazie per la guida. Conosci un set di dati che ha come 100 saluti e registrati? –

+1

Qui puoi scaricare un database di cifre isolate: http://www.ece.ucsb.edu/Faculty/Rabiner/ece259/speech%20recognition%20course.html, ci sono circa 200 campioni per ogni cifra –

+0

Quindi se lo sono andando ad applicare questo metodo per i numeri (non binari) possiamo chiamarlo riconoscimento vocale? – udani