我想创建一个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)。在我的情况下得分如此糟糕是正常的吗?还有更好的方法吗?
由于
答案 0 :(得分:1)
通过将数据转换为(样本,5,500),您将获得LSTM 5个时间步长和500个功能。根据您的数据,您似乎希望处理每列的所有500行和5个要素以进行预测。 LSTM输入是(样本,时间步长,功能)。因此,如果您的行代表进行5次测量的时间步长,那么您需要置换最后2个维度并在第一个LSTM图层中设置input_shape=(500, 5)
。
此外,由于您的输出为布尔值,因此您可以在最终密集图层中使用activation='sigmoid'
进行更稳定的训练,并使用loss='binary_crossentropy
进行二进制分类。