如何为 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的主要内容,如果未能解决你的问题,请参考以下文章

如何为 LSTM 重塑数据 - 时间序列多类分类

如何为 keras 中的 LSTM 回归准备输入数据?

如何为 LSTM 实现 Keras 自定义损失函数

在 Keras 中为 LSTM 重塑批次

如何为LSTM Keras中的多步和多变量准备时间序列数据

如何重塑文本数据以适合 keras 中的 LSTM 模型