【从0到1搞懂大模型】RNN基础(4)

news2025/3/18 5:24:08

先说几个常用的可以下载数据集的地方

  • 平台:kaggle(https://www.kaggle.com/datasets)

和鲸社区(https://www.heywhale.com/home)

阿里天池(https://tianchi.aliyun.com/)

  • 其他:海量公开数据集汇总-CSDN博客

下面使用的数据集来源与计算股票数据集 | Kaggle

普通神经网络处理序列数据

我们尝试一下用普通神经网络处理序列数据,下面是一个股票相关的序列数据

import pandas as pd
import os,math
from sklearn.preprocessing import MinMaxScaler
from sklearn import metrics
import numpy  as np
import pandas as pd

import matplotlib.pyplot as plt


data = pd.read_csv('SH600519.csv') 
data

我们取其中一列作为预测的 y 值,图像大概如下所示 

dataset = data.iloc[:, 2:3].values  
plt.plot(dataset)

下面对数据进行预处理

max_value = np.max(dataset)
min_value = np.min(dataset)
scalar = max_value - min_value   #也可以直接用MinMaxScaler(feature_range=(0, 1))
dataset = list(map(lambda x: x / scalar, dataset))

def create_dataset(dataset, look_back=5):
    dataX, dataY = [], []
    for i in range(len(dataset) - look_back):
        a = dataset[i:(i + look_back)]
        dataX.append(a)
        dataY.append(dataset[i + look_back])
    return np.array(dataX), np.array(dataY)

# 创建好输入输出
data_X, data_Y = create_dataset(dataset)
data_X =data_X.reshape(-1,5)
# 划分训练集和测试集,70% 作为训练集
train_size = int(len(data_X) * 0.7)
test_size = len(data_X) - train_size
train_X = data_X[:train_size]
train_Y = data_Y[:train_size]
test_X = data_X[train_size:]
test_Y = data_Y[train_size:]

look_back = 5


train_x = torch.from_numpy(train_X)
train_y = torch.from_numpy(train_Y)
test_x = torch.from_numpy(test_X)

构建普通神经网络

class FullyConnected(nn.Module):
    def __init__(self, x_size, hidden_size, output_size=1):
        super(FullyConnected, self).__init__()
        self.hidden_size = hidden_size
 
        self.linear_with_tanh = nn.Sequential(
            nn.Linear(x_size, self.hidden_size), # 线性层1
            nn.Tanh(),  # 激活函数
            nn.Linear(self.hidden_size, self.hidden_size),  #线性层2
            nn.Tanh(),  #激活函数
            nn.Linear(self.hidden_size, output_size)  #线性层
        )
        
    def forward(self, x):
        yhat = self.linear_with_tanh(x)
        
        return yhat

开始训练

fc_model = FullyConnected(x_size=5, hidden_size = 3)
criterion = nn.MSELoss()  #损失函数类型:多分类(CrossEntropyLoss),均方误差(MSELoss),二分类(BCELoss)
optimizer = torch.optim.Adam(fc_model.parameters(), lr=1e-2)

## 开始训练
for e in range(1000):
    # 前向传播
    for i in range(len(train_x)):
        x_train = train_x[i]
        y_train = train_y[i]
        out = fc_model(x_train)
        loss = criterion(out, y_train)
    # 反向传播
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
    if (e + 1) % 100 == 0: # 每 100 次输出结果
        print('Epoch: {}, Loss: {:.5f}'.format(e + 1, loss.item()))


fc_model = fc_model.eval() # 转换成测试模式
data_X = torch.from_numpy(data_X)
var_data = Variable(data_X)
pred_test = fc_model(var_data) # 测试集的预测结果

# 改变输出的格式
pred_test = pred_test.view(-1).data.numpy()
# 画出实际结果和预测的结果
plt.plot(pred_test, 'r', label='prediction')
plt.plot(dataset, 'b', label='real')
plt.legend(loc='best')

这里插播一下之前讲过的梯度下降方法,其实只需要改成下面代码就够了【从0到1搞懂大模型】神经网络长什么样子?参数又是如何变化的?(2)-CSDN博客

  • 普通梯度下降:torch.optim.SGD
  • adagrad:torch.optim.Adagrad
  • RMSprop:torch.optim.RMSprop
  • Adam:torch.optim.Adam

最终得到的曲线如下

 

 我们可以发现,普通神经网络对于这样一个小小的序列数据预测效果还是很差的,那怎么办呢?下面引出我们的循环神经网络——RNN

RNN

在实际应用中,我们会遇到很多序列数据  如:

  • 自然语言处理问题。x1可以看做是第一个单词,x2可以看做是第二个单词,依次类推。
  • 语音处理。此时,x1、x2、x3……是每帧的声音信号。
  • 时间序列问题。例如每天的股票价格等等。

序列形的数据不太好用原始的神经网络处理了。

为了建模序列问题,RNN引入了隐状态h(hidden state)的概念,h可以对序列形的数据提取特征,接着再转换为输出。

先从h1的计算开始看:

其实整体来说就是每次处理新数据时,它会结合当前的输入和之前的“记忆”(即隐藏状态)。

接下来我们用 RNN 再对刚才的数据集做预测

import pandas as pd
import os,math
from sklearn.preprocessing   import MinMaxScaler
from sklearn import metrics
import numpy  as np
import pandas as pd

import matplotlib.pyplot as plt


data = pd.read_csv('SH600519.csv') 
dataset = data.iloc[:, 2:3].values  
plt.plot(dataset)
dataset = dataset.astype('float32')
max_value = np.max(dataset)
min_value = np.min(dataset)
scalar = max_value - min_value
dataset = list(map(lambda x: x / scalar, dataset))

def create_dataset(dataset, look_back=5):
    dataX, dataY = [], []
    for i in range(len(dataset) - look_back):
        a = dataset[i:(i + look_back)]
        dataX.append(a)
        dataY.append(dataset[i + look_back])
    return np.array(dataX), np.array(dataY)

data_X, data_Y = create_dataset(dataset)
# 划分训练集和测试集,70% 作为训练集
train_size = int(len(data_X) * 0.7)
test_size = len(data_X) - train_size
train_X = data_X[:train_size]
train_Y = data_Y[:train_size]
test_X = data_X[train_size:]
test_Y = data_Y[train_size:]

train_X = train_X.reshape(-1, 1, 5)
train_Y = train_Y.reshape(-1, 1, 1)
test_X = test_X.reshape(-1, 1, 5)

train_x = torch.from_numpy(train_X)   #如果是把torch转为numpy则用array = torch_data.numpy()
train_y = torch.from_numpy(train_Y)
test_x = torch.from_numpy(test_X)

# 定义模型
class rnn_reg(nn.Module):
    def __init__(self, input_size, hidden_size, output_size=1, num_layers=2):
        super(rnn_reg, self).__init__()
        
        self.rnn = nn.RNN(input_size, hidden_size, num_layers) # rnn
        self.reg = nn.Linear(hidden_size, output_size) # 线性层
        
    def forward(self, x):
        x, _ = self.rnn(x) # (seq, batch, hidden)
        s, b, h = x.shape
        x = x.view(s*b, h) # 转换成线性层的输入格式
        x = self.reg(x)
        x = x.view(s, b, -1)
        return x
    
    
net = rnn_reg(5, 3)

criterion = nn.MSELoss()  
optimizer = torch.optim.Adam(net.parameters(), lr=1e-2)


for e in range(1000):
    # 前向传播
    out = net(train_x)
    loss = criterion(out, train_y)
    # 反向传播
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    if (e + 1) % 100 == 0: # 每 100 次输出结果
        print('Epoch: {}, Loss: {:.5f}'.format(e + 1, loss.item()))
        
        
net = net.eval() # 转换成测试模式
data_X = data_X.reshape(-1, 1, 5)
data_X = torch.from_numpy(data_X)
var_data = Variable(data_X)
pred_test = net(var_data) # 测试集的预测结果


# 改变输出的格式
pred_test = pred_test.view(-1).data.numpy()
# 画出实际结果和预测的结果
plt.plot(pred_test, 'r', label='prediction')
plt.plot(dataset, 'b', label='real')
plt.legend(loc='best')

这次用了 RNN,预测结果如下 

可以看到对于序列数据,RNN 效果比普通神经网络好很多!

具体来说,RNN有三个核心特点:

  1. 自带记忆功能
    每次处理新数据时,它会结合当前的输入和之前的“记忆”(即隐藏状态)。比如分析“我想吃北京烤鸭”这句话,读到“吃”时,RNN会记住前面有个“我”,从而推测后面大概率是食物名词

  2. 适合序列任务
    像语言翻译、股票预测这类需要联系前后信息的任务,传统神经网络处理不好,而RNN能捕捉时间或顺序的关联性。比如预测明天的气温,它会把今天、昨天的温度变化趋势都考虑进去

  3. 结构简单但有局限
    虽然基础版RNN结构不复杂(输入层+循环隐藏层+输出层),但它容易“记不住太久远的事”。比如分析长篇文章时,可能只记得最近几段的内容,早期的信息会被淡化

举个生活中的例子:​就像你背古诗,背到第五句时可能记不清第二句,但能根据第四句推测第五句的内容。RNN也是这样——短期记忆强,但对特别长的序列处理效果会打折扣(后来人们发明了LSTM等改进版解决了这个问题),下次我们就讲一下 LSTM~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2317003.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【第K小数——可持久化权值线段树】

题目 代码 #include <bits/stdc.h> using namespace std;const int N 1e5 10;int a[N], b[N]; int n, m, len; int rt[N], idx; // idx 是点分配器struct node {int l, r;int s; } tr[N * 22];int getw(int x) {return lower_bound(b 1, b len 1, x) - b; }int bui…

本地部署Deep Seek-R1,搭建个人知识库——笔记

目录 一、本地部署 DeepSeek - R1 1&#xff1a;安装Ollama 2&#xff1a;部署DeepSeek - R1模型 3&#xff1a;安装Cherry Studio 二、构建私有知识库 一、本地部署 DeepSeek - R1 1&#xff1a;安装Ollama 1.打开Ollama下载安装 未科学上网&#xff0c;I 先打开迅雷再下…

【软考-架构】5.3、IPv6-网络规划-网络存储-补充考点

✨资料&文章更新✨ GitHub地址&#xff1a;https://github.com/tyronczt/system_architect 文章目录 IPv6网络规划与设计建筑物综合布线系统PDS&#x1f4af;考试真题第一题第二题 磁盘冗余阵列网络存储技术其他考点&#x1f4af;考试真题第一题第二题 IPv6 网络规划与设计…

fastapi+angular外卖系统

说明&#xff1a; fastapiangular外卖系统 1.美食分类&#xff08;粥&#xff0c;粉&#xff0c;面&#xff0c;炸鸡&#xff0c;炒菜&#xff0c;西餐&#xff0c;奶茶等等&#xff09; 2.商家列表 &#xff08;kfc&#xff0c;兰州拉面&#xff0c;湘菜馆&#xff0c;早餐店…

鸿蒙路由 HMRouter 配置及使用 三 全局拦截器使用

1、前期准备 简单封装一个用户首选项的工具类 import { preferences } from "kit.ArkData";// 用户首选项方法封装 export class Preferences {private myPreferences: preferences.Preferences | null null;// 初始化init(context: Context, options: preference…

计算机视觉——深入理解卷积神经网络与使用卷积神经网络创建图像分类算法

引言 卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;简称 CNNs&#xff09;是一种深度学习架构&#xff0c;专门用于处理具有网格结构的数据&#xff0c;如图像、视频等。它们在计算机视觉领域取得了巨大成功&#xff0c;成为图像分类、目标检测、图像分…

永磁同步电机无速度算法--拓展卡尔曼滤波器

一、原理介绍 以扩展卡尔曼滤波算法为基础&#xff0c;建立基于EKF算法的估算转子位置和转速的离散模型。 实时性是扩展卡尔曼滤波器的一种特征&#xff0c;所以它可实时跟踪系统的状态并进行有效的输出&#xff0c;同时&#xff0c;它可以减少干扰、抑制噪声&#xff0c;其效…

【CF】Day9——Codeforces Round 953 (Div. 2) BCD

B. New Bakery 题目&#xff1a; 思路&#xff1a; 被标签害了&#xff0c;用什么二分&#xff08; 很简单的思维题&#xff0c;首先如果a > b&#xff0c;那么全选a就行了&#xff0c;还搞啥活动 否则就选 b - a 天来搞活动&#xff0c;为什么&#xff1f; 首先如果我…

harmonyOS NEXT开发与前端开发深度对比分析

文章目录 1. 技术体系概览1.1 技术栈对比1.2 生态对比 2. 开发范式比较2.1 鸿蒙开发范式2.2 前端开发范式 3. 框架特性对比3.1 鸿蒙 Next 框架特性3.2 前端框架特性 4. 性能优化对比4.1 鸿蒙性能优化4.2 前端性能优化 5. 开发工具对比5.1 鸿蒙开发工具5.2 前端开发工具 6. 学习…

Unity小框架之单例模式基类

单例模式&#xff08;Singleton Pattern&#xff09;是一种常用的创建型设计模式&#xff0c;其核心目标是确保一个类只有一个实例&#xff0c;并提供一个全局访问点。它常用于需要控制资源访问、共享配置或管理全局状态的场景&#xff08;如数据库连接池、日志管理器、应用配置…

cesium 实现万级管网数据渲染,及pickImageryLayerFeatures原生方法改写

需求背景解决效果getFeatureInfo 需求背景 在用 geoserver 渲染图层时&#xff0c;会自动触发 GetFeatureInfo &#xff0c;与服务器通信&#xff0c;在万级海量数据渲染下&#xff0c;这个性能消耗就可以感受到了 需要考虑的点&#xff1a; 1.通过enablePickFeatures&#xf…

基于金融产品深度学习推荐算法详解【附源码】

深度学习算法说明 1、简介 神经网络协同过滤模型(NCF) 为了解决启发式推荐算法的问题&#xff0c;基于神经网络的协同过滤算法诞生了&#xff0c;神经网络的协同过滤算法可以 通过将用户和物品的特征向量作为输入&#xff0c;来预测用户对新物品的评分&#xff0c;从而解决…

LVS + Keepalived 高可用集群

一、LVSKeepalived 原理 1.1.LVS 负载均衡原理 LVS&#xff08;Linux Virtual Server&#xff09;是一种基于 Linux 内核的负载均衡技术&#xff0c;它通过 IPVS&#xff08;IP Virtual Server&#xff09;模块来实现。LVS 可以将客户端的请求分发到多个后端服务器上&#xf…

PHP与数据库连接常见问题及解决办法

PHP与数据库连接常见问题及解决办法 在现代Web开发中&#xff0c;PHP与数据库的连接是不可或缺的一部分。无论是构建动态网站、内容管理系统&#xff08;CMS&#xff09;还是电子商务平台&#xff0c;PHP与数据库的交互都是核心功能之一。然而&#xff0c;在实际开发过程中&am…

HarmonyOS-应用程序框架基础

应用程序框架与应用模型的区别 应用框架可以看做是应用模型的一种实现方式&#xff0c;开发人员可以用应用模型来描述应用程序的结构和行为的描述&#xff0c;然后使用应用程序框架来实现这些描述。 应用模型 应用模型是一个应用程序的模型&#xff0c;它是一种抽象的描述&a…

使用 Doris 和 LakeSoul

作为一种全新的开放式的数据管理架构&#xff0c;湖仓一体&#xff08;Data Lakehouse&#xff09;融合了数据仓库的高性能、实时性以及数据湖的低成本、灵活性等优势&#xff0c;帮助用户更加便捷地满足各种数据处理分析的需求&#xff0c;在企业的大数据体系中已经得到越来越…

【C语言】函数和数组实践与应用:开发简单的扫雷游戏

【C语言】函数和数组实践与应用&#xff1a;开发简单的扫雷游戏 1.扫雷游戏分析和设计1.1扫雷游戏的功能说明&#xff08;游戏规则&#xff09;1.2游戏的分析与设计1.2.1游戏的分析1.2.2 文件结构设计 2. 代码实现2.1 game.h文件2.2 game.c文件2.3 test.c文件 3. 游戏运行效果4…

国内Mac,nimi安装homebrew完整过程

安装命令&#xff1a; 常规安装脚本&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 极速安装脚本&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.…

C++基础——从C语言快速入门

目录 输入输出 标准输出流 ( cout ) 标准输入流 ( cin ) 标准错误流 ( cerr ) 和标准日志流 ( clog ) 编程示例 基本变量类型 宽字符的用法 climits 如何使用 编程示例 注意事项 流程控制 条件语句 循环语句 跳转语句 函数 函数的基本结构 编程示例 函数的组成…

Windows远程桌面黑屏怎么办?

在使用Windows远程桌面连接另一台电脑时&#xff0c;用户经常会遇到Windows远程桌面黑屏的问题。那么&#xff0c;该如何有效地解决Windows远程桌面黑屏的问题呢&#xff1f;遇到远程桌面连接黑屏的问题时&#xff0c;可以通过在本地组策略编辑器中禁用WDDM图形显示驱动来解决。…