RNN理解(基于莫凡的视频)

莫凡的笔记(pytorch and RNN)

  • 通过sin函数预测cos函数

RNN简介

  • 普通神经网络的弊端,普通的神经网络对于有关联的数据的输入,不能很好的处理
  • RNN就是对上一次的输入产生了一定的记忆,然后去预测,下一次的结果。
  • 举例,有一个厨师,他会做 [汉堡,鸡腿,批萨 ],如果是晴天它做的饭就和昨天的一样,如果是雨天他就做下一道菜。
    • 训练时
      • Data0 晴天 ----> 汉堡
      • Data1 雨天-----> 鸡腿
      • Data3 晴天 ----> 鸡腿
      • Data10 晴天 ----> 鸡腿
    • 测试时
      • 雨天 -----> 批萨
        在这里插入图片描述

步骤总结

  1. 导入库 和 定义超参数
  2. 定义RNN
  3. 实例化RNN 和 定义优化器、误差函数
  4. 训练RNN (h_state是关键)
  5. 使用训练好的RNN做出预测

代码:

  • 导入库 和 定义超参数
import torch
from torch import nn
import numpy as np
import matplotlib.pyplot as plt

# Hyper Parameters
TIME_STEP = 10
INPUT_SIZE = 1
LR = 0.02
h_state = None
  • 定义RNN
class RNN(nn.Module):
    def __init__(self):
        super(RNN,self).__init__()

        self.rnn = nn.RNN(
            input_size=INPUT_SIZE,
            hidden_size=32,     # 隐藏的神经元
            num_layers=1,       # number of rnn layer
            batch_first=True,   # input & output will has batch size as 1s dimension
            # 是否batch 在第一维度上
        )
        self.out = nn.Linear(32,1)

    def forward(self,x,h_state):
        # x (batch,time_step,input_size)
        # h_state (n_layers,batch,hidden_size)
        # r_out (batch,time_step,hidden_size)
        r_out, h_state = self.rnn(x,h_state)

        outs = []
        for time_step in range(r_out.size(1)):
            outs.append(self.out(r_out[:,time_step,:]))
        return torch.stack(outs,dim=1),h_state
        #  将数据竖着合成  [[1]] ,[[2]] ,[[3]]
        # [[1],
        #  [2],
        #  [3],]]
  • 实例化RNN 和 定义优化器、误差函数
rnn = RNN()
print(rnn)

optimizer = torch.optim.Adam(rnn.parameters(),lr=LR)
loss_func = nn.MSELoss()
  • 训练RNN (h_state是关键)
plt.figure(1,figsize=(12,5))
plt.ion()       # continuously plot # 为了继续画图

for step in range(100):
    start,end = step*np.pi,(step+1)*np.pi
    # use sin predicts cos
    # 用sin函数来预测cos函数
    steps = np.linspace(start,end,TIME_STEP,dtype=np.float32,endpoint=False)
    x_np = np.sin(steps)
    y_np = np.cos(steps)

    x = torch.from_numpy(x_np[np.newaxis,:,np.newaxis]) # 相当与 x_np.reshape([1,:,1])
    y = torch.from_numpy(y_np[np.newaxis,:,np.newaxis]) # 相当与 x_np.reshape([1,:,1])

    prediction,h_state = rnn(x,h_state) # rnn ouput and return one type is tensor
    # !! next step is import !!
    h_state = h_state.data  # 将新的h_state的值给下一个

    loss = loss_func(prediction,y)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    # plotting
    plt.plot(steps,y_np.flatten(),'r-')
    plt.plot(steps,prediction.data.numpy().flatten(),'b-')
    plt.draw();plt.pause(0.05)
  • 使用训练好的RNN做出预测
steps = np.linspace(100*np.pi,104*np.pi,10,dtype=np.float32,endpoint=False)
np_x = np.sin(steps)
x = torch.from_numpy(np_x[np.newaxis,:,np.newaxis])

prediction,h_state = rnn(x,h_state)

plt.plot(steps,prediction.data.numpy().flatten(),'g-')

plt.draw();plt.pause(0.05)
plt.ioff()
plt.show()
发布了31 篇原创文章 · 获赞 13 · 访问量 9908

猜你喜欢

转载自blog.csdn.net/qq_43497702/article/details/95733850