Keras LSTM时间序列数据分类模型精度低

Keras LSTM时间序列数据分类模型精度低,keras,lstm,Keras,Lstm,我正在尝试使用LSTM层创建一个时间序列分析模型,但是,即使使用密集层且没有LSTM,精度也非常低。 数据为时间序列(合成光谱),取决于4个参数。通过更改参数,可以使用不同大小的数据集,其中每个样本或多或少都不同于其他样本。但无论数据集大小,准确率总是低至0.0-0.32% 带有LSTM的模型: print(trainset.shape) print(testset.shape) print(trainlabels.shape) model = Sequential() model.add

我正在尝试使用LSTM层创建一个时间序列分析模型,但是,即使使用密集层且没有LSTM,精度也非常低。 数据为时间序列(合成光谱),取决于4个参数。通过更改参数,可以使用不同大小的数据集,其中每个样本或多或少都不同于其他样本。但无论数据集大小,准确率总是低至0.0-0.32%

带有LSTM的模型:

print(trainset.shape)
print(testset.shape)
print(trainlabels.shape)

model = Sequential()

model.add(Masking(mask_value=0.0, input_shape=(trainset.shape[1], trainset.shape[2])))

model.add(LSTM(10, activation='relu', stateful=False, return_sequences=False))
model.add(Dropout(0.3))
model.add(Dense(len(trainlabels), activation='relu'))

model.compile(loss='sparse_categorical_crossentropy', 
              optimizer='Adam', metrics=['accuracy'])

print(model.summary())
model.fit(trainset, trainlabels, validation_data=(testset, testlabels), 
          epochs=3, batch_size=10)

scores = model.evaluate(testset, testlabels, verbose=0)
print("Accuracy: %.2f%%" % (scores[1]*100))
输出:

(2478, 600, 1)
(620, 600, 1)
(2478,)
Model: "sequential_7"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
masking_7 (Masking)          (None, 600, 1)            0         
_________________________________________________________________
lstm_7 (LSTM)                (None, 10)                480       
_________________________________________________________________
dropout_7 (Dropout)          (None, 10)                0         
_________________________________________________________________
dense_7 (Dense)              (None, 2478)              27258     
=================================================================
Total params: 27,738
Trainable params: 27,738
Non-trainable params: 0
_________________________________________________________________
None
Train on 2478 samples, validate on 620 samples
Epoch 1/3
2478/2478 [==============================] - 53s 22ms/step - loss: 8.9022 - accuracy: 4.0355e-04 - val_loss: 7.8152 - val_accuracy: 0.0016
Epoch 2/3
2478/2478 [==============================] - 54s 22ms/step - loss: 7.8152 - accuracy: 4.0355e-04 - val_loss: 7.8152 - val_accuracy: 0.0016
Epoch 3/3
2478/2478 [==============================] - 53s 21ms/step - loss: 7.8152 - accuracy: 4.0355e-04 - val_loss: 7.8152 - val_accuracy: 0.0016
Accuracy: 0.16%
Train on 1239 samples
Epoch 1/100
1239/1239 [==============================] - 1s 1ms/sample - loss: 8.5421 - accuracy: 0.0033
Epoch 2/100
1239/1239 [==============================] - 0s 371us/sample - loss: 6.2039 - accuracy: 0.0025
Epoch 3/100
1239/1239 [==============================] - 0s 347us/sample - loss: 5.6502 - accuracy: 0.0033
****
Epoch 97/100
1239/1239 [==============================] - 0s 380us/sample - loss: 0.1472 - accuracy: 0.9746
Epoch 98/100
1239/1239 [==============================] - 0s 364us/sample - loss: 0.1562 - accuracy: 0.9680
Epoch 99/100
1239/1239 [==============================] - 1s 408us/sample - loss: 0.1511 - accuracy: 0.9721
Epoch 100/100
1239/1239 [==============================] - 0s 378us/sample - loss: 0.1719 - accuracy: 0.9680
310/1 - 0s - loss: 18.6845 - accuracy: 0.0000e+00
0.0
训练数据中的某些值为0.0,因此使用掩蔽。 我尝试过使用不同的损耗、优化器、激活、退出和层参数。即使在添加更密集的层或更改批次大小后,结果也始终相同

