【问题标题】:Struggle with LSTM and RNN using Keras使用 Keras 与 LSTM 和 RNN 斗争
【发布时间】:2019-09-15 12:04:47
【问题描述】:

我正在研究使用 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 个样本进行测试。

请随时留下有关其他方法、节点/层数或类似内容的建议。

【问题讨论】:

    标签: python-3.x tensorflow keras google-colaboratory


    【解决方案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))
    

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

    我在以下输入上进行了尝试,它们似乎可以工作

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

    pillow 包中的 PIL 有很多图像处理方法。

    【讨论】:

    • 感谢您的快速回复。我仍然收到此错误:ValueError: Error when checking input: expected simple_rnn_12_input to have 3 dimensions, but got array with shape (80, 288, 864, 4)。对于你的 X_train 你省略了第一个维度,所以它应该是 X_train = np.random.rand(100, 288, 864, 4)
    • 但它适用于重新调整的数组,非常感谢:)
    猜你喜欢
    • 2012-12-12
    • 2020-03-28
    • 1970-01-01
    • 2020-09-18
    • 2018-05-23
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多