[PyTorch][chapter 48][LSTM -3]

简介:

主要介绍一下

sin(x): 为 数据

cos(x): 为对应的label

项目包括两个文件

main.py:

模型的训练,验证,参数保存

lstm.py

模型的构建

目录:

  1. lstm.py
  2. main.py

lstm.py

复制代码
# -*- coding: utf-8 -*-
"""
Created on Tue Aug  8 14:01:15 2023

@author: chengxf2
"""

import torch
import torch.nn as nn

class LSTM(nn.Module):
    
    def __init__(self, input_dim, hidden_dim, num_lay, b_first):
        
        super(LSTM,self).__init__()

        self.lstm = nn.LSTM(input_size = input_dim, hidden_size = hidden_dim, num_layers = num_lay, batch_first=b_first)
        self.linear = nn.Linear(hidden_dim, 1)
        
    
    def forward(self, X):
        
  
        
    
  
        #X.shape:[batch_size=1, seq_num=256, input_size=1]
        output, (hidden, cell) = self.lstm(X)
        
        outs =[]
        seq_num = output.size(1)
        #output:[batch_size, seq_num, hidden_dim=64]
        #hidden.shape:[num_layer, batch_size, hiden_size]
        #print("\n output.shape",output.shape)
        #print("\n hidden.shape",hidden.shape)
        
        for time_step in range(seq_num):
            
            #h.shape[batch, hidden_dim]
            h = output[:,time_step,:]
            #print("\n h",h.shape)

            out = self.linear(h)
            outs.append(out)
        
        #沿着一个新维度对输入张量序列进行连接。 
        #[batch, seq_num, 1]
        pred = torch.stack(outs, dim=1)

        
        return pred

main.py

复制代码
import numpy as np
from matplotlib import pyplot as plt
import torch
from lstm import LSTM
import torch.nn as nn
from torch.nn import functional as F
from torch import optim
import time






def showDiff(pred, label, steps):
    

    plt.figure()
    plt.rcParams['font.family'] = 'SimHei' # 正常显示中文
    plt.title('预测值 and 真实值', fontsize='18')
    plt.plot(steps, pred.cpu().data.numpy().flatten(),color='r',label='预测值')
    plt.plot(steps, label.cpu().data.numpy().flatten(), color='g',label='真实值')
    plt.legend(loc='best')
    plt.show()
    
    
def get_data(epoch):
    TIME_STEP = 256
    start, end = epoch*np.pi, epoch*np.pi+2*np.pi
    steps = np.linspace(start,end,TIME_STEP,dtype=np.float32)
    sin_x = np.sin(steps)
    cos_x = np.cos(steps)
    
    sinx_torch = torch.from_numpy(sin_x[np.newaxis, :, np.newaxis])
    
    if torch.cuda.is_available():
            sinx_torch = torch.from_numpy(sin_x[np.newaxis,:,np.newaxis]).cuda()
            # print('sinx_input.shape:',sinx_input.shape)
            cosx_lable = torch.from_numpy(cos_x[np.newaxis, :, np.newaxis]).cuda()
    else:
            sinx_torch = torch.from_numpy(sin_x[np.newaxis, :, np.newaxis])
            # print('sinx_input.shape:',sinx_input.shape)
            cosx_lable = torch.from_numpy(cos_x[np.newaxis, :, np.newaxis])

    # [batch,seq_num,input_size] (1,256,1)
    
    return sinx_torch,cosx_lable,steps
    
def eval(model):
    
    #等同于 self.train(False) 就是评估模式。
    #在评估模式下,batchNorm层,dropout层等用于优化训练而添加的网络层会被关闭,从而使得评估时不会发生偏移
    model.eval()
    
    
    test_data,test_label,steps = get_data(2)
    
    with torch.no_grad():
        y_pred = model(test_data)
    
    showDiff(y_pred, test_label, steps)
    
def train(model,maxIter,criterion):
    '''
    训练模型
    ----------
    model : lstm 模型.
    maxIter : 迭代次数.
    criterion : 损失函数

    ------

    '''
    
    #作用是启用 batch normalization 和 dropout
    model.train()
    time_stamp = time.time()
    for epoch in range(maxIter):
        
        sinx_torch,cosx_lable,steps = get_data(epoch)
        y_pre = model(sinx_torch)   
        loss = criterion(y_pre,cosx_lable)
        optimzer.zero_grad()
        loss.backward()
        optimzer.step()
        
        
        if epoch%100==0:
            data_time_interval = time.time() - time_stamp
            print('epoch: %d loss: %7.3f interval: %6.2f'%(epoch, loss.detach().numpy(),data_time_interval))
            #torch.save(model.state_dict(), 'model_params.pth') 
    showDiff(y_pre, cosx_lable,steps)


        
    
    
    
    
    

if __name__ == '__main__':
    
   input_dim =1
   hidden_dim = 64
   num_layers =2
   batch_first = True
   maxIter = 3000

  
   
   model = LSTM(input_dim, hidden_dim, num_layers, batch_first)
   
   
   DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")
   optimzer = optim.Adam(model.parameters(),lr=0.0001,weight_decay=0.00001)
   criterion = nn.MSELoss()
   
   model.to(DEVICE)
   criterion.to(DEVICE)
   
   
   train(model,maxIter,criterion)
   
   #model.load_state_dict(torch.load('model_params.pth',map_location='cpu'))
   #eval(model)

参考:

pytorch利用rnn通过sin预测cos 利用lstm预测手写数字_pytorch lstm cos_薛定谔的智能的博客-CSDN博客

相关推荐
巴里巴气36 分钟前
安装GPU版本的Pytorch
人工智能·pytorch·python
「、皓子~1 小时前
后台管理系统的诞生 - 利用AI 1天完成整个后台管理系统的微服务后端+前端
前端·人工智能·微服务·小程序·go·ai编程·ai写作
说私域1 小时前
基于开源AI智能名片链动2+1模式S2B2C商城小程序的抖音渠道力拓展与多渠道利润增长研究
人工智能·小程序·开源
笑衬人心。1 小时前
初学Spring AI 笔记
人工智能·笔记·spring
luofeiju1 小时前
RGB下的色彩变换:用线性代数解构色彩世界
图像处理·人工智能·opencv·线性代数
测试者家园2 小时前
基于DeepSeek和crewAI构建测试用例脚本生成器
人工智能·python·测试用例·智能体·智能化测试·crewai
张较瘦_2 小时前
[论文阅读] 人工智能 + 软件工程 | Call Me Maybe:用图神经网络增强JavaScript调用图构建
论文阅读·人工智能·软件工程
大模型真好玩2 小时前
准确率飙升!Graph RAG如何利用知识图谱提升RAG答案质量(四)——微软GraphRAG代码实战
人工智能·python·mcp
Baihai_IDP2 小时前
vec2text 技术已开源!一定条件下,文本嵌入向量可“近乎完美地”还原
人工智能·面试·llm
江太翁2 小时前
Pytorch torch
人工智能·pytorch·python