一句话介绍LSTM,它是RNN的进阶版,如果说RNN的最大限度是理解一句话,那么LSTM的最大限度则是理解一段话,详细介绍如下:

LSTM,全称为长短期记忆网络(Long Short Term Memory networks),是一种特殊的RNN,能够学习到长期依赖关系。1997提出,许多研究者进行了一系列的工作对其改进并使之发扬光大。LSTM在许多问题上效果非常好,现在被广泛使用。

所有的循环神经网络都有着重复的神经网络模块形成链的形式。在普通的RNN中,重复模块结构非常简单,其结构如下:

长短期记忆网络 回归预测 长短期记忆网络lstm_lstm

LSTM避免了长期依赖的问题。可以记住长期信息!LSTM内部有较为复杂的结构。能通过门控状态来选择调整传输的信息,记住需要长时间记忆的信息,忘记不重要的信息,其结构如下:

长短期记忆网络 回归预测 长短期记忆网络lstm_深度学习_02


一、LSTM的数据处理流程

为了更好的理解LSTM输入数据的结构,我将时序数据(LSTM输入数据)以可视化的形式呈现。

长短期记忆网络 回归预测 长短期记忆网络lstm_lstm_03

长短期记忆网络 回归预测 长短期记忆网络lstm_长短期记忆网络 回归预测_04

长短期记忆网络 回归预测 长短期记忆网络lstm_深度学习_05

根据输入的数据结构、预测输出,我们的程序可以大致分为以下六类:

长短期记忆网络 回归预测 长短期记忆网络lstm_rnn_06

二、关于代码实现

1. 单输入单输出(单输出时间步)

长短期记忆网络 回归预测 长短期记忆网络lstm_数据_07

  • 输入:单个特征,多个时间步
  • 输出:单个特征,单个时间步

🥫 数据案例

训练集:
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. 多输入单输出(单输出时间步)

长短期记忆网络 回归预测 长短期记忆网络lstm_rnn_08

  • 输入:多个特征,多个时间步
  • 输出:单个特征,单个时间步

🥫 数据案例

训练集:
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. 多输入多输出(单输出时间步)

长短期记忆网络 回归预测 长短期记忆网络lstm_数据_09

  • 输入:多个特征,多个时间步
  • 输出:多个特征,单个时间步

🥫 数据案例

训练集:
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. 单输入单输出(多输出时间步)

长短期记忆网络 回归预测 长短期记忆网络lstm_数据_10

  • 输入:单个特征,多个时间步
  • 输出:单个特征,多个时间步

🥫 数据案例

训练集:
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


多输入单输出(多输出时间步)与多输入多输出(多输出时间步)同理,这里就不赘述了

长短期记忆网络 回归预测 长短期记忆网络lstm_深度学习_11