使用Keras与LSTM和RNN进行斗争

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Keras与LSTM和RNN进行斗争相关的知识,希望对你有一定的参考价值。

我正在研究使用LSTM在Colab上运行的语音识别问题。将音频文件转换为频谱图,然后进行归一化。共有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个样本来测试。

随意留下关于其他方法,cabalistic数量的节点/层或类似的东西的建议。

答案

LSTM输入是3维[n_samples,n_timesteps,n_features],因此您的第一行还需要启用返回序列:

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

接下来,您的Dense图层将输入错误的输入大小,因此您要删除最后一个LSTM网络上的return_sequence:

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

如果您仍想将return_sequences = True保留在最后一个LSTM图层上,您可能希望将Dense图层包装在TimeDistributed中。

我尝试了以下输入,它们似乎工作

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

枕头包装的PIL有很多图像处理方法。

以上是关于使用Keras与LSTM和RNN进行斗争的主要内容,如果未能解决你的问题,请参考以下文章

Keras 如何处理单元格和隐藏状态(RNN、LSTM)的初始值以进行推理?

使用Tensorflow后端的Keras LSTM RNN中令人费解的训练损失与纪元...行为的任何原因

Tensorflow RNN LSTM 输出解释

使用 Keras 功能 API 将时间序列与 RNN/LSTM 中的时间不变数据相结合

如何使用 keras RNN 在数据集中进行文本分类?

使用keras构建LSTM分类器