使用Keras与LSTM和RNN进行斗争

问题描述 投票:1回答:1

我正在研究使用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数量的节点/层或类似的东西的建议。

python-3.x tensorflow keras google-colaboratory
1个回答
1
投票

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有很多图像处理方法。

© www.soinside.com 2019 - 2024. All rights reserved.