美文网首页PyTorch
PyTorch RNN Regression

PyTorch RNN Regression

作者: Jancd | 来源:发表于2018-06-22 20:29 被阅读61次

 循环神经网络RNN及时预测时间序列.

更多可以查看官网 :
* PyTorch 官网


载入数据

假设想要用 sin 的曲线预测出 cos 的曲线.

image
import torch
from torch import nn
from torch.autograd import Variable
import numpy as np
import matplotlib.pyplot as plt

torch.manual_seed(1)    # reproducible

# Hyper Parameters
TIME_STEP = 10      # rnn time step / image height
INPUT_SIZE = 1      # rnn input size / image width
LR = 0.02           # learning rate
DOWNLOAD_MNIST = False  # set to True if haven't download the data

RNN模型

这一次的 RNN, 我们对每一个 r_out 都得放到 Linear 中去计算出预测的 output, 所以能用一个 for loop 来循环计算.
这点是 Tensorflow 做不到的.

class RNN(nn.Module):
    def __init__(self):
        super(RNN, self).__init__()

        self.rnn = nn.RNN(  
            input_size=1,
            hidden_size=32,     # rnn hidden unit
            num_layers=1,       # 有几层 RNN layers
            batch_first=True,   # input & output 会是以 batch size 为第一维度的特征集 e.g. (batch, time_step, input_size)
        )
        self.out = nn.Linear(32, 1)

    def forward(self, x, h_state):  # 因为 hidden state 是连续的, 所以要一直传递这一个 state
        # x (batch, time_step, input_size)
        # h_state (n_layers, batch, hidden_size)
        # r_out (batch, time_step, output_size)
        r_out, h_state = self.rnn(x, h_state)   # h_state 也要作为 RNN 的一个输入

        outs = []    # 保存所有时间点的预测值
        for time_step in range(r_out.size(1)):    # 对每一个时间点计算 output
            outs.append(self.out(r_out[:, time_step, :]))
        return torch.stack(outs, dim=1), h_state


rnn = RNN()
print(rnn)
"""
RNN (
  (rnn): RNN(1, 32, batch_first=True)
  (out): Linear (32 -> 1)
)
"""

其实熟悉 RNN 的朋友应该知道, forward 过程中的对每个时间点求输出还有一招使得计算量比较小的.

不过上面的内容主要是为了呈现 PyTorch 在动态构图上的优势,所以用了一个 for loop 来搭建那套输出系统. 下面介绍一个替换方式. 使用 reshape 的方式整批计算.

def forward(self, x, h_state):
    r_out, h_state = self.rnn(x, h_state)
    r_out_reshaped = r_out.view(-1, HIDDEN_SIZE) # to 2D data
    outs = self.linear_layer(r_out_reshaped)
    outs = outs.view(-1, TIME_STEP, INPUT_SIZE)  # to 3D data

训练

使用 x 作为输入的 sin 值,然后 y 作为想要拟合的输出, cos 值. 因为他们两条曲线是存在某种关系的, 所以我们就能用sin 来预测 cos. rnn 会理解他们的关系, 并用里面的参数分析出来这个时刻 sin 曲线上的点如何对应上cos 曲线上的点.

optimizer = torch.optim.Adam(rnn.parameters(), lr=LR)   # optimize all rnn parameters
loss_func = nn.MSELoss()

h_state = None   # 要使用初始 hidden state, 可以设成 None

for step in range(60):
    start, end = step * np.pi, (step+1)*np.pi   # time steps
    # sin 预测 cos
    steps = np.linspace(start, end, 10, dtype=np.float32)
    x_np = np.sin(steps)    # float32 for converting torch FloatTensor
    y_np = np.cos(steps)

    x = Variable(torch.from_numpy(x_np[np.newaxis, :, np.newaxis]))    # shape (batch, time_step, input_size)
    y = Variable(torch.from_numpy(y_np[np.newaxis, :, np.newaxis]))

    prediction, h_state = rnn(x, h_state)   # rnn 对于每个 step 的 prediction, 还有最后一个 step 的 h_state
    # !!  下一步十分重要 !!
    h_state = Variable(h_state.data)  # 要把 h_state 重新包装一下才能放入下一个 iteration, 不然会报错

    loss = loss_func(prediction, y)     # cross entropy loss
    optimizer.zero_grad()               # clear gradients for this training step
    loss.backward()                     # backpropagation, compute gradients
    optimizer.step()                    # apply gradients
效果

相关文章

  • PyTorch RNN Regression

     循环神经网络RNN及时预测时间序列. 更多可以查看官网 :* PyTorch 官网 载入数据 假设想要用 sin...

  • pytorch实现RNN以及LSTM/GRU

    pytorch提供了很方便的RNN模块,以及其他结构像LSTM和GRU。pytorch里的RNN需要的参数主要有:...

  • pytorch RNN运算分析

    pytorch中的RNN计算过程,以及双向RNN拼接方式 问题起源是在看论文和读源码时,看到用pytorch中的双...

  • NLP自然语言理解的学习

    RNN和LSTM网络结构 原文LSTM in pytorch Pytorch上的教学word_embeddings...

  • 循环神经网络pytorch实现

    RNN pytorch 实现 LSTM 输入门: 遗忘门: 输出门: pytorch 实现 GRU 更新门: 候选...

  • PyTorch Regression

     PyTorch 关系拟合. 更多可以查看官网 :> PyTorch 官网 本文旨在说明神经网络是如何通过简单的形...

  • CS231n Spring 2019 Assignment 3—

    NetworkVisualization-PyTorch 从上次RNN之后的三次作业就会有PyTorch和Tens...

  • pytorch RNN的一点理解

    本文主要介绍一下RNN的计算规则以及pytorch里面RNN怎么计算的,给自己备注一下。RNN是一种循环神经网络,...

  • Pytorch学习之LSTM识别MNIST数据集

    实验RNN循环神经网络识别MNIST手写数字集 本文主要是讲述pytorch实现的RNN神经网络去识别MNIST手...

  • PyTorch RNN Classification

     循环神经网络RNN让神经网络有了记忆, 对于序列话的数据,循环神经网络能达到更好的效果. 更多可以查看官网 :*...

网友评论

    本文标题:PyTorch RNN Regression

    本文链接:https://www.haomeiwen.com/subject/mvphyftx.html