我有来自四个不同人体传感器的顺序数据,并希望使用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)非常陌生,如果您愿意,我将很乐意提供进一步的代码或信息需要。