'LSTM output unexpected predict shape

I want build a LSTM model to predict category label, bases on 60 days data

Basically:

Input - 60 days timewindow, 1 feature
  - train data  x (2571, 60, 1) y (2571, 1)
  - test data x (60, 1), y (1)
Output - 1 label either 0 or 1

One thing I am not sure is, should I shape train/test x as (60,1) or (1, 60)

I made a LSTM network like:

Model: "sequential_5"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 lstm_15 (LSTM)              (None, 60, 128)           66560     
                                                                 
 dropout_10 (Dropout)        (None, 60, 128)           0         
                                                                 
 lstm_16 (LSTM)              (None, 60, 64)            49408     
                                                                 
 dropout_11 (Dropout)        (None, 60, 64)            0         
                                                                 
 lstm_17 (LSTM)              (None, 16)                5184      
                                                                 
 dense_5 (Dense)             (None, 1)                 17        
                                                                 
=================================================================
Total params: 121,169
Trainable params: 121,169
Non-trainable params: 0
_________________________________________________________________

here is my code:

lookback_time_win = 60
num_features = 1
model = Sequential()
model.add(LSTM(128, input_shape=(time_window_size, num_features), return_sequences=True))
model.add(Dropout(0.1))

model.add(LSTM(units=64, return_sequences=True))
model.add(Dropout(0.1))

# no need return sequences from 'the last layer'
model.add(LSTM(units=16))

# adding the output layer
model.add(Dense(units=1, activation='sigmoid'))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

but after train, I call the function model.predict like:

y = model.predict(x_test)

instead of my expected 0 or 1, I get y with shape like (60, 1)



Solution 1:[1]

After some debugging, I suspect the root cause was because of my x shape was wrong. Originally, my x test shape was(60, 1), after I reshape it to (1, 60), I get 1 output as y every time, shape (1). If I shape my test x as (60, 1), I get predicted y shape as (60,1)

But I get a new problem...

If I plot it together with my y_test, the y_predict is just in the middle.

enter image description here

My y_predict is completely making no sense, they are in very narrowed range from 0.45 to 0.447

enter image description here

If I take @Frightera's advise, using np.where(y_predicted_result>0.454, 1, 0) convert them into 0 or 1, it does not looks working, by comparing it with ground truth, no idea why it is like enter image description here

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1