南联网站建设公司,wordpress文章小尾巴,商检局做产地证的网站,微芒科技网站建设top因为我本人主要课题方向是处理图像的#xff0c;RNN是基本的序列处理模型#xff0c;主要应用于自然语言处理#xff0c;故这里就简单的学习一下#xff0c;了解为主
一、问题引入
已知以前的天气数据信息#xff0c;进行预测当天(4-9)是否下雨
日期温度气压是否下雨4-…因为我本人主要课题方向是处理图像的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 2yy_cell torch.nn.RNNCell(input_sizeinput_size,hidden_sizehidden_size)dataset torch.randn(seq_len,batch_size,input_size)
hidden torch.zeros(batch_size,hidden_size) #h0设置为全0for 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_fnTanhBackward0)1
Input size: torch.Size([1, 4])
outputs size: torch.Size([1, 2])
tensor([[-0.2049, 0.6174]], grad_fnTanhBackward0)2
Input size: torch.Size([1, 4])
outputs size: torch.Size([1, 2])
tensor([[-0.1482, -0.2232]], grad_fnTanhBackward0)ⅡRNN 现学现卖
import torch#根据需求设定参数
batch_size 1
seq_len 3
input_size 4
hidden_size 2
num_layers 2 #两层RNN Cellcell torch.nn.RNN(input_sizeinput_size,hidden_sizehidden_size,num_layersnum_layers)inputs torch.randn(seq_len,batch_size,input_size)
hidden torch.zeros(num_layers,batch_size,hidden_size) #h0设置为全0out,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_fnStackBackward0)
hidden size: torch.Size([2, 1, 2])
hidden tensor([[[ 0.5514, 0.8349]],[[ 0.0269, -0.1330]]], grad_fnStackBackward0)三、RNN实战
需求实现将输入beyond转换为ynbode
①文本转向量one-hot
因为RNN Cell单元输入的数据必须是由单词构成的向量 根据字符来构建一个词典并为其分配索引索引变One-Hot向量词典中有几项最终构建的向量也有几列只能出现一个1其余都为0
characterindexb0d1e2n3o4y5②模型训练
Ⅰ RNN Cell
import torchinput_size 6
hidden_size 6
batch_size 1dictionary [b,e,y,o,n,d] #字典
x_data [0,1,2,3,4,5] #beyond
y_data [2,4,0,3,5,1] #ynbodeone_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_sizeself.input_size input_sizeself.hidden_size hidden_sizeself.rnncell torch.nn.RNNCell(input_sizeself.input_size,hidden_sizeself.hidden_size)def forward(self,inputs,labels):hidden self.rnncell(inputs,labels)return hiddendef 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(),lr0.001)# RNN Cell
for epoch in range(800):loss 0optim.zero_grad() #优化器梯度归零hidden y_net.init_hidden() #h0print(Predicted string:,end)for x,y in zip(inputs,labels):hidden y_net(x,hidden)loss lossf(hidden,y) #计算损失之和需要构造计算图_,idx hidden.max(dim1)print(dictionary[idx.item()],end)loss.backward()optim.step()print(,Epoch [%d/20] loss%.4f%(epoch1,loss.item()))Ⅱ RNN
#引入torch
import torchinput_size 6 #beyond
hidden_size 6 #
num_layers 1
batch_size 1
seq_len 6idx2char [b,d,e,n,o,y] #字典
x_data [0,2,5,4,3,1] #beyond
y_data [5,3,0,4,1,2] #ynbodeone_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_layersself.batch_size batch_sizeself.input_size input_sizeself.hidden_size hidden_sizeself.rnn torch.nn.RNN(input_sizeself.input_size,hidden_sizeself.hidden_size,num_layersself.num_layers)def forward(self,inputs):hidden torch.zeros(self.num_layers,self.batch_size,self.hidden_size)#构造h0out,_ self.rnn(inputs,hidden) return out.view(-1,self.hidden_size) #seqlen×batchsize,hiddensizenet y_rnn_model(input_size,hidden_size,batch_size,num_layers)lessf torch.nn.CrossEntropyLoss()
optimizer torch.optim.Adam(net.parameters(),lr0.05)for epoch in range(30):optimizer.zero_grad()outputs net(inputs)loss lessf(outputs,labels) loss.backward()optimizer.step()_, idx outputs.max(dim1)idx idx.data.numpy()print(Predicted:,.join([idx2char[x] for x in idx]),end)print(,Epoch[%d/15] loss%.3f % (epoch1,loss.item()))③one-hot的不足
1维度过高一个单词得占用一个维度 2one-hot向量过于稀疏就一个1其余全是0 3硬编码一对一
解决方法EMBEDDING 思路:将高维的向量映射到一个稠密的低维的向量空间里面 即数据的降维 优化RNN
官网torch.nn.Embedding函数详细参数解释
参数含义num_embeddingsone-hot的维度embedding_dimembedding的维度Input: (*)(∗), IntTensor or LongTensor of arbitrary shape containing the indices to extract输入需要是一个整型或者长整型IntTensor or LongTensorOutput: (*, H), where * is the input shape and Hembedding_dim(input shape,embedding_dim )
网络架构