使用 Keras 处理 LSTM 和 RNN
Struggle with LSTM and RNN using Keras
我正在使用 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 个样本进行测试。
随时留下关于其他方法的建议,nodes/layers 的神秘数字或类似的东西。
LSTM 输入是 3 维 [n_samples、n_timesteps、n_features],因此您的第一行还需要启用 return 序列:
rnn.add(keras.layers.SimpleRNN(500, return_sequences = True, input_shape = (864, 4)))
接下来,你的密集层会抱怨错误的输入大小,所以你想删除最后一个 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)
pillow 包中的 PIL 有很多图像处理方法。
我正在使用 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 个样本进行测试。
随时留下关于其他方法的建议,nodes/layers 的神秘数字或类似的东西。
LSTM 输入是 3 维 [n_samples、n_timesteps、n_features],因此您的第一行还需要启用 return 序列:
rnn.add(keras.layers.SimpleRNN(500, return_sequences = True, input_shape = (864, 4)))
接下来,你的密集层会抱怨错误的输入大小,所以你想删除最后一个 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)
pillow 包中的 PIL 有很多图像处理方法。