RNN循环神经网络基础

RNN的基本结构:
在这里插入图片描述
如何创建NN Cell:

在这里插入图片描述
在这里插入图片描述

代码实现:

import torch
#先设定参数
batch_size=1
seq_len=3#x1,x2,x3
input_size=4#x1,x2,x3,x4是一个4个元素的向量
hidden_size=2#hidden里面是2个元素的向量
cell=torch.nn.RNNCell(input_size=input_size,hidden_size=hidden_size)#初始化
datasets=torch.randn(seq_len,batch_size,input_size)
hidden=torch.zeros(batch_size,hidden_size)#隐层h0做成全0
for idx,input in enumerate(datasets):#训练的循环
	print('='*20,idx,'='*20)
	print('Input_size:',input.shape)
	hidden=cell(input,hidden)#这次的隐层=这次的输入和上次的隐层
	print('output size:',hidden.shape)
	print(hidden)

怎么使用RNN:
在这里插入图片描述

out,hidden=cell(inputs,hidden)

inputs是x1…xn
后面的hidden是h0
out是h1…hn
前面的hidden是hn
使用RNN的话就不需要循环了,RNN可以自动帮助循环
在这里插入图片描述
在这里插入图片描述
例子:
输入:hello如何输出ohlol

RNNseq2seq:

import torch
input_size=4
hidden_size=4
batch_size=1
idx2char=['e','h','l','o']
x_data=[1,0,2,2,3]#hello
y_data=[3,1,2,3,2]#ohlol
one_hot_lookup=[[1,0,0,0],#ehlo
                [0,1,0,0],
                [0,0,1,0],
                [0,0,0,1]]
x_one_hot=[one_hot_lookup[x] for x in x_data]
'''
[[0, 1, 0, 0], 
[1, 0, 0, 0], 
[0, 0, 1, 0], 
[0, 0, 1, 0], 
[0, 0, 0, 1]]
'''
inputs=torch.Tensor(x_one_hot).view(-1,batch_size,input_size)
'''
tensor([[[0., 1., 0., 0.]],
        [[1., 0., 0., 0.]],
        [[0., 0., 1., 0.]],
        [[0., 0., 1., 0.]],
        [[0., 0., 0., 1.]]])
'''
labels=torch.LongTensor(y_data).view(-1,1)
'''
 tensor([[3],
        [1],
        [2],
        [3],
        [2]])
'''
class Model(torch.nn.Module):
    def __init__(self,input_size,hidden_size,batch_size):
        super(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,input,hidden):
        hidden=self.rnncell(input,hidden)
        return hidden
    def init_hidden(self):
        return torch.zeros(self.batch_size,self.hidden_size)
net=Model(input_size,hidden_size,batch_size)
cirterion=torch.nn.CrossEntropyLoss()
optimizer=torch.optim.Adam(net.parameters(),lr=0.1)#优化器进行优化
#训练,共训练15轮
for epoch in range(15):
    loss=0
    optimizer.zero_grad()#优化器的梯度归0
    hidden=net.init_hidden()#算h0
    print('Predicted string:',end='')
    # inputs=seq_len*batch_size*inputsize,input=batch_size*input_size
    #labels=seq_length*1
    for input,label in zip(inputs,labels):
        hidden=net(input,hidden)
        loss+=cirterion(hidden,label)#损失累积到一起
        _,idx=hidden.max(dim=1)#找hidden里面输出的最大值,因为hidden是最大值,最大的下标找到
        print(idx2char[idx.item()],end='')#输出预测结果
    loss.backward()#反向传播
    optimizer.step()#优化更新
    print(',Epoch [%d/15] loss=%.4f' %(epoch+1,loss.item()))

在这里插入图片描述
one-hot vs Embedding:
数据的降维:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
加入了embedding和linear layer层:
embedding的参数(num_embeddings,embedding_dim)
num_embeddings就是Input_size的独热向量是几维的
embedding_dim每一个embedding向量的size
![在这里插入图片描述](https://img-blog.csdnimg.cn/3b4fec1a100b4b5387ab4bd258645ce8.png
在这里插入图片描述
在这里插入图片描述
LSTM:
在这里插入图片描述
在这里插入图片描述
GRU:
在这里插入图片描述

循环神经网络(Recurrent Neural Network,RNN)是一种专门用于处理序列数据的神经网络。在传统的神经网络中,每个输入和输出之间是相互独立的,即每个输入都是独立处理的。但是在序列数据中,每个输入都与前面的输入相关联,而且输出也会影响下一个输出。这就需要一种能够处理序列数据的神经网络循环神经网络应运而生。 循环神经网络可以看作是一个有记忆力的神经网络,它不仅使用当前输入,还使用它之前的状态(即前一时刻的输出)来计算当前时刻的输出。这种记忆机制使得循环神经网络可以处理序列数据,并且在处理长序列时表现良好。 循环神经网络的核心是循环单元(Recurrent Unit,RU),它是一个带有反馈连接的神经网络单元。常见的循环单元包括基本RNN、LSTM和GRU等。基本RNN是最简单的循环单元,它的输出取决于当前输入和前一时刻的输出。LSTM和GRU是在基本RNN基础上进行改进的,引入了门控机制来控制信息的流动,避免了梯度消失和梯度爆炸的问题,提高了网络的性能。 通过循环单元的连接,循环神经网络可以处理任意长度的序列数据,并且可以在序列数据中学习到长期的依赖关系,比如在自然语言处理中,循环神经网络可以学习到句子中单词之间的语法和语义关系,从而实现文本生成、情感分析、机器翻译等任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值