Reputation: 1487
I have a dataset C
of 50,000
(binary) samples each of 128
features. The class label is also binary either 1
or -1
. For instance, a sample would look like this [1,0,0,0,1,0, .... , 0,1] [-1]
. My goal is to classify the samples based on the binary classes( i.e., 1 or -1). I thought to try using Recurrent LSTM
to generate a good model for classification. To do so, I have written the following code using Keras
library:
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))
However, I am getting bad accuracy, not more than 55%. I tried to change the activation function along with the loss function hoping to improve the accuracy but nothing works. Surprisingly, when I use Multilayer Perceptron, I get very good accuracy around 97%. Thus, I start questioning if LSTM can be used for classification or maybe my code here has something missing or it is wrong. Kindly, I want to know if the code has something missing or wrong to improve the accuracy. Any help or suggestion is appreciated.
Upvotes: 1
Views: 115
Reputation: 40506
You cannot use softmax
as an output when you have only a single output unit as it will always output you a constant value of 1
. You need to either change output activation to sigmoid
or set output units number to 2
and loss to categorical_crossentropy
. I would advise the first option.
Upvotes: 1