Appearance
LSTM 简单教程
前置条件
- 安装
pytorch,numpy,matplotlib(可以是 CPU 版本,最好 GPU 版本)
开始
LSTM 的输入是张量(tensor)。张量的操作这里不表,LSTM 的作用就是给定某个的张量(输入),输出一个张量(输出)。中间的计算过程涉及到多个参数,这些参数都是可以自动学习的。关于输入和输出的张量的组织形式,文档 里有详细说明。
基本上,利用 PyTorch 编程时,人需要做的步骤包括:
- 处理好输入输出的训练数据,让它们满足 LSTM 网络的要求;
- 规定好训练次数,训练优化方法等,使得 LSTM 能够根据输出自动地调节参数;
- 将准备好的输入喂给 LSTM,开始训练;因为前一步已经指定了优化的方法,所以等待训练结束、LSTM 调整好参数即可;
- 观察结果,不满意则修改网络结构和优化方法等,重复上述步骤2~3。
接下来,以 sin 函数值预测为例讲解。
首先,通过 numpy.sin 生成一系列等间距正弦函数值。
python
import torch
import torch.nn as nn
import numpy as np
t = np.linspace(0, 100, 1000)
data = np.sin(t)1
2
3
4
5
6
2
3
4
5
6
计划通过历史的10个时间点的 sin 值。
- 预测下一个时间点的 sin 值。对每个时间点而言,输入的数据是单纯的1个实数,因此输入的维度是1;
- 每一次输入的时间序列包含10个时间点的值,因此时间序列长度10;
- 输出就是一个实数,维度也是1
而 LSTM 的输入的格式规定如下:

也就是说,如果给 LSTM 的输入张量是包含多组数据的,那么张量的第1维度L(序列长度),第2维度是N(分组数目),第3维度是输入维度。如果指定 batch_first=True,那么第1维度是分组数目,第2维度是序列长度,第3维度是输入维度。
输出的格式是类似的,可以参考文档。
将 data数据切分,从第一个数据开始,每次包含10个数据,依次往后截取形成输入 X,而其后的一个数据依次存储,就当做输出 y。如果最后形成了 N 组,那么,X 的形状应当是 (N, 10),y 的形状应当是 (N, 1)。
对于输入输出,可以知道 LSTM 都要求有3个维度,因此需要调整张量新增维度,这可以通过形如 [:, :, None] 这样的语法轻易地做到。
python
seq_length = 10
xs = []
ys = []
for i in range(len(data) - seq_length):
x = data[i : (i + seq_length)]
y = data[i + seq_length]
xs.append(x)
ys.append(y)
xs, ys = np.array(xs), np.array(ys)
# 转换成张量
# torch.Size([990, 10, 1])
trainX = torch.tensor(xs[:, :, None], dtype=torch.float32).cuda()
# torch.Size([990, 1])
trainy = torch.tensor(ys[:, None], dtype=torch.float32).cuda()1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
这样的 trainX 和 trainy 就是符合 LSTM 要求的输入了:分组数目=990,每一组的序列长度=10,序列的一个元素(输入)的维度=1。
WIP