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

相关推荐
成富34 分钟前
文本转SQL(Text-to-SQL),场景介绍与 Spring AI 实现
数据库·人工智能·sql·spring·oracle
CSDN云计算1 小时前
如何以开源加速AI企业落地,红帽带来新解法
人工智能·开源·openshift·红帽·instructlab
艾派森1 小时前
大数据分析案例-基于随机森林算法的智能手机价格预测模型
人工智能·python·随机森林·机器学习·数据挖掘
hairenjing11231 小时前
在 Android 手机上从SD 卡恢复数据的 6 个有效应用程序
android·人工智能·windows·macos·智能手机
小蜗子1 小时前
Multi‐modal knowledge graph inference via media convergenceand logic rule
人工智能·知识图谱
SpikeKing1 小时前
LLM - 使用 LLaMA-Factory 微调大模型 环境配置与训练推理 教程 (1)
人工智能·llm·大语言模型·llama·环境配置·llamafactory·训练框架
黄焖鸡能干四碗2 小时前
信息化运维方案,实施方案,开发方案,信息中心安全运维资料(软件资料word)
大数据·人工智能·软件需求·设计规范·规格说明书
2 小时前
开源竞争-数据驱动成长-11/05-大专生的思考
人工智能·笔记·学习·算法·机器学习
ctrey_2 小时前
2024-11-4 学习人工智能的Day21 openCV(3)
人工智能·opencv·学习
攻城狮_Dream2 小时前
“探索未来医疗:生成式人工智能在医疗领域的革命性应用“
人工智能·设计·医疗·毕业