一句话介绍LSTM,它是RNN的进阶版,如果说RNN的最大限度是理解一句话,那么LSTM的最大限度则是理解一段话,详细介绍如下:
LSTM,全称为长短期记忆网络(Long Short Term Memory networks),是一种特殊的RNN,能够学习到长期依赖关系。1997提出,许多研究者进行了一系列的工作对其改进并使之发扬光大。LSTM在许多问题上效果非常好,现在被广泛使用。
所有的循环神经网络都有着重复的神经网络模块形成链的形式。在普通的RNN中,重复模块结构非常简单,其结构如下:
LSTM避免了长期依赖的问题。可以记住长期信息!LSTM内部有较为复杂的结构。能通过门控状态来选择调整传输的信息,记住需要长时间记忆的信息,忘记不重要的信息,其结构如下:
一、LSTM的数据处理流程
为了更好的理解LSTM输入数据的结构,我将时序数据(LSTM输入数据)以可视化的形式呈现。
根据输入的数据结构、预测输出,我们的程序可以大致分为以下六类:
二、关于代码实现
1. 单输入单输出(单输出时间步)
- 输入:单个特征,多个时间步
- 输出:单个特征,单个时间步
🥫 数据案例
训练集:
X y
[10, 20, 30, 40, 50] [60]
[20, 30, 40, 50, 60] [70]
[30, 40, 50, 60, 70] [80]
…
预测输入:
X
[70, 80, 90, 100 ,110]
期待输出:
y
[120]
🥠 TensorFlow2代码实现
model = Sequential()
model.add( LSTM(50, activation='relu', input_shape = (n_steps, n_features)) )
model.add( Dense(1) )
model.compile(optimizer='adam', loss='mse')
n_steps = 5
n_features = 1
2. 多输入单输出(单输出时间步)
- 输入:多个特征,多个时间步
- 输出:单个特征,单个时间步
🥫 数据案例
训练集:
X y
[[10,11],
[20,21],
[30,31],
[40,41],
[50,51]] 60
[[20,21],
[30,31],
[40,41],
[50,51],
[60,61]] 70
…
预测输入:
X
[[30,31],
[40,41],
[50,51],
[60,61],
[70,71]]
期待输出:
y
80
🥠 TensorFlow2代码实现
model = Sequential()
model.add(LSTM(50, activation='relu', input_shape=(n_steps, n_features)))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')
n_steps = 5
# 此例中 n_features = 2,因为输入有两个并行序列
n_features = X.shape[2]
3. 多输入多输出(单输出时间步)
- 输入:多个特征,多个时间步
- 输出:多个特征,单个时间步
🥫 数据案例
训练集:
X y
[[10,11],
[20,21],
[30,31],
[40,41],
[50,51]] [60,61]
[[20,21],
[30,31],
[40,41],
[50,51],
[60,61]] [70,71]
…
预测输入:
X
[[30,31],
[40,41],
[50,51],
[60,61],
[70,71]]
期待输出:
y
[80,81]
🥠 TensorFlow2代码实现
model = Sequential()
model.add(LSTM(100, activation='relu', return_sequences=True, input_shape=(n_steps, n_features)))
model.add(Dense(n_features))
model.compile(optimizer='adam', loss='mse')
n_steps = 5
# 此例中 n_features = 2,因为输入有2个并行序列
n_features = X.shape[2]
4. 单输入单输出(多输出时间步)
- 输入:单个特征,多个时间步
- 输出:单个特征,多个时间步
🥫 数据案例
训练集:
X y
[10,20,30,40,50] [60,70]
[20,30,40,50,60] [70,80]
…
预测输入:
X
[30,40,50,60,70]
期待输出:
y
[80,90]
🥠 TensorFlow2代码实现
model = Sequential()
model.add(LSTM(100, activation='relu', return_sequences=True, input_shape=(n_steps, n_features)))
model.add(Dense(n_steps_out))
model.compile(optimizer='adam', loss='mse')
n_steps = 5
n_steps_out = 2
n_features = 1
多输入单输出(多输出时间步)与多输入多输出(多输出时间步)同理,这里就不赘述了