如何为 LSTM keras 重塑 X_train 和 y_train
Posted
技术标签:
【中文标题】如何为 LSTM keras 重塑 X_train 和 y_train【英文标题】:How to reshape X_train and y_train for LSTM keras 【发布时间】:2022-01-14 17:46:58 【问题描述】:我有以下几点:
X_train.shape
(2730, 10)
y_train.shape
(2730)
我想用 keras 训练 LSTM 模型,但我不确定如何重塑输入。
我已经添加了这个 LSTM 层
time_steps = 30
input_dim = 10 # number of features
...
self.model.add(LSTM(self.hidden_dim, input_shape=(time_steps, self.input_dim), return_sequences=True))
...
input_shape 与我的输入不匹配。我应该如何重塑我的 X_train?我是否还必须重塑 y_train?
【问题讨论】:
【参考方案1】:我应该如何重塑我的 X_train?
最简单的选择是为您的数据添加timesteps
维度,使其与LSTM
兼容:
import tensorflow as tf
samples = 5
features = 10
data = tf.random.normal((samples, features))
time_series_data = tf.expand_dims(data, axis=1) # add timesteps dimension
tf.print('Data -->', tf.shape(data), 'Time series data', tf.shape(time_series_data))
# Data --> [5 10] Time series data [5 1 10]
但是,对于导致形状 (samples, 30, 10)
的每个特征,您希望使用 30 个 timesteps
。因此,您可以使用RepeatVector 层作为模型的一部分或tf.repeat。这是RepeatVector
层的示例:
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(10, input_shape=(features,)))
model.add(tf.keras.layers.RepeatVector(30))
model.add(tf.keras.layers.LSTM(32))
model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
model.build((1, 10))
tf.print(model.summary())
Model: "sequential_01"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_24 (Dense) (None, 10) 110
repeat_vector_1 (RepeatVect (None, 30, 10) 0
or)
lstm_3 (LSTM) (None, 32) 5504
dense_25 (Dense) (None, 1) 33
=================================================================
Total params: 5,647
Trainable params: 5,647
Non-trainable params: 0
_________________________________________________________________
None
您还可以先将 10 个特征映射到 300 维输出,然后重新调整输出以适应 LSTM
:
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(300, input_shape=(features,)))
model.add(tf.keras.layers.Reshape((30, 10)))
model.add(tf.keras.layers.LSTM(32))
model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
Model: "sequential_02"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_26 (Dense) (None, 300) 3300
reshape (Reshape) (None, 30, 10) 0
lstm_4 (LSTM) (None, 32) 5504
dense_27 (Dense) (None, 1) 33
=================================================================
Total params: 8,837
Trainable params: 8,837
Non-trainable params: 0
_________________________________________________________________
None
问题:
我是否还必须重塑 y_train?
这取决于你想要什么。如果您只有一个简单的分类任务,就像我在示例中假设的那样,那么您不需要更改 y_train。
更新 1: 您还可以像下面这样重塑您的数据。导致张量有 91 个样本,每个样本有 30 个时间步长,每个时间步长与 10 个特征相关联。
import tensorflow as tf
timesteps = 2730
features = 10
data = tf.random.normal((timesteps, features))
data = tf.reshape(data, (91, 30, features))
print(data.shape)
# (91, 30, 10)
【讨论】:
你为model.add(tf.keras.layers.LSTM(32)) 输入的32个单位是否有特定含义或可以任意替换? 没有具体含义,只是LSTM的输出空间。随心所欲地定义它。 谢谢。关于 RepeatVector() 只有一件事不清楚。如果它只是“重复”输入 n 次,它如何捕捉时间序列的顺序性?我错过了什么吗?我认为时间步长 (30) 不应该只是重复输入 30 次,而是时间序列中的 30 个实际步骤。 是的,你是对的!但问题是,您的数据本身并没有顺序性。这就是为什么我提出我所做的建议。虽然我建议使用第一个选项。 我用的数据其实是时间序列以上是关于如何为 LSTM keras 重塑 X_train 和 y_train的主要内容,如果未能解决你的问题,请参考以下文章