使用Keras的LSTM层训练分类RNN

时间:2020-10-12 16:21:08

标签: keras lstm recurrent-neural-network

我有来自四个不同人体传感器的顺序数据,并希望使用Keras API创建和训练一个递归神经网络(RNN),以使用这些参数来区分四种情绪/状态。

我的数据集如下:

(x_train, y_train), (x_test, y_test)

其中x_train和x_test是形状为(sensor1, sensor2, sensor3, sensor4)的四元组。 y_train和y_test用[0,1,2,3]范围内的整数标记它们各自的对应物。

我首先生成class_weights,因为不同的心情在数据之间分布不均。

我想建立这样的神经网络:

(CuDNN)LSTM (Input)
Dropout
BatchNormalization

(CuDNN)LSTM
Dropout
BatchNormalization

Dense
Dropout

Dense(Output)

我尝试了许多不同的方法:

使用有状态的RNN(据我所知,这是此用例的最佳实践),您需要在第一(LSTM)层中指定batch_input_size参数。

batch_size = 1024
no_of_features = 4
time_steps = 3

model = Sequential()
model.add(CuDNNLSTM(32, batch_input_shape=(batch_size, time_steps, no_of_features), return_sequences=True, stateful=True))
[...]

使用fit()-functinon碰到tensorflow.python.framework.errors_impl.InvalidArgumentError: Invalid input_h shape: [1,1024,32] [1,926,32]。 [1,926,32]中的'926'似乎在某种程度上取决于我的输入数据的大小,并且似乎总是小于batch_size(可能是模数?),但我不知道怎么做。

这是我第二次尝试,使用的是更简单的体系结构:

model = Sequential()

model.add(CuDNNLSTM(128, input_shape=x_train[0].shape, return_sequences=True, name="LSTM_1"))
model.add(Dropout(0.2))
model.add(BatchNormalization())

model.add(CuDNNLSTM(128, name="LSTM_2"))
model.add(Dropout(0.2))
model.add(BatchNormalization())

model.add(Dense(32, activation="relu"))
model.add(Dropout(0.2))

model.add(Dense(classes, activation="softmax"))

使用无状态LSTM层的这种简单得多的方法开始(甚至完成)训练,但是既不能评估,也不能使用ModelCheckpoints或model.save()方法保存,我也怀疑它的准确性(这是最终的训练结果:loss: 1.2050 - accuracy: 0.5823 - val_loss: 1.1452 - val_accuracy: 0.0000e+00)。

当尝试保存模型时,我得到了这个ValueError: Input 0 is incompatible with layer sequential: expected shape=(None, None, 4), found shape=[None, 4, 1],并且在评估之前试图保存它,这发生了:ValueError: Layer has 2 states but was passed 0 initial states.(所讨论的层是“ LSTM_1”)。

我希望能得到更深入的解答,而不仅仅是一些代码片段,因为我(您可能会注意到)对本主题(尤其是Keras)非常陌生,如果您愿意,我将很乐意提供进一步的代码或信息需要。

0 个答案:

没有答案