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

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

  • 平台: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 pdimport matplotlib.pyplot as pltdata = 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 = 5train_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_sizeself.linear_with_tanh = nn.Sequential(nn.Linear(x_size, self.hidden_size), # 线性层1nn.Tanh(),  # 激活函数nn.Linear(self.hidden_size, self.hidden_size),  #线性层2nn.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 pdimport matplotlib.pyplot as pltdata = 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) # rnnself.reg = nn.Linear(hidden_size, output_size) # 线性层def forward(self, x):x, _ = self.rnn(x) # (seq, batch, hidden)s, b, h = x.shapex = x.view(s*b, h) # 转换成线性层的输入格式x = self.reg(x)x = x.view(s, b, -1)return xnet = 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.rhkb.cn/news/35116.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openEuler24.03 LTS下安装MySQL8

前提条件 拥有openEuler24.03 LTS环境,可参考:Vmware下安装openEuler24.03 LTS 步骤 卸载原有mysql及mariadb sudo systemctl stop mysql mysqld 2>/dev/null sudo rpm -qa | grep -i mysql\|mariadb | xargs -n1 sudo rpm -e --nodeps 2>/dev/…

如何在Odoo 18中实现OWL通知服务

如何在Odoo 18中实现OWL通知服务 OWL(Odoo Web Library)是Odoo的前端框架,用于构建现代化的动态响应式用户界面。在早期版本中,Odoo 前端设计与开发使用的是诸如 QWeb 这类较为老旧的框架,而随着 Odoo 每发布一个新版本…

Unet nn-Unet

Unet && nn-Unet: 文章题目:U-Net: Convolutional Networks for Biomedical Image Segmentation 代码:https://lmb.informatik.uni-freiburg.de/people/ronneber/u-net/ 文章题目:nnU-Net: Self-adapting Framework for U…

【扩散模型入门】Latent Diffusion

1. 概述 扩散模型为公众所知的一个主要原因是Stable Diffusion(SD)的推出展现出了远超以往的图像合成效果,而SD的主要技术就是Latent Diffusion Model(LDM)。 实际上,LDM的核心idea非常简单: 为了确保生成质量,LDM尽可能提升去噪模型的规模。提升模型规模往往也会同步…

搭建主从服务器

任务需求 客户端通过访问 www.nihao.com 后,能够通过 dns 域名解析,访问到 nginx 服务中由 nfs 共享的首页文件,内容为:Very good, you have successfully set up the system. 各个主机能够实现时间同步,并且都开启防…

SAP HANA on AWS Amazon Web Services

SAP HANA on AWS Amazon Web Services

vue项目如何实现条件查询?

目录 1.前端 2.后端 3.mybatis的sql语句 结语 1.前端 说白了就是,无论该参数是否是空字符串,都会传递到后端。(反正不是null就行)。 2.后端 在controller层中,使用RequestParam注解接收名为registerName的参数&…

C++:类对象的存储方式

如何计算类对象的大小 class A { public: void PrintA() { cout<<_a<<endl; } private: char _a; }; 类中既可以有成员变量&#xff0c;又可以有成员函数&#xff0c;那么一个类的对象中包含了什么&#xff1f;如何计算 一个类的大小&#xff1f; 类对象的存储方…

Windows 图形显示驱动开发-WDDM 3.0功能- 硬件翻转队列(一)

WDDM 3.0 之前的翻转队列模型 许多新式显示控制器支持对按顺序显示的多个帧排队的能力。 从 WDDM 2.1 开始&#xff0c;OS 支持将在下一个 VSync 中显示的多个未完成的翻转覆盖请求。 显示微型端口驱动程序 (KMD) 通过 DXGK_DRIVERCAPS 中的 MaxQueuedMultiPlaneOverlayFlipVS…

OSPF-5 3类LSA SummaryLSA

上一期我们介绍了2类LSA Network LSA的内容信息以及怎样从2类LSA中的信息描绘出一张具体的拓扑信息以及网段信息 这一期我们将介绍3类LSA Summary LSA区域间的LSA看看3类LSA是怎样把域间的路由信息传递到别的区域的 一、概述 由于3类LSA是用来描述我们域间的路由信息所以它是…

AI驱动的视频字幕提取与翻译工具

青梧字幕是一款基于Whisper技术的AI字幕提取工具&#xff0c;专为视频制作者、翻译人员和自媒体创作者设计。它通过先进的语音识别算法&#xff0c;能够自动从视频文件中提取字幕内容&#xff0c;并支持多种语言和字幕格式&#xff0c;极大地简化了字幕制作流程。 目前暂支持 …

ONNX:统一深度学习工作流的关键枢纽

引言 在深度学习领域&#xff0c;模型创建与部署的割裂曾是核心挑战。不同框架训练的模型难以在多样环境部署&#xff0c;而 ONNX&#xff08;Open Neural Network Exchange&#xff09;作为开放式神经网络交换格式&#xff0c;搭建起从模型创建到部署的统一桥梁&#xff0c;完…

第十一次CCF-CSP认证(含C++源码)

第十一次CCF-CSP认证 打酱油满分题解 公共钥匙盒满分题解solution 1solution 2&#xff08;优先队列优化&#xff09; 通信网络&#xff08;图的遍历问题&#xff09;满分题解 打酱油 题目链接 满分题解 思路&#xff1a;做完这题我觉得这里有点像贪心算法但又是常识性问题&a…

深入解析Hosts文件:从原理到实战应用(文末附Qwins下载)

深入解析Hosts文件&#xff1a;从原理到实战应用 在网络世界中&#xff0c;一个看似普通的系统文件——Hosts文件&#xff0c;却隐藏着操控域名解析的“上帝权限”。无论是开发者的本地测试、网络安全防护&#xff0c;还是普通用户屏蔽广告&#xff0c;都离不开它的身影。本文将…

SpringBoot 和vue前后端配合开发网页拼图10关游戏源码技术分享

今天分享一个 前后端结合 的网页游戏 开发项目源码技术。 这也是我第一次写游戏类的程序&#xff0c;虽然不是特别复杂的游戏&#xff0c;但是是第一次写&#xff0c;肯定要记录一下了&#xff0c;哈哈。 游戏的内容 就是 我们显示中玩的那个 拼图碎片的 游戏&#xff0c;类似下…

TSB - AD 解读 — 迈向可靠、透明的 TSAD 任务

目录 一 文章动机 二 TSAD 领域内的两类缺陷 三 数据集的构建 四 实验结果及结论 项目宣传链接&#xff1a;TSB-AD 代码链接&#xff1a; TheDatumOrg/TSB-AD: TSB-AD: Towards A Reliable Time-Series Anomaly Detection Benchmark 原作者解读&#xff1a;NeurIPS 2…

Java 大视界 -- Java 大数据机器学习模型的对抗攻击与防御技术研究(137)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

Python 鼠标轨迹算法 - 防止游戏检测

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…

C++11 lambda表达式、包装器、Bind绑定

Hello&#xff01;大家早上中午晚上好&#xff01;&#xff01;今天来复习C11三个新加的特性&#xff01;&#xff01; 一、lambda 表达式 1.1什么是lambda表达式&#xff1f; 语法&#xff1a;[捕捉列表]&#xff08;参数列表&#xff09;->返回值{函数体}&#xff1b; …

计算机网络:(二)计算机网络在我国发展与网络类别与性能 (附带图谱更好对比理解)

计算机网络&#xff1a;&#xff08;二&#xff09;计算机网络在我国发展与网络类别和性能 前言一、计算机网络在我国的发展二、计算机网络的类别1. 计算机网络的定义2. 不同类别的计算机网络&#xff08;1&#xff09;按覆盖范围分类&#xff08;2&#xff09;按传输技术分类…