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)
    optimizer.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()

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RNN(Recurrent Neural Networks)是一种能够处理序列数据的神经网络模型。它使用一个循环的神经网络单元来处理序列中的每个元素,同时保留之前的信息。 预测正弦函数可以看作是一个序列预测问题,我们可以使用RNN模型来解决。具体实现步骤如下: 1.准备数据集 我们需要生成一组包含正弦函数值的序列数据,例如: ``` import numpy as np # 生成训练数据 def generate_data(seq_len): X = [] y = [] for i in range(1000): seq = np.random.uniform(0, 2*np.pi, seq_len) X.append(np.sin(seq)) y.append(np.sin(seq[-1])) X = np.array(X) y = np.array(y) return X, y ``` 2.构建RNN模型 我们可以使用Keras框架来构建RNN模型,代码如下: ``` from keras.models import Sequential from keras.layers import Dense, SimpleRNN # 构建RNN模型 def build_model(seq_len): model = Sequential() model.add(SimpleRNN(32, input_shape=(seq_len, 1))) model.add(Dense(1)) model.compile(loss='mse', optimizer='adam') return model ``` 这里使用了一个简单的RNN单元和一个全连接层,输出一个标量。 3.训练模型 我们将生成的数据集输入到RNN模型中进行训练,代码如下: ``` seq_len = 10 X_train, y_train = generate_data(seq_len) model = build_model(seq_len) model.fit(X_train[..., np.newaxis], y_train, epochs=50, batch_size=32) ``` 4.预测 训练完成后,我们可以使用模型来预测正弦函数值,代码如下: ``` # 预测 seq = np.random.uniform(0, 2*np.pi, seq_len) y_true = np.sin(seq[-1]) y_pred = model.predict(seq.reshape(1, seq_len, 1))[0][0] print('True:', y_true) print('Pred:', y_pred) ``` 这里使用了随机生成的一个序列进行预测,并输出了预测值和真实值。 总的来说,使用RNN预测正弦函数的实现原理就是将正弦函数值作为序列输入,使用RNN模型进行训练和预测

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值