首页 > 其他分享 >深度学习--RNN实战与存在问题

深度学习--RNN实战与存在问题

时间:2023-04-25 19:59:38浏览次数:29  
标签:实战 RNN -- steps time hidden prev data size

深度学习--RNN实战与存在问题

时间序列预测

import  numpy as np
import  torch
import  torch.nn as nn
import  torch.optim as optim
from    matplotlib import pyplot as plt

#数量
num_time_steps = 50
#输入的维度
input_size = 1
#隐藏层大小
hidden_size = 16
#输出的维度
output_size = 1
#学习率
lr=0.01



class Net(nn.Module):

    def __init__(self, ):
        super(Net, self).__init__()

        #直接使用RNN类来构建
        self.rnn = nn.RNN(
            input_size=input_size,
            hidden_size=hidden_size,
            num_layers=1,
            batch_first=True,
        )
        for p in self.rnn.parameters():
          nn.init.normal_(p, mean=0.0, std=0.001)

        self.linear = nn.Linear(hidden_size, output_size)

    def forward(self, x, hidden_prev):

       out, hidden_prev = self.rnn(x, hidden_prev)
       # [b, seq, h]
       out = out.view(-1, hidden_size)
       out = self.linear(out)
       out = out.unsqueeze(dim=0)
       return out, hidden_prev




model = Net()
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr)

hidden_prev = torch.zeros(1, 1, hidden_size)

for iter in range(6000):
    start = np.random.randint(3, size=1)[0]
    time_steps = np.linspace(start, start + 10, num_time_steps)
    data = np.sin(time_steps)
    data = data.reshape(num_time_steps, 1)
    x = torch.tensor(data[:-1]).float().view(1, num_time_steps - 1, 1)
    y = torch.tensor(data[1:]).float().view(1, num_time_steps - 1, 1)

    output, hidden_prev = model(x, hidden_prev)
    hidden_prev = hidden_prev.detach()

    loss = criterion(output, y)
    model.zero_grad()
    loss.backward()
    # for p in model.parameters():
    #     print(p.grad.norm())
    # torch.nn.utils.clip_grad_norm_(p, 10)
    optimizer.step()

    if iter % 100 == 0:
        print("Iteration: {} loss {}".format(iter, loss.item()))

start = np.random.randint(3, size=1)[0]
time_steps = np.linspace(start, start + 10, num_time_steps)
data = np.sin(time_steps)
data = data.reshape(num_time_steps, 1)
x = torch.tensor(data[:-1]).float().view(1, num_time_steps - 1, 1)
y = torch.tensor(data[1:]).float().view(1, num_time_steps - 1, 1)

predictions = []
input = x[:, 0, :]
for _ in range(x.shape[1]):
  input = input.view(1, 1, 1)
  (pred, hidden_prev) = model(input, hidden_prev)
  input = pred
  predictions.append(pred.detach().numpy().ravel()[0])

x = x.data.numpy().ravel()
y = y.data.numpy()
plt.scatter(time_steps[:-1], x.ravel(), s=90)
plt.plot(time_steps[:-1], x.ravel())

plt.scatter(time_steps[1:], predictions)
plt.show()

梯度弥散和梯度爆炸

梯度弥散:通俗来讲就是梯度消失,导数为0

梯度爆炸:在反向传播的过程中,出现了一个很大的导数,在参数更新时,脱离了合理区域。

标签:实战,RNN,--,steps,time,hidden,prev,data,size
From: https://www.cnblogs.com/ssl-study/p/17353645.html

相关文章

  • 实验3 控制语句与组合数据类型应用编程
    实验任务1实验源码1importrandom23print('用列表存储随机整数:')4lst=[random.randint(0,100)foriinrange(5)]5print(lst)67print('\n用集合存储随机整数:')8s1={random.randint(0,100)foriinrange(5)}9print(s1)1011print('......
  • 扬声器
    https://wenku.baidu.com/view/27912b0590c69ec3d5bb7528?aggId=aa8117f3d838376baf1ffc4ffe4733687f21fc70&fr=catalogMain_text_ernie_recall_backup_new%3Awk_recommend_main3&_wkts_=1682422145241&bdQuery=%E6%89%AC%E5%A3%B0%E5%99%A8%E6%9C%80%E4%BD%8E%E5......
  • 实验3
    1.实验任务1task1.py实验代码:importrandomprint('用列表储存随机整数:')lst=[random.randint(0,100)foriinrange(5)]print(lst)print('\n用集合储存随机整数:')s1={random.randint(0,100)foriinrange(5)}print(s1)print('\n用集合储存随机整数:')s......
  • Java学习笔记(五)
    一、面向对象程序设计思想找一个对象帮助我们做事情(万物皆为对象),用虚拟思想去模拟现实生活。二、类和对象的概念是事物相关属性和行为的集合,可以看成是一类事物的模板,使用事物的属性特征来描述该类事物。是一类事物的具体体现,对象就是类的一个具体实例,对象具备该类事物的......
  • 冲刺清北营 6
    保龄场。蚌了。场上三道题不是不可做就是不可做,然后跑去做组合。然而昨天看了一晚上多项式\(\gcd\)搞的我现在还在偏头痛。当然也有可能是咖啡因磕多了。题目背景怎么全是龙族。从今天开始戒多项式。万家灯火赛时基本想到正解了,但是我本来打算写的是动态开点线段树……觉得......
  • 为Helm生成针对于bash shell的自动补全脚本,helm命令补全
    在当前shell会话中加载自动补全:source<(helmcompletionbash)为每个新的会话加载自动补全,执行一次:helmcompletionbash>/etc/bash_completion.d/helm ......
  • 【动手学深度学习】第四章笔记:多层感知机、权重衰减、暂退法、数值稳定性和模型初始化
    为了更好的阅读体验,请点击这里4.1多层感知机4.1.1隐藏层由于仿射变换中的线性是一个很强的假设,因此导致了线性模型可能会不适用。线性意味着单调假设:任何特征的增大都会导致模型输出的增大或者模型输出的减小。但是违反单调性的例子比比皆是。除此之外,分类任务中,仅依托像素......
  • 每日打卡一小时(第十六天)
    一.问题描述 二.设计思路1.利用数组输入数据2.创建一个二维数组利用循环记录每组数据前面的值除以某个数等于后面的值的数3.记录每组的最大值和最小值4.最大值中找最小值,最小值中找最大值5.输出三.流程图 四.代码实现#include<iostream>usingnamespacestd;int......
  • Django之路由层 (有名和无名分组 反向解析 路由分发 名称空间)
    目录一、路由匹配django2.X及以上path第一个参数写什么就匹配什么django1.X第一个参数是正则表达式PS:无论什么版本django都自带加斜杠后缀的功能也可以取消,这里如果在浏览器地址栏没有写完整的/index/,而是/index,这里还是可以找到的,因为Django会帮你二次查找,浏览器会有303......
  • 兔子数列
    有一对兔子,从出生后的第三个月起,每个月生一对小兔子,假设所有的兔子都不死亡,30个月后会有多少兔子?分析:此问题是数学中著名的兔子数列问题(斐波那契数列),1,1,2,3,5.........其通式为:n=n-1+n-2;由此可以写出代码。#include<stdio.h>intmain(){ inti,f,f1=1,f2=1; printf("%d,%d",f1,......