Борьба с LSTM и RNN с использованием Keras - PullRequest
1 голос
/ 26 апреля 2019

Я работаю над проблемой распознавания речи, работающей на Colab с использованием LSTM. Аудио файлы были преобразованы в спектрограммы и затем нормализованы. Всего имеется 6840 спектрограмм и форма каждого из них (288, 864, 4). Я уже пробовал несколько примеров с RNN и CNN, и они работали, но когда я пробую пример с использованием LSTM, я получаю ошибки формы, каждый раз, когда есть на одно большее или одно меньшее измерение, чем ожидалось. Вот некоторые из этих случаев:

rnn = keras.Sequential()
rnn.add(keras.layers.SimpleRNN(500, input_shape = (864, 4)))
rnn.add(keras.layers.LSTM(500, return_sequences = True))
rnn.add(keras.layers.Dropout(0.2))
rnn.add(keras.layers.LSTM(500, return_sequences = True))
rnn.add(keras.layers.Dropout(0.2))
rnn.add(keras.layers.LSTM(500, return_sequences = True))
rnn.add(keras.layers.Dropout(0.2))
rnn.add(keras.layers.Dense(212, activation = 'softmax'))
rnn.compile(optimizer = 'adam', loss = 'sparse_categorical_crossentropy',metrics = ['accuracy'])
rnn.fit(X_train, y_train, epochs = 5, validation_data=(X_test, y_test))
scores = rnn.evaluate(X_test, y_test, verbose=1)
print('Test loss:', scores[0])
print('Test accuracy:', '%.2f' % (scores[1] * 100), '%')

На первом слое LSTM возникает следующая ошибка: ValueError: Input 0 of layer lstm_54 is incompatible with the layer: expected ndim=3, found ndim=2. Full shape received: [None, 500]

Если я удалю строку SimpleRNN и передам вход непосредственно в первый LSTM, как это rnn.add(keras.layers.LSTM(500, return_sequences = True, input_shape = (288, 864, 4)))
Я получаю: ValueError: Input 0 of layer lstm_56 is incompatible with the layer: expected ndim=3, found ndim=4. Full shape received: [None, 288, 864, 4]

Я попытался изменить изображения (4, 288 * 864) и получил ту же ошибку при попытке использовать слой RNN, но только с LSTM я получил InvalidArgumentError: Incompatible shapes: [32] vs. [32,4].
Хотя понятия не имею, откуда взялись 32.

И последнее: не проблема, а скорее вопрос, есть ли какая-нибудь библиотека, которая может изменять размеры изображений простым способом? 288x864 слишком велико для Colab, поэтому мне придется в конечном итоге сделать это, чтобы иметь возможность загрузить все 6840 изображений и передать их в нейронную сеть. Сейчас я использую 100 образцов для тестирования.

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

1 Ответ

1 голос
/ 26 апреля 2019

LSTM вводится в 3 измерениях [n_samples, n_timesteps, n_features], поэтому в первой строке также необходимо включить возвращаемые последовательности:

rnn.add(keras.layers.SimpleRNN(500, return_sequences = True, input_shape = (864, 4)))

Затем ваш плотный слой будет жаловаться на неправильный размер ввода, поэтому вы хотите удалить return_sequence в последней сети LSTM:

rnn.add(keras.layers.LSTM(500))

Если вы все еще хотите сохранить return_sequences = True на последнем слое LSTM, возможно, вы захотите обернуть плотный слой в TimeDistributed.

Я попробовал это на следующем входе, и они, кажется, работают

X_train = np.random.rand(100, 864, 4)
y_train = np.random.rand(100, 1)

PIL из пакета подушек имеет множество методов обработки изображений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...