我想创建一个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,)
我创建了一个数据库,数据,形状(1000,5,500),目标矢量的形状(1000,1) .
然后我分割数据(X_train,X_test,y_train,y_test) .
将这样的矩阵赋予lstm模型是否可以?因为我的表现很差 . 从我所看到的情况来看,人们只提供1D或2D数据,然后在给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) . 在我的情况下得分如此糟糕是正常的吗?还有更好的方法吗?
谢谢
1 回答
通过将数据转换为(样本,5,500),您可以获得LSTM 5个时间步长和500个功能 . 根据您的数据,您似乎希望处理每列的所有500行和5个要素以进行预测 . LSTM输入是(样本,时间步长,功能) . 因此,如果您的行代表进行5次测量的时间步长,那么您需要置换最后2个维度并在第一个LSTM层中设置
input_shape=(500, 5)
.此外,由于您的输出是布尔值,您可以通过在最终密集层中使用
activation='sigmoid'
获得更稳定的训练,并使用loss='binary_crossentropy
进行二进制分类 .