十三、RNN循环神经网络实战

news2024/12/29 14:21:13

因为我本人主要课题方向是处理图像的,RNN是基本的序列处理模型,主要应用于自然语言处理,故这里就简单的学习一下,了解为主

一、问题引入

已知以前的天气数据信息,进行预测当天(4-9)是否下雨

日期温度气压是否下雨
4-11020
4-23040
4-34025
4-41030
4-5510
4-61020
4-71260
4-82580
4-92015

这里的数据集都是随别胡乱写的哈,就说在阐述一下待解决的问题,随别做的数据集
思路:可以四天一组,每组中有4天的天气信息,包括温度、气压、是否下雨
前三天作为输入,第四天最为输出

在卷积神经网络中,全连接层是权重最多的,也是整个网络中计算量最多的地方

卷积中
输入:128通道
输出:64通道
卷积核:5×5
总共的权重参数:128×64×5×5 = 204800

全连接中
一般都不会直接将一个高维通道直接变为1,而是多几个中间层进行过度
输入:4096
输出:1024
权重参数个数:4096×1024 = 4194304

权重参数个数压根都不在一个数量级上,所以说,正因为卷积的权重共享,导致卷积操作所需参数远小于全连接

RNN循环神经网络主要用在具有序列关系的数据中进行处理,例如:天气的预测,因为前后的天气会相互影响,并不会断崖式的变化、股市预测等,典型的就是自然语言处理
我喜欢beyond乐队这句话的词语之间具有序列关系,随便调换顺序产生的结果肯定很难理解

二、RNN循环神经网络

Ⅰ,RNN Cell

RNN Cell是RNN中的核心单元
在这里插入图片描述
xt:序列当中,时刻t时的数据,这个数据具有一定的维度,例如天气数据就是3D向量的,即,温度、气压、是否下雨
xt通过RNN Cell之后就会得到一个ht,这个数据也是具有一定的维度,假如是5D向量
从xt这个3D向量数据通过RNN Cell得到一个ht这个5D向量数据,很明显,这个RNN Cell本质就是一个线性层
区别:RNN Cell这个线性层是共享的

在这里插入图片描述
在这里插入图片描述
RNN Cell基本流程
在这里插入图片描述

现学现卖

在这里插入图片描述

import torch

#根据需求设定参数
batch_size = 1
seq_len = 3
input_size = 4
hidden_size = 2

yy_cell = torch.nn.RNNCell(input_size=input_size,hidden_size=hidden_size)

dataset = torch.randn(seq_len,batch_size,input_size)
hidden = torch.zeros(batch_size,hidden_size) #h0设置为全0