具有高密度的模型:

数据格式是2D而不是3D

model=keras.Sequential([
    keras.layers.Masking(mask_value=0.0, input_shape=(trainset.shape[1],)),

    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dropout(0.05),
    keras.layers.Dense(64, activation='relu'),
    keras.layers.Dropout(0.05),
    keras.layers.Dense(len(labels), activation='softmax')
])

model.compile(optimizer='adam', 
             loss='sparse_categorical_crossentropy',
             metrics=['accuracy'])

model.fit(np.uint8(trainset), np.uint8(trainlabels), epochs=100)

test_loss, test_acc=model.evaluate(np.uint8(testset), np.uint8(testlabels),


          verbose=2)
print(test_acc)
输出:

(2478, 600, 1)
(620, 600, 1)
(2478,)
Model: "sequential_7"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
masking_7 (Masking)          (None, 600, 1)            0         
_________________________________________________________________
lstm_7 (LSTM)                (None, 10)                480       
_________________________________________________________________
dropout_7 (Dropout)          (None, 10)                0         
_________________________________________________________________
dense_7 (Dense)              (None, 2478)              27258     
=================================================================
Total params: 27,738
Trainable params: 27,738
Non-trainable params: 0
_________________________________________________________________
None
Train on 2478 samples, validate on 620 samples
Epoch 1/3
2478/2478 [==============================] - 53s 22ms/step - loss: 8.9022 - accuracy: 4.0355e-04 - val_loss: 7.8152 - val_accuracy: 0.0016
Epoch 2/3
2478/2478 [==============================] - 54s 22ms/step - loss: 7.8152 - accuracy: 4.0355e-04 - val_loss: 7.8152 - val_accuracy: 0.0016
Epoch 3/3
2478/2478 [==============================] - 53s 21ms/step - loss: 7.8152 - accuracy: 4.0355e-04 - val_loss: 7.8152 - val_accuracy: 0.0016
Accuracy: 0.16%
Train on 1239 samples
Epoch 1/100
1239/1239 [==============================] - 1s 1ms/sample - loss: 8.5421 - accuracy: 0.0033
Epoch 2/100
1239/1239 [==============================] - 0s 371us/sample - loss: 6.2039 - accuracy: 0.0025
Epoch 3/100
1239/1239 [==============================] - 0s 347us/sample - loss: 5.6502 - accuracy: 0.0033
****
Epoch 97/100
1239/1239 [==============================] - 0s 380us/sample - loss: 0.1472 - accuracy: 0.9746
Epoch 98/100
1239/1239 [==============================] - 0s 364us/sample - loss: 0.1562 - accuracy: 0.9680
Epoch 99/100
1239/1239 [==============================] - 1s 408us/sample - loss: 0.1511 - accuracy: 0.9721
Epoch 100/100
1239/1239 [==============================] - 0s 378us/sample - loss: 0.1719 - accuracy: 0.9680
310/1 - 0s - loss: 18.6845 - accuracy: 0.0000e+00
0.0
使用此模型,损失非常低,但精确度也很低

我的数据应该使用什么样的模型体系结构


提前感谢您帮助学习这些东西

你们真的有2478节课吗?此外,您的LSTM模型最后激活时有ReLU,如果这是真正的分类,则应为softmax是的,每个频谱一个,因为每个频谱有不同的参数。它们以一个包含4个参数的列表开始,并转换为一个字符串。然后枚举标签,基本上只将整数列表传递给模型(数组([0,1,2,….2478])。使用softmax时,激活精度为零。如果使用窗口,会发生什么情况?