Keras LSTM 性能差劲

4
我想创建一个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

每个文件都有一个输出,它是一个布尔值(True 或 False),形状为 (1,)。

我创建了一个名为 data 的数据库,其形状为 (1000, 5, 500),目标向量的形状为 (1000, 1)。

然后我将数据拆分成 X_train、X_test、y_train 和 y_test。

我可以像这样向 lstm 模型提供矩阵吗?因为我的性能非常差。从我所看到的情况来看,人们只给出一个 1D 或 2D 数据,并在之后调整数据形状以便将一个 3D 输入提供给 lstm 层。

使用 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)。在我的情况下,这样低的得分正常吗?有更好的方法吗?

谢谢

1个回答

1
将数据转换为(samples, 5, 500) 的形式,可以为 LSTM 提供 5 个时间步长和 500 个特征。从您的数据中看来,您希望处理每列的所有 500 行和 5 个特征以进行预测。LSTM 的输入是 (samples, timesteps, features)。因此,如果您的行代表采取了 5 个测量值的时间步长,则需要交换最后两个维度,并在第一个 LSTM 层中设置 input_shape=(500, 5)
另外,由于您的输出是布尔值,在进行二元分类时,使用 activation='sigmoid' 在最后一个稠密层中可以获得更稳定的训练,并使用 loss='binary_crossentropy' 进行训练。

我在LSTM层中添加了“activation='sigmoid'”,并将'mae'损失更改为'binary_crossentropy'。 - user8530765
谢谢。我在lstm层中添加了 "activation='sigmoid'",并用 'binary_crossentropy' 替换了 'mae' 损失函数。我的分数提高到了0.52。但是我不确定我理解你解释的第一部分。每个数据行表示在某个时间采取的一系列测量。我不确定 '看起来你想要处理所有500行和每个列的5个特征来进行预测' 究竟意味着什么。 - user8530765
那么从你的问题中并不清楚,如果是这样,你有500个测量值在5个不同的时间点上,那么应该是(samples, 5, 500)。 - nuric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接