首页 > 其他分享 >Lstm 推测模拟sin函数

Lstm 推测模拟sin函数

时间:2023-02-07 09:47:55浏览次数:62  
标签:torch batch storeY sin 推测 train Lstm lstm

Lstm Sin 函数推测模拟

 说明: Sin 函数的推测,用前面 3 个连续 sin 函数的历史结果推测第 4 个的值。例如:已知 y1,y2,y3 推测 y4。输入 input_x 为(length,batch,size)长度、batch 数量【批次训练数】、维度。下面代码暂时未用到 batch。

代码如下:

# 测试用lstm拟合sin函数

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

# 构建输入
x = np.arange(0,12,0.1,dtype=np.float32)
y = np.sin(x)

# 下面方法用来生成输入的数据集x和y,输入是sin(x)的序列,x为(长度、1、3)长度、batch、维度的一个三维的输入数据,y是对应的后面一个sin(x)的值
def generateData(dataset,timeStep=3):
    dataX,dataY=[],[]
    for i in range(len(dataset)-timeStep):
        a = dataset[i:(i+timeStep)]
        dataX.append(a)
        dataY.append(dataset[i+timeStep])
    return np.array(dataX), np.array(dataY)

data_x,data_y = generateData(y)
# 将data变成(length,1,3)这样子的数据。length是你全部输入数据的长度。
train_X = data_x.reshape(-1, 1, 3) 
train_y = data_y.reshape(-1,1,1)

# 构建lstm模型
class myLSTM(torch.nn.Module):
    def __init__(self):
        super(myLSTM,self).__init__()
        # input_size 就是输入数据的维度,这里的是3,因为是3个时间长度,隐藏层个数自己设置,num_layers是lstm的层数。
        self.lstm=torch.nn.LSTM(input_size=3,hidden_size=50,num_layers=2,batch_first=True)
        # 一个全连接,把50变成1
        self.liner1 = torch.nn.Linear(50,1)

    def forward(self,x):
        x,_ = self.lstm(x) # seq batch hidden
        # x[:,-1:,] 这里是取最后一个值,用来进行全连接,下面注释掉的与全连接这句的意思是一样的。
        out = self.liner1(x[:,-1:,])
        #s,b,h = x.shape
        # x = x.view(s*b,h)
        # x = self.liner1(x)
        # x = x.view(s,b,-1)
        return out

# 构建模型,选取下降方法,选取损失函数
myNet = myLSTM() 
optimizer = torch.optim.Adamax(myNet.parameters(),lr=0.1)
criterion = torch.nn.MSELoss(reduction="mean")

# 进行迭代
for i in range(1000):
    batch_loss = []
    # 把输入和“输出标记y”都变成torch.tensor类型的。每次循环都是对所有的输入进行的训练,暂时没有用到batch。
    xx = torch.tensor(train_X,dtype=torch.float,requires_grad=True)
    yy = torch.tensor(train_y, dtype = torch.float, requires_grad = True)
    prediction = myNet(xx)
    # 计算损失值
    loss = criterion(prediction,yy)
    # 梯度清零
    optimizer.zero_grad()
    # 反向传播
    loss.backward(retain_graph=True)
    # 更新参数
    optimizer.step()
    batch_loss.append(loss.data.numpy())
    if i% 100==0:
        print(i,np.mean(batch_loss))

查看训练结果

# 查看训练结果
trainx01 = torch.tensor(train_X,dtype=torch.float,requires_grad=True)
trainy01 = myNet(trainx01).data.numpy()
train_t = train_y.reshape(117,1) # 这个117就是 n,_,_=train_y.shape 中的n
plt.plot(train_t,'o',label='actual',linewidth=10,color='r')
trainy01 = trainy01.reshape(117,1)
plt.plot(trainy01,label='predict')
plt.legend()

# 下面的3就是上面代码中的时间步长3。这是在循环用后面三个估计第四个,然后第四个加入列表,继续循环,计200次。
storeY = trainy01
for i in range(200):
    stX = storeY[len(storeY)-3:]
    stX = stX.reshape(1,1,3)
    st_train = torch.tensor(stX,dtype=torch.float,requires_grad=True)
    st_y = myNet(st_train).data.numpy()
    st_y = (st_y[0][0])
    storeY = storeY.tolist()
    storeY.append(st_y)
    storeY = np.array(storeY)

plt.plot(storeY,'.',label='predict',color='g')

参考链接

  1. lstm详细讲解
  2. lstm官网例子讲解
  3. 1 lstm sin
  4. 2 lstm sin
  5. 3 lstm sin

标签:torch,batch,storeY,sin,推测,train,Lstm,lstm
From: https://www.cnblogs.com/shucode/p/17097344.html

相关文章