免费建立个人视频网站,固安建设局网站,网站建设制作设计营销公司南宁,wordpress模板网站标题重复RNN
特点#xff1a;输入层是层层相关联的#xff0c;输入包括上一个隐藏层的输出h1和外界输入x2#xff0c;然后融合一个张量#xff0c;通过全连接得到h2#xff0c;重复 优点#xff1a;结构简单#xff0c;参数总量少#xff0c;在短序列任务上性能好 缺点#x…RNN
特点输入层是层层相关联的输入包括上一个隐藏层的输出h1和外界输入x2然后融合一个张量通过全连接得到h2重复 优点结构简单参数总量少在短序列任务上性能好 缺点在长序列中效果不好容易梯度提升或者爆炸
import torch
import torch.nn as nn
import torch.nn.functional as F# 参数一: 输入张量的词嵌入维度5, 参数二: 隐藏层的维度(也就是神经元的个数), 参数三: 网络层数
rnn nn.RNN(5, 6, 2)# 参数一: sequence_length序列长度, 参数二: batch_size样本个数, 参数三: 词嵌入的维度, 和RNN第一个参数匹配
input1 torch.randn(1, 3, 5)# 参数一: 网络层数, 和RNN第三个参数匹配, 参数二: batch_size样本个数, 参数三: 隐藏层的维度, 和RNN第二个参数匹配
h0 torch.randn(2, 3, 6)output, hn rnn(input1, h0)
# print(output.shape)
# torch.Size([1, 3, 6])
# print(hn.shape)
# torch.Size([2, 3, 6])
LSTM
解决了RNN的缺点在长序列中效果好现在仔细研究中间图的结构 最左边是的黄色矩形部分是遗忘门就是结合前一层的的h1输入x2拼接然后经过全连接层后输出ft就是把之前的一些信息遗忘一部分
第二第三是一部分输入门拼接完过后经过全连接结合σ激活函数it以及拼接后用一个tanh激活函数ct然后和上一层的结合起来 第三部分是输出门图的右边黄色的矩形到结尾 此外Bi-LSTM是双向的相当于运用了两层LSTM但是方向不同前面是单向的信息从左到右的的传递相当于考虑前面的信息Bi-LSTM是左右信息都考虑然后拼接结果
# -------------------------------------
import torch
import torch.nn as nnlstmnn.LSTM(5,6,2)
inputtorch.randn(1,3,5)
h0torch.randn(2,3,6)
c0torch.randn(2,3,6)
output,(hn,cn)lstm(input,(hn,cn))#-------------------------class Attention(nn.Module):def __init__(self, query_size, key_size, value_size1, value_size2, output_size):super(Attention, self).__init__()self.query_size query_sizeself.key_size key_sizeself.value_size1 value_size1self.value_size2 value_size2self.output_size output_sizeself.attn nn.Linear(self.query_size self.key_size, self.value_size1)self.attn_combine nn.Linear(self.query_size self.value_size2, self.output_size)def forward(self, Q, K, V):attn_weights F.softmax(self.attn(torch.cat((Q[0], K[0]), 1)), dim1)attn_applied torch.bmm(attn_weights.unsqueeze(0), V)output torch.cat((Q[0], attn_applied[0]), 1)output1 self.attn_combine(output).unsqueeze(0)return output1, attn_weightsquery_size 32
key_size 32
value_size1 32
value_size2 64
output_size 64
attn Attention(query_size, key_size, value_size1, value_size2, output_size)
Q torch.randn(1, 1, 32)
K torch.randn(1, 1, 32)
V torch.randn(1, 32, 64)
res attn(Q, K, V)
# print(res[0])
# print(res[0].shape)
# print(*****)
# print(res[1])
# print(res[1].shape)# --------------------------------------------