RNN预测正弦时间点

复制代码
import torch.nn as nn
import torch
import numpy as np
import matplotlib
matplotlib.use('TkAgg')
from matplotlib import pyplot as plt
# net = nn.RNN(100,10) #100个单词,每个单词10个维度
# print(net._parameters.keys())
#序列时间点预测

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__()
        self.rnn = nn.RNN(
            input_size=input_size,
            hidden_size=hidden_size,
            num_layers=1,
            batch_first=True,  #[b,seq,feature]   batch_first=False [seq,b,feature] ,
        )
        self.linear = nn.Linear(hidden_size,output_size)

    def forward(self,x,hidden_prev):
        # hidden_prev=h0 表示最后一个Ht的输出,out是表示[h0,h1,h2,h3....]每一个时间t的输出
        out,hidden_prev = self.rnn(x,hidden_prev)
        #[1,seq,h] => [seq,h]
        out = out.view(-1,hidden_size)
        out = self.linear(out) #[seq,h] => [seq,1]
        out = out.unsqueeze(dim=0)  #=>[1,seq,1]

        return out,hidden_prev

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

hidden_prev = torch.zeros(1,1,hidden_size) #[b,1,10]

for iter in range(6000):
    start = np.random.randint(10,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()
    optimizer.step()


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

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],predictions)

plt.scatter(time_steps[1:],predictions)
plt.show()
相关推荐
源码技术栈1 分钟前
整合物联网、大数据、人工智能等技术的Java智慧工地项目管理系统源码
大数据·人工智能·物联网·源码·二次开发·项目·智慧工地
狂师1 分钟前
别再怕 AI 裁员!真相只有一句:会用 AI,就不会被淘汰
人工智能·面试·程序员
酱紫学Java2 分钟前
AI 提示词注入 (Prompt Injection)
网络·人工智能·安全
风巽·剑染春水2 分钟前
【技术追踪】具有多图像视觉能力的医学大视觉语言模型(MICCAI-2025)
人工智能·语言模型·自然语言处理·视觉语言模型·医学影像
Lab_AI8 分钟前
仪器管理全新升级:批量自动化与全生命周期管理,任务完成时间由30分钟缩短为3分钟
人工智能·实验室管理·仪器管理·实验室仪器管理·研发创新
wukangjupingbb8 分钟前
AIDD开源大模型测试指标
人工智能·aidd
智海观潮10 分钟前
只用一周时间通过AI工具重写Next.js,Cloudflare推出vinext重建前端开发边界
开发语言·javascript·人工智能·大模型·web
BackCatK Chen11 分钟前
国家超算互联网下调OpenClaw Token成本,开源AI智能体算力瓶颈迎来突破
人工智能·云计算·互联网·tokens·openclaw·国家超算
智能工业品检测-奇妙智能11 分钟前
化工行业安全体系管理平台如何助力企业实现安全生产标准化
服务器·人工智能·安全·openclaw·奇妙智能
skywalk816312 分钟前
OpenClaw启动后,web控制面板无法登录,返回信息:Not Found
开发语言·人工智能·openclaw