for idx,inputs in enumerate(dataset):
    print('-----------------)
    print("Input size:",inputs.shape)
    
    hidden = yy_cell(inputs,hidden)
    
    print("outputs size:",hidden.shape)
    print(hidden)
"""
==================== 0 ====================
Input size: torch.Size([1, 4])
outputs size: torch.Size([1, 2])
tensor([[ 0.6377, -0.4208]], grad_fn=<TanhBackward0>)
==================== 1 ====================
Input size: torch.Size([1, 4])
outputs size: torch.Size([1, 2])
tensor([[-0.2049,  0.6174]], grad_fn=<TanhBackward0>)
==================== 2 ====================
Input size: torch.Size([1, 4])
outputs size: torch.Size([1, 2])
tensor([[-0.1482, -0.2232]], grad_fn=<TanhBackward0>)
"""

Ⅱ,RNN

在这里插入图片描述

现学现卖

import torch

#根据需求设定参数
batch_size = 1
seq_len = 3
input_size = 4
hidden_size = 2
num_layers = 2 #两层RNN Cell

cell = torch.nn.RNN(input_size=input_size,hidden_size=hidden_size,num_layers=num_layers)

inputs = torch.randn(seq_len,batch_size,input_size)
hidden = torch.zeros(num_layers,batch_size,hidden_size) #h0设置为全0

out,hidden = cell(inputs,hidden)

print('output size:',out.shape)
print('output:',out)
print('hidden size:',hidden.shape)
print('hidden',hidden)

"""
output size: torch.Size([3, 1, 2])
output: tensor([[[ 0.8465, -0.1636]],

        [[ 0.3185, -0.1733]],

        [[ 0.0269, -0.1330]]], grad_fn=<StackBackward0>)
hidden size: torch.Size([2, 1, 2])
hidden tensor([[[ 0.5514,  0.8349]],

        [[ 0.0269, -0.1330]]], grad_fn=<StackBackward0>)
"""

三、RNN实战

需求:实现将输入beyond转换为ynbode

①文本转向量one-hot

因为RNN Cell单元输入的数据必须是由单词构成的向量 ,根据字符来构建一个词典,并为其分配索引,索引变One-Hot向量,词典中有几项,最终构建的向量也有几列,只能出现一个1,其余都为0

characterindex
b0
d1
e2
n3
o4
y5

在这里插入图片描述

在这里插入图片描述

②模型训练

Ⅰ RNN Cell

import torch

input_size = 6
hidden_size = 6
batch_size = 1

dictionary = ['b','e','y','o','n','d'] #字典
x_data = [0,1,2,3,4,5] #beyond
y_data = [2,4,0,3,5,1] #ynbode

one_hot = [[1,0,0,0,0,0],
           [0,1,0,0,0,0],
           [0,0,1,0,0,0],
           [0,0,0,1,0,0],
           [0,0,0,0,1,0],
           [0,0,0,0,0,1]]

x_one_hot = [one_hot[x] for x in x_data] #将x_data的每个元素从one_hot得到相对于的向量形式

inputs = torch.Tensor(x_one_hot).view(-1,batch_size,input_size) #inputs形式为(seqlen,batch_size,input_size)
labels = torch.LongTensor(y_data).view(-1,1) #lables形式为(seqlen,1)

class y_rnncell_model(torch.nn.Module):
    def __init__(self,input_size,hidden_size,batch_size):
        super(y_rnncell_model,self).__init__()
        
        self.batch_size = batch_size
        self.input_size = input_size
        self.hidden_size = hidden_size
        self.rnncell = torch.nn.RNNCell(input_size=self.input_size,hidden_size=self.hidden_size)
    
    def forward(self,inputs,labels):
        hidden = self.rnncell(inputs,labels)
        return hidden
    
    def init_hidden(self): #定义h0初始化
        return torch.zeros(self.batch_size,self.hidden_size)

y_net = y_rnncell_model(input_size,hidden_size,batch_size)

#定义损失函数和优化器
lossf = torch.nn.CrossEntropyLoss()
optim = torch.optim.Adam(y_net.parameters(),lr=0.001)

# RNN Cell
for epoch in range(800):
    loss = 0
    optim.zero_grad() #优化器梯度归零
    hidden = y_net.init_hidden() #h0
    print('Predicted string:',end='')
    for x,y in zip(inputs,labels):
        hidden = y_net(x,hidden)
        loss += lossf(hidden,y) #计算损失之和,需要构造计算图
        _,idx = hidden.max(dim=1)
        print(dictionary[idx.item()],end='')
    loss.backward()
    optim.step()
    print(',Epoch [%d/20] loss=%.4f'%(epoch+1,loss.item()))

Ⅱ RNN

#引入torch
import torch

input_size = 6 #beyond
hidden_size = 6 #
num_layers = 1
batch_size = 1
seq_len = 6
 

idx2char = ['b','d','e','n','o','y'] #字典
x_data = [0,2,5,4,3,1] #beyond
y_data = [5,3,0,4,1,2] #ynbode

one_hot = [[1,0,0,0,0,0],
           [0,1,0,0,0,0],
           [0,0,1,0,0,0],
           [0,0,0,1,0,0],
           [0,0,0,0,1,0],
           [0,0,0,0,0,1]]


x_one_hot = [one_hot[x] for x in x_data] #将x_data的每个元素从one_hot得到相对于的向量形式

inputs = torch.Tensor(x_one_hot).view(seq_len,batch_size,input_size)

labels = torch.LongTensor(y_data)
 
class y_rnn_model(torch.nn.Module):
    def __init__(self,input_size,hidden_size,batch_size,num_layers):
        super(y_rnn_model,self).__init__()
        self.num_layers = num_layers
        self.batch_size = batch_size
        self.input_size = input_size
        self.hidden_size = hidden_size
        self.rnn = torch.nn.RNN(input_size=self.input_size,hidden_size=self.hidden_size,num_layers=self.num_layers)
    
    def forward(self,inputs):
        hidden = torch.zeros(self.num_layers,
                             self.batch_size,
                             self.hidden_size)#构造h0
        out,_ = self.rnn(inputs,hidden)     
        return out.view(-1,self.hidden_size) #(seqlen×batchsize,hiddensize)


net = y_rnn_model(input_size,hidden_size,batch_size,num_layers)
 

lessf = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(net.parameters(),lr=0.05)
 

for epoch in range(30):
    optimizer.zero_grad()
    outputs = net(inputs)
    loss = lessf(outputs,labels)   
    loss.backward()
    optimizer.step()
    _, idx = outputs.max(dim=1)
    idx = idx.data.numpy()
    print('Predicted:',''.join([idx2char[x] for x in idx]),end='')
    print(',Epoch[%d/15] loss=%.3f' % (epoch+1,loss.item()))

③one-hot的不足

1,维度过高;一个单词得占用一个维度
2,one-hot向量过于稀疏;就一个1,其余全是0
3,硬编码;一对一

解决方法:EMBEDDING
思路:将高维的向量映射到一个稠密的低维的向量空间里面
即:数据的降维

在这里插入图片描述

四、Embeding模块

优化RNN
在这里插入图片描述

官网torch.nn.Embedding(…)函数详细参数解释
在这里插入图片描述

参数含义
num_embeddingsone-hot的维度
embedding_dimembedding的维度
Input: (*)(∗), IntTensor or LongTensor of arbitrary shape containing the indices to extract输入需要是一个整型或者长整型IntTensor or LongTensor
Output: (*, H), where * is the input shape and H=embedding_dim(input shape,embedding_dim )
import torch

num_class = 6 #类别数6个,'b','d','e','n','o','y'
input_size = 6 #输入6 beyond
seq_len = 6 
hidden_size = 8 #输出8维
embedding_size = 10 #嵌入层设置为10层
num_layers = 2 #2层RNN Cell
batch_size = 1


dictionary = ['b','d','e','n','o','y'] #字典
x_data = [[0,2,5,4,3,1]] #beyond  (batch_size,seqlen)
y_data = [5,3,0,4,1,2]   #ynbode  (batch_size * seqlen)   


inputs = torch.LongTensor(x_data)
labels = torch.LongTensor(y_data)

class Model(torch.nn.Module):
    def __init__(self, input_size, embedding_size, hidden_size, num_layers, num_class):
        super(Model, self).__init__()
        
        self.embed = torch.nn.Embedding(input_size, embedding_size)
        self.rnn = torch.nn.RNN(input_size=embedding_size,hidden_size=hidden_size,num_layers=num_layers,batch_first=True)#batch_first=True 需要注意点格式
        #input   (batch_size,seqlen,embeddingsize)
        #output  (batch_size,seqlen,hidden_size)

        self.fc = torch.nn.Linear(hidden_size, num_class)
        
    def forward(self, x):
        hidden = torch.zeros(num_layers, x.size(0), hidden_size)
        x = self.embed(x)  # (batch, seqLen, embeddingSize)
        x, _ = self.rnn(x, hidden)
        x = self.fc(x)
        return x.view(-1, num_class) #(batch_size×seqlen,numclass)
    
emb_net = Model(input_size, embedding_size, hidden_size, num_layers, num_class)
lessf = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(emb_net.parameters(),lr=0.05)

for epoch in range(30):
    optimizer.zero_grad()
    outputs = emb_net(inputs)
    loss = lessf(outputs,labels)   
    loss.backward()
    optimizer.step()
    _, idx = outputs.max(dim=1)
    idx = idx.data.numpy()
    print('Predicted:',''.join([dictionary[x] for x in idx]),end='')
    print(',Epoch[%d/15] loss=%.3f' % (epoch+1,loss.item()))

五、LSTM(长短时记忆网络)

因为我是主要做图像方面的课题,故这个网络我就不去深究了,感兴趣的家人们可以去官网学习学习,官网API:torch.nn.LSTM(*args, **kwargs)
在这里插入图片描述

六、GRU模型

官网API:torch.nn.GLU(dim = -1)
在这里插入图片描述

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

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

相关文章

拦截器 JWT SpringBoot 多环境开发 本地文件上传 阿里云OSS存储 异常处理

Springboot&#xff1a; 是&#xff1a;由pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化spring应用的初始搭建以及开发过程 作用&#xff1a;简化Spring的环境搭建和代码开发 使用原理&#xff1a;就是boot提前写好了一些maven的工程和jar包&#xff0c;程序员在…

Android屏幕适配dp、px两套解决办法

最新最全文章(2018-08-25)&#xff1a;Android dp方式的屏幕适配-原理(后期补充完整讲解)_手机dp输出是横屏还是竖屏_android阿杜的博客-CSDN博客 “又是屏幕适配&#xff0c;这类文章网上不是很多了吗&#xff1f;” 我也很遗憾&#xff0c;确实又是老问题。但本文重点对网上…

ChatGPT来势凶猛,公有云格局会不会大变?

【引言】&#xff1a; AI风暴来袭&#xff0c;全球无人幸免。 但公有云与ChatGPT到底啥关系&#xff1f; 1) 公有云与ChatGPT&#xff0c;到底谁会“吃”掉谁&#xff1f; 【科技明说 &#xff5c; 热点关注】在看到公有云厂商纷纷开始大模型发布&#xff0c;开始GPT的融入之…

虹科教您 | 基于Linux系统的虹科RELY-TSN-KIT套件操作指南(2)——操作演示

RELY-TSN-KIT是首款针对TSN的开箱即用的解决方案&#xff0c;它可以无缝实施确定性以太网网络&#xff0c;并从这些技术复杂性中抽象出用户设备和应用。该套件可评估基于IEEE 802.1AS同步的时间常识的重要性&#xff0c;并借助时间感知整形器来确定性地交付实时流量&#xff0c…

EJBCA搭建

EJBCA搭建 前言&#xff1a; 本次EJBCA搭建使用操作系统为centos 7&#xff0c;shell用户为root。 1.下载jdk环境&#xff1a; // 下载jdk yum install -y java-1.8.0-openjdk-devel // 查看java版本 java -version 本人jdk环境&#xff1a; openjdk version "1.8.…

计算机自动化有哪些SCI期刊推荐? - 易智编译EaseEditing

以下是计算机自动化领域的一些知名SCI期刊&#xff1a; IEEE Transactions on Automation Science and Engineering&#xff1a; 该期刊由IEEE&#xff08;电气和电子工程师协会&#xff09;出版&#xff0c;涵盖了自动化科学和工程领域的研究&#xff0c;包括自动控制、人工…

算法记录 | Day35 贪心算法

860.柠檬水找零 思路&#xff1a; 只需要维护三种金额的数量&#xff0c;5&#xff0c;10和20。 有如下三种情况&#xff1a; 情况一&#xff1a;账单是5&#xff0c;直接收下。情况二&#xff1a;账单是10&#xff0c;消耗一个5&#xff0c;增加一个10情况三&#xff1a;账…

九、Locust运行与配置

1. 配置 1.1 环境变量 也可以通过环境变量设置选项。它们通常与命令行参数相同&#xff0c;但大写并带有前缀LOCUST_&#xff1a; 在 Linux/macOS 上&#xff1a; $ LOCUST_LOCUSTFILEcustom_locustfile.py locust在 Windows 上&#xff1a; > set LOCUST_LOCUSTFILEcu…

MySQL的安装与卸载(Centos7.9环境下,全篇图文手把手安装教程)

前言 在安装MySQL之前&#xff0c;我们先来看看MySQL如何卸载。如果从未安装过MySQL的任何版本&#xff0c;可以直接跳过这部分。 如果已经安装过MySQL&#xff0c;一定要确保自己的环境中的MySQL相关文件删除干净&#xff0c;否则重新安装时可能会出现一些错误 tips&#xf…

问界M9全剧透:华为的「科技豪华」样板间

作者 | 德新 编辑 | 王博 今天在nova 11的发布会上&#xff0c;曝了一个意外——问界M9提前剧透。实际上这车要今年四季度才上市。「本来没打算这么早发出来&#xff0c;前阵子网上有一个很老的设计图在传&#xff08;实在太丑&#xff09;。没办法&#xff0c;干脆先讲讲」…

DriveGPT、车企订单背后,为什么毫末每年都能搞出新东西?

作者 | 祥威 编辑 | 德新 4月11日&#xff0c;毫末智行正式发布自动驾驶生成式大模型 DriveGPT&#xff0c;中文名 雪湖海若&#xff0c;可以提升自动驾驶认知能力&#xff0c;最终提升规控效率。 雪湖海若的核心&#xff0c;是将各种驾驶场景作为Token输入到模型中&…

《Netty》从零开始学netty源码(三十九)之PoolSubPage的内存分配

目录 PoolSubPage.allocategetNextAvail方法toHandle方法removeFromPool方法 PoolSubPage.allocate 上一篇我们介绍了PoolSubPage的简单知识&#xff0c;当我们需要PoolSubPage的内存时可调用allocate方法查找可分配二进制的位置&#xff0c;具体的源码过程如下&#xff1a; …

ctfshow web入门命令执行web74-118

1.web74 还是先扫目录 payload: c$anew DirectoryIterator(glob:///*);foreach($a as $f){echo($f->__toString()." ");}exit(0); #扫描根目录有什么文件 c$anew DirectoryIterator(glob:///*);foreach($a as $f){echo($f->getFilename()." ");} …

N32G430学习笔记20--- spi外设单工模式下spi1中断发送和spi2中断数据接收

基本知识 spi主模式下使用硬件NSS(3个条件缺一不可): 设置硬件NSS模式设置NSS电平为低电平使能NSS输出spi主模式下使用软件NSS: 设置软件NSS模式 使能NSS输出 SPI_SS_Output_Enable(SPI1);//NSS 使能 SPI接线方式(MISO 和MOSI反着接) SPI1->SLCK=PB3 <–> SPI2-…

在SPRO为定制表创建节点

确定透明表已创建&#xff0c;允许维护&#xff0c;并且生成维护视图。保证SM30可以正常维护。 2.在已有的节点增加还是新增&#xff0c;如果在以有的节点增加&#xff0c;需要查看已有节点的Enhancement ID 。 查看方法具体请点击。 举个例子&#xff1a;我们想在Z-business C…

每日学术速递4.17

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.DreamPose: Fashion Image-to-Video Synthesis via Stable Diffusion 标题&#xff1a;DreamPose&#xff1a;通过稳定扩散实现时尚图像到视频合成 作者&#xff1a;Johanna Karr…

无聊写个 chatgpt 玩玩!这不得试一试 openai 的聊天和绘画功能

chatgpt 最近很火。使用 chatgpt 问一些问题还是很有用的。比如面试题&#xff0c;面试题的答案。简直不要太爽。 不过闲来无事&#xff0c;也使用 openai 提供的api &#xff0c;写了几个小页面&#xff0c;可以进行聊天&#xff0c;和绘画。 项目放在 github 上了&#xff…

cmake和cmake install学习

cmake 设置cmake的C/C编译标准 set(CMAKE_CXX_STANDARD 17) set(CMAKE_C_STANDARD 11)add_library生成的默认是静态库还是动态库 https://blog.csdn.net/HandsomeHong/article/details/122401900 add_library()命令生成的默认库类型取决于第二个参数。如果第二个参数是STATI…

python-day3

第003天 函数和模块的使用 定义函数 在python中可以使用def关键字来定义函数&#xff0c;和变量一样每个函数也有一个名字&#xff0c;而且命名规则和变量的命名规则是一致的。在函数名后面的圆括号中可以放置传递给函数的参数&#xff0c;程序中函数的参数就是相当于数学上…

企业级信息系统开发学习笔记05 初探Spring AOP

文章目录 一、学习目标二、Spring AOP&#xff08;一&#xff09;AOP基本含义&#xff08;二&#xff09;AOP基本作用&#xff08;三&#xff09;AOP和OOP对比&#xff08;四&#xff09;AOP使用方式&#xff08;五&#xff09;AOP基本概念 三、采用配置方法使用AOP&#xff08…