我想创建一个 lstm 模型来对信号进行分类。
假设我有 1000 个信号文件。每个文件都包含一个形状为 (500, 5) 的矩阵,这意味着在每个文件中,我有 5 个特征(列)和 500 行。
0 1 2 3 4
0 5 5.3 2.3 4.2 2.2
... ... ... ... ... ...
499 2500 1.2 7.4 6.7 8.6
对于每个文件,有一个输出是 bool 值(真或假)。形状是 (1,)
我创建了一个形状为 (1000, 5, 500) 的数据库数据,目标向量的形状为 (1000, 1)。
然后我拆分数据(X_train、X_test、y_train、y_test)。
把这样的矩阵给lstm模型可以吗?因为我的表现很差。据我所见,人们只提供 1D 或 2D 数据,然后他们 reshape 数据以向 lstm 层提供 3D 输入。
带有lstm的代码是这样的:
input_shape=(X_train.shape[1], X_train.shape[2]) #(5,500), i.e timesteps and features
model = Sequential()
model.add(LSTM(20, return_sequences=True))
model.add(LSTM(20))
model.add(Dense(1))
model.compile(loss='mae', optimizer='adam')
我更改了 LSTM 层中的单元格数量和层数,但分数基本相同(0.19)。在我的情况下有这么差的分数是否正常?有更好的方法吗?
谢谢
最佳答案
通过将您的数据转换为 (samples, 5, 500),您可以为 LSTM 提供 5 个时间步长和 500 个特征。从您的数据来看,您似乎希望处理每列的所有 500 行和 5 个特征以进行预测。 LSTM输入是(样本、时间步长、特征)。因此,如果您的行表示进行 5 次测量的时间步长,那么您需要排列最后 2 个维度并设置 input_shape=(500, 5)
在第一个 LSTM 层。
此外,由于您的输出是 bool 值,因此您可以使用 activation='sigmoid'
获得更稳定的训练。在最后的密集层中并使用 loss='binary_crossentropy
进行训练用于二元分类。
关于python-3.x - keras lstm 性能不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50463633/