LSTM 输出意外的预测形状
LSTM output unexpected predict shape
我想建立一个 LSTM 模型来预测类别标签,基于 60 天的数据
基本上:
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
我不确定的一件事是,我应该将 train/test x 塑造成 (60,1) 还是 (1, 60)
我做了一个 LSTM 网络:
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
_________________________________________________________________
这是我的代码:
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'])
但是在火车之后,我调用函数 model.predict 就像:
y = model.predict(x_test)
我得到的 y 不是我预期的 0 或 1,而是形状 (60, 1)
经过一些调试,我怀疑根本原因是因为我的 x 形状不对。
最初,我的 x 测试形状是 (60, 1),在我将它重塑为 (1, 60) 之后,我每次都得到 1 个输出作为 y,形状 (1)。如果我将测试 x 塑造为 (60, 1),则预测的 y 形状为 (60,1)
但是我遇到了一个新问题...
如果我将它与我的 y_test 一起绘制,y_predict 就在中间。
我的 y_predict 完全没有意义,它们的范围很窄,从 0.45
到 0.447
如果我接受@Frightera 的建议,使用 np.where(y_predicted_result>0.454, 1, 0)
将它们转换为 0 或 1,它看起来不工作,通过将它与基本事实进行比较,不知道为什么会这样
我想建立一个 LSTM 模型来预测类别标签,基于 60 天的数据
基本上:
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
我不确定的一件事是,我应该将 train/test x 塑造成 (60,1) 还是 (1, 60)
我做了一个 LSTM 网络:
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
_________________________________________________________________
这是我的代码:
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'])
但是在火车之后,我调用函数 model.predict 就像:
y = model.predict(x_test)
我得到的 y 不是我预期的 0 或 1,而是形状 (60, 1)
经过一些调试,我怀疑根本原因是因为我的 x 形状不对。 最初,我的 x 测试形状是 (60, 1),在我将它重塑为 (1, 60) 之后,我每次都得到 1 个输出作为 y,形状 (1)。如果我将测试 x 塑造为 (60, 1),则预测的 y 形状为 (60,1)
但是我遇到了一个新问题...
如果我将它与我的 y_test 一起绘制,y_predict 就在中间。
我的 y_predict 完全没有意义,它们的范围很窄,从 0.45
到 0.447
如果我接受@Frightera 的建议,使用 np.where(y_predicted_result>0.454, 1, 0)
将它们转换为 0 或 1,它看起来不工作,通过将它与基本事实进行比较,不知道为什么会这样