[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博客

相关推荐
移远通信1 小时前
2025上海车展 | 移远通信全栈车载智能解决方案重磅亮相,重构“全域智能”出行新范式
人工智能
蹦蹦跳跳真可爱5894 小时前
Python----深度学习(基于深度学习Pytroch簇分类,圆环分类,月牙分类)
人工智能·pytorch·python·深度学习·分类
蚂蚁20145 小时前
卷积神经网络(二)
人工智能·计算机视觉
z_mazin7 小时前
反爬虫机制中的验证码识别:类型、技术难点与应对策略
人工智能·计算机视觉·目标跟踪
lixy5798 小时前
深度学习3.7 softmax回归的简洁实现
人工智能·深度学习·回归
youhebuke2258 小时前
利用deepseek快速生成甘特图
人工智能·甘特图·deepseek
訾博ZiBo8 小时前
AI日报 - 2025年04月26日
人工智能
郭不耐8 小时前
DeepSeek智能时空数据分析(三):专业级地理数据可视化赏析-《杭州市国土空间总体规划(2021-2035年)》
人工智能·信息可视化·数据分析·毕业设计·数据可视化·城市规划
AI军哥8 小时前
MySQL8的安装方法
人工智能·mysql·yolo·机器学习·deepseek
余弦的倒数9 小时前
知识蒸馏和迁移学习的区别
人工智能·机器学习·迁移学习