栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

51 序列模型 动手学深度学习 PyTorch版 李沐视频课笔记

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

51 序列模型 动手学深度学习 PyTorch版 李沐视频课笔记

动手学深度学习 PyTorch版 李沐视频课笔记
    08 线性回归09 Softmax51 序列模型

文章目录

动手学深度学习 PyTorch版 李沐视频课笔记一、序列模型

1. 使用正弦函数和一些可加性噪声来生成序列数据,时间步为1,2,...,10002. 将数据映射为数据对 y t = x t y_t=x_t yt​=xt​和 x t = [ x t − τ , . . . , x t − 1 ] x_t=[x_{t-tau},...,x_{t-1}] xt​=[xt−τ​,...,xt−1​]3. 使用一个相当简单的架构训练模型:⼀个拥有两个全连接层的多层感知机,ReLU激活函数和平方损失4. 训练模型5. 模型预测下一个时间步6. 进行多步预测7. 进行k步预测


一、序列模型 1. 使用正弦函数和一些可加性噪声来生成序列数据,时间步为1,2,…,1000

Code:

%matplotlib inline
import torch
from torch import nn
from d2l import torch as d2l

T = 1000 # 总共产⽣1000个点
time = torch.arange(1, T + 1, dtype=torch.float32)
x = torch.sin(0.01 * time) + torch.normal(0, 0.2, (T,))
d2l.plot(time, [x], 'time', 'x', xlim=[1, 1000], figsize=(6, 3))

Result:

2. 将数据映射为数据对 y t = x t y_t=x_t yt​=xt​和 x t = [ x t − τ , . . . , x t − 1 ] x_t=[x_{t-tau},...,x_{t-1}] xt​=[xt−τ​,...,xt−1​]

Code:

tau = 4
features = torch.zeros((T - tau, tau))
for i in range(tau):
    features[:, i] = x[i: T - tau + i]
labels = x[tau:].reshape((-1, 1))

batch_size, n_train = 16, 600
# 只有前n_train个样本⽤于训练
train_iter = d2l.load_array((features[:n_train], labels[:n_train]),
batch_size, is_train=True)
3. 使用一个相当简单的架构训练模型:⼀个拥有两个全连接层的多层感知机,ReLU激活函数和平方损失

Code:

# 初始化⽹络权重的函数
def init_weights(m):
    if type(m) == nn.Linear:
        nn.init.xavier_uniform_(m.weight)
        
# ⼀个简单的多层感知机
def get_net():
    net = nn.Sequential(nn.Linear(4, 10), nn.ReLU(), nn.Linear(10, 1))
    net.apply(init_weights)
    return net

# 平⽅损失。注意:MSELoss计算平⽅误差时不带系数1/2
loss = nn.MSELoss(reduction='none')
4. 训练模型

Code:

def train(net, train_iter, loss, epochs, lr):
    trainer = torch.optim.Adam(net.parameters(), lr)
    for epoch in range(epochs):
        for X, y in train_iter:
            trainer.zero_grad()
            l = loss(net(X), y)
            l.sum().backward()
            trainer.step()
        print(f'epoch {epoch + 1}, 'f'loss: {d2l.evaluate_loss(net, train_iter, loss):f}')
        
net = get_net()
train(net, train_iter, loss, 5, 0.01)

Result:

5. 模型预测下一个时间步

Code:

onestep_preds = net(features)
d2l.plot([time, time[tau:]],
         [x.detach().numpy(), onestep_preds.detach().numpy()], 'time',
         'x', legend=['data', '1-step preds'], xlim=[1, 1000],figsize=(6, 3))

Result:

6. 进行多步预测

Code:

multistep_preds = torch.zeros(T)
multistep_preds[: n_train + tau] = x[: n_train + tau]
for i in range(n_train + tau, T):
    multistep_preds[i] = net(multistep_preds[i - tau:i].reshape((1, -1)))
    
d2l.plot([time, time[tau:], time[n_train + tau:]],
         [x.detach().numpy(), onestep_preds.detach().numpy(),
          multistep_preds[n_train + tau:].detach().numpy()], 'time',
         'x', legend=['data', '1-step preds', 'multistep preds'],
         xlim=[1, 1000], figsize=(6, 3))

Result:

7. 进行k步预测

Code:

max_steps = 64

features = torch.zeros((T - tau - max_steps + 1, tau + max_steps))

# 列i(i=tau)是来⾃(i-tau+1)步的预测,其时间步从(i+1)到(i+T-tau-max_steps+1)
for i in range(tau, tau + max_steps):
    features[:, i] = net(features[:, i - tau:i]).reshape(-1)
    
steps = (1, 4, 16, 64)
d2l.plot([time[tau + i - 1: T - max_steps + i] for i in steps],
         [features[:, (tau + i - 1)].detach().numpy() for i in steps], 'time', 'x',
         legend=[f'{i}-step preds' for i in steps], xlim=[5, 1000],figsize=(6, 3))

Result:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/740128.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号