Home > Mobile >  LSTM output unexpected predict shape
LSTM output unexpected predict shape

Time:03-15

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)

CodePudding user response:

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

  • Related