3

Я пытаюсь реализовать классификатор на основе LSTM для классификации дескретной речи. Я создал функциональные векторы с 13 mfcc. Для данного файла есть 2D-вектор [99, 13]. После выполнения примера mnist_irnn я мог настроить однослойный RNN для классификации моих речевых файлов. Но теперь я хочу добавить в сеть больше слоев. Поэтому я пытаюсь реализовать сеть с двумя слоями LSTM и слоем softmax в качестве выходного уровня. Пройдя через количество сообщений здесь, я мог настроить сеть следующим образом, где она не бросает никаких исключений во время создания модели.Как складывать слои LSTM для классификации речевых файлов

from __future__ import print_function 
import numpy as np 

from keras.optimizers import SGD 
from keras.utils.visualize_util import plot 

np.random.seed(1337) # for reproducibility 
from keras.preprocessing import sequence 
from keras.utils import np_utils 
from keras.models import Sequential 
from keras.layers.core import Dense, Dropout, Activation, TimeDistributedDense 
from keras.layers.recurrent import LSTM 
from SpeechResearch import loadData 

batch_size = 5 
hidden_units = 100 
nb_classes = 10 
print('Loading data...') 
(X_train, y_train), (X_test, y_test) = loadData.load_mfcc(10, 2) 

print(len(X_train), 'train sequences') 
print(len(X_test), 'test sequences') 
print('X_train shape:', X_train.shape) 
print('X_test shape:', X_test.shape) 
print('y_train shape:', y_train.shape) 
print('y_test shape:', y_test.shape) 
print('Build model...') 

Y_train = np_utils.to_categorical(y_train, nb_classes) 
Y_test = np_utils.to_categorical(y_test, nb_classes) 
print(batch_size, 99, X_train.shape[2]) 
print(X_train.shape[1:]) 
print(X_train.shape[2]) 
model = Sequential() 

model.add(LSTM(output_dim=hidden_units, init='uniform', inner_init='uniform', 
       forget_bias_init='one', activation='tanh', inner_activation='sigmoid', return_sequences=True, 
       stateful=True, batch_input_shape=(batch_size, 99, X_train.shape[2]))) 
# model.add(Dropout(0.5)) 
model.add(LSTM(output_dim=hidden_units, init='uniform', inner_init='uniform', 
       forget_bias_init='one', activation='tanh', inner_activation='sigmoid', return_sequences=True, 
       stateful=True, input_length=X_train.shape[2])) 

model.add(TimeDistributedDense(input_dim=hidden_units, output_dim=nb_classes)) 
model.add(Activation('softmax')) 

# try using different optimizers and different optimizer configs 
sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True) 
model.compile(loss='categorical_crossentropy', optimizer=sgd) 

print("Train...") 
model.fit(X_train, Y_train, batch_size=batch_size, nb_epoch=3, validation_data=(X_test, Y_test), show_accuracy=True) 
score, acc = model.evaluate(X_test, Y_test, 
          batch_size=batch_size, 
          show_accuracy=True) 
print('Test score:', score) 
print('Test accuracy:', acc) 

Я пробовал разные значения в разных точках. (На данный момент я пытался с небольшим образцом, поэтому значения очень малы) Но теперь он бросает исключение во время обучения. Некоторое несоответствие размеров.

Using Theano backend. 
Loading data... 
100 train sequences 
20 test sequences 
X_train shape: (100, 99, 13) 
X_test shape: (20, 99, 13) 
y_train shape: (100,) 
y_test shape: (20,) 
Build model... 
5 99 13 
(99, 13) 
13 
Train... 
Train on 100 samples, validate on 20 samples 
Epoch 1/3 

Traceback (most recent call last): 
    File "/home/udani/PycharmProjects/testResearch/SpeechResearch/lstmNetwork.py", line 54, in <module> 
    model.fit(X_train, Y_train, batch_size=batch_size, nb_epoch=3, validation_data=(X_test, Y_test), show_accuracy=True) 
    File "/usr/local/lib/python2.7/dist-packages/keras/models.py", line 581, in fit 
    shuffle=shuffle, metrics=metrics) 
    File "/usr/local/lib/python2.7/dist-packages/keras/models.py", line 239, in _fit 
    outs = f(ins_batch) 
    File "/usr/local/lib/python2.7/dist-packages/keras/backend/theano_backend.py", line 365, in __call__ 
    return self.function(*inputs) 
    File "/home/udani/Documents/ResearchSW/Theano/theano/compile/function_module.py", line 786, in __call__ 
    allow_downcast=s.allow_downcast) 
    File "/home/udani/Documents/ResearchSW/Theano/theano/tensor/type.py", line 177, in filter 
    data.shape)) 
TypeError: ('Bad input argument to theano function with name "/usr/local/lib/python2.7/dist-packages/keras/backend/theano_backend.py:362" at index 1(0-based)', 'Wrong number of dimensions: expected 3, got 2 with shape (5, 10).') 

Я хотел бы знать, что я делаю неправильно здесь. Я весь день просматриваю код, но все же я не могу понять причину несоответствия измерений.

Кроме того, я был бы очень благодарен, если кто-то может объяснить, что это означает, output_dim. (Это то, что форма вектора выводится одним узлом, когда у нас есть n число узлов в данном слое? Должно ли оно быть равно числу узлов в следующем слое?)

+0

Удани, почему вы используете разные учетные записи? –

+0

Уже обсуждался на http://stackoverflow.com/questions/34661818/building-speech-dataset-for-lstm-binary-classification/34667051#34667051 –

+0

@NikolayShmyrev Хорошо, я получаю предупреждение о том, чтобы запретить мои вопросы. Я боюсь, что они запретят мне переполнение стека. Поэтому я попросил моего друга опубликовать его для меня. У меня нет никого, кто мог бы задать эти вопросы. – udani

ответ

1

У вас возникла проблема с Y, результат должен быть примерно (100, 99, 10), то есть набор последовательностей выходов, то же, что и функции, всего 1 выход. Кажется, ваш вектор Y отличается. Метод to_categorical на самом деле не применим к последовательностям, он ожидает вектор.

В качестве альтернативы вы можете выводить один вектор и подача его в плотный слой в в последнем слое LSTM с return_sequences=False

Вам не нужно с учетом состояния сети, а также.

+0

Вы имеете в виду, вместо того, чтобы использовать один ярлык для всего файла (сопоставление много-к-одному, как в примере mnist), я должен использовать метки для каждого фрейма. Метка на кадр должна быть в категориальном формате (как 0 0 0 0 0 0 0 0 0 01 для 9)? Кроме того, мне не нужно включать фиктивные значения, как указано в приведенной выше ссылке? – udani

+0

Да, это правильно –

+0

Означает ли это, когда мы берем образец (значение 9), все метки (для 99 кадров) должны быть такими, как указано выше (такая же категориальная метка для всех 99 кадров)? – udani

Смежные вопросы