1

我有一个数据集C50,000(二进制)样本,每个样本的128功能。类标签也是二进制文件,即1-1。例如,样本看起来像这样[1,0,0,0,1,0, .... , 0,1] [-1]。我的目标是根据二进制类(即1或-1)对样本进行分类。我想尝试使用Recurrent LSTM来生成一个很好的分类模型。是否可以使用STATEFUL循环NN(LSTM)进行分类

tr_C, ts_C, tr_r, ts_r = train_test_split(C, r, train_size=.8) 
batch_size = 200 

print('>>> Build STATEFUL model...') 
model = Sequential() 
model.add(LSTM(128, batch_input_shape=(batch_size, C.shape[1], C.shape[2]), return_sequences=False, stateful=True)) 
model.add(Dense(1, activation='softmax')) 

print('>>> Training...') 
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) 
model.fit(tr_C, tr_r, 
      batch_size=batch_size, epochs=1, shuffle=True, 
      validation_data=(ts_C, ts_r)) 

但是,我越来越坏的准确性,不超过55%:要做到这一点,我一直在使用Keras库编写下面的代码。我试图改变激活函数以及希望提高精度的损失函数,但没有任何效果。令人惊讶的是,当我使用多层感知器时,我的准确率达到了97%左右。因此,我开始质疑LSTM是否可以用于分类,或者我的代码有缺失或错误。请注意,我想知道代码是否有缺失或错误来提高准确性。任何帮助或建议表示赞赏。

回答

1

当你只有一个输出单位时,你不能使用softmax作为输出,因为它总会输出一个固定值1。您需要将输出激活更改为sigmoid或将输出单位编号设置为2,并将损失设置为categorical_crossentropy。我会建议第一个选项。

+0

感谢您的回复。非常感激 – Kris

相关问题