[原创] 一起读《动手学深度学习(PyTorch版)》- RNN-sequence-model

LitchiCheng   2024-11-2 12:13 楼主

sin 1000加上噪声

import torch
from torch import nn
import matplotlib.pyplot as plt

T = 1000 
time = torch.arange(1, T + 1, dtype=torch.float32)
x = torch.sin(0.01 * time) + torch.normal(0, 0.2, (T,))
plt.plot(time.tolist(), x.tolist())
plt.show()

image.png  

训练后,进行单步预测

import torch
from torch import nn
from torch.utils import data
from torchvision import transforms
import matplotlib.pyplot as plt

def load_array(data_arrays, batch_size, is_train=True):
    dataset = data.TensorDataset(*data_arrays)
    return data.DataLoader(dataset, batch_size, shuffle=is_train, num_workers=6)

T = 1000
time = torch.arange(1, T + 1, dtype=torch.float32)
x = torch.sin(0.01 * time) + torch.normal(0, 0.2, (T,))
# plt.plot(time.tolist(), x.tolist())
# plt.show()

tau = 4
# [996, 4]
features = torch.zeros((T - tau, tau))
for i in range(tau):
    # pick up 996 elements of x and then slide 1 element every time
    features[:, i] = x[i: T - tau + i]
    # print(features[:, i])
    # print(features[:, i].shape)
labels = x[tau:].reshape((-1, 1))

batch_size, n_train = 16, 600
train_iter = load_array((features[:n_train], labels[:n_train]),
                            batch_size, is_train=True)

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

class Accumulator:
    def __init__(self, n) -> None:
        self.data = [0.0]*n
    
    def add(self, *args):
        # args is a tupe
        self.data = [a + float(b) for a, b in zip(self.data, args)]

    def reset(self):
        self.data = [0.0] * len(self.data)

    def __getitem__(self, idx):
        return self.data[idx]

def evaluate_loss(net, data_iter, loss):
    metric = Accumulator(2)
    for X, y in data_iter:
        out = net(X)
        y = y.reshape(out.shape)
        l = loss(out, y)
        metric.add(l.sum(), l.numel())
    return metric[0] / metric[1]

loss = nn.MSELoss(reduction='none')

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: {evaluate_loss(net, train_iter, loss):f}')

net = get_net()
train(net, train_iter, loss, 5, 0.01)

onestep_preds = net(features)
plt.plot(time.tolist(), x.tolist())
plt.plot(time[tau:].tolist(), onestep_preds.tolist())
plt.show()

image.png  

回复评论 (8)

不清不楚。。。。。。。。。。。。。。。。。

RNN,其实也有变种。。。。。。。。

原理和方法都没

点赞  2024-11-2 13:51
引用: hellokitty_bean 发表于 2024-11-2 13:51 不清不楚。。。。。。。。。。。。。。。。。 RNN,其实也有变种。。。。。。。。 原理和方法都没

这个就书里面的,其他例子等你分享,hhh

点赞  2024-11-2 18:16

训练后的文件是什么类型的?C能调用吗?

在爱好的道路上不断前进,在生活的迷雾中播撒光引
点赞  2024-11-2 23:18
引用: LitchiCheng 发表于 2024-11-2 18:16 这个就书里面的,其他例子等你分享,hhh

还没开始仔细看呢。。。。。。。。等闲下来再看后分享了。。。。。。。。

点赞  2024-11-3 08:21
引用: hellokitty_bean 发表于 2024-11-3 08:21 还没开始仔细看呢。。。。。。。。等闲下来再看后分享了。。。。。。。。

kkk

点赞  2024-11-3 11:27
引用: 秦天qintian0303 发表于 2024-11-2 23:18 训练后的文件是什么类型的?C能调用吗?

可以保存成模型,然后一般推理引擎都有各种语言的实现,C只是一种

点赞  2024-11-3 11:28

作为初学者,这里,添加一个注释说明:x=(T,)表示一维数组,y=(T,1)表示二维数组,x==y.flatten()的值为True。

点赞  2024-11-4 09:02

添加一个注释,reshape((-1,1)),-1表示自动计算行数,1列;同理,对于(1,-1)只给定行数1,也可以自动计算出新数组的列数。

点赞  2024-11-4 09:34
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复