LSTM的学习和一个使用实例

循环神经网络:

  • RNN:具有短期记忆的网络结构,把之前的输出作为下一个的输入
  • RNN类型:
    • one-to-one:图像分类
    • one-to many:图像转文字
    • many-to-one:文本分类
    • 异步的many-to-many:文本翻译
    • 同步的many-to-many:视屏分类
  • LSTM:    long short-term memory
    • 遗忘门:通过sigmoid来决定哪些信息被遗忘
    • 输入门:决定哪些信息会被输入
      • sigmoid决定输入多少比例信息
      • tanh决定输入什么信息
    • 输出门:
      • 输出当前时刻的结果和hidden_state
      • hidden_state=h_t
      • LSTM的学习和一个使用实例_第1张图片

  • GRU:LSTM的变形
    • 两个门:更新门和输出门

LSTM的api:

import torch
torch.nn.LSTM(input_size='输入数据的形状,即embedding_dim',
              hidden_size='隐藏层的数量,即每一层有多少个LSTM单元',
              num_layers='LSTM单元层数',
              batch_first='默认为false,输入数据是:[seq_len,bath_size,dim],当是true时输入数据是:[bath_size,seq_len,dim]',
              dropout='是一种训练过程中让部分参数随机失活的一种方式,能够提高训练速度同时能够解决拟合问题,这里是LSTM的最后一层,对每个输出进行dropout',
              bidirectional='是否使用LSTM,默认是false')
  •  一个词语我们可以理解为由长度是embedding_dim的向量表示,seq_len是指句子长度
  • input为[bath_size,seq_len,embedding_dim]batch_first=false,hidden_size表示LSTM中的单元数量
  • output为[seq_len,bath_szie,hidden_size*[num_directions]]//num_directions双向是2,单向是1
  • 原理图示:
  • LSTM的学习和一个使用实例_第2张图片
  • h_n:(num_layers*num_directions,batch_size,hidden_size)#num_directions同上
  • c_n:(num_layers*num_directions,batch_size,hidden_size)#num_directions同上

 LSTM的使用示例:

import torch.nn as nn
import torch
batch_size=10
seq_len=20#句子的长度
vocab_size=100#词典的数量
embedding_dim=30#用长度是30的向量表示一个词语
hidden_size=18#embedding_dim维数
num_layer=1#:LSTM中的层数
input=torch.randint(0,100,[batch_size,seq_len])#[10,20]维度
# print(input)
embedding=nn.Embedding(vocab_size,embedding_dim)
input=embedding(input)#[10,20,30]维度
#把embedding 之后的数据传入list
lstm=nn.LSTM(input_size=embedding_dim,hidden_size=hidden_size,num_layers=num_layer,batch_first=True)
output,(h_n,c_n)=lstm(input)
print(output)
print("*"*100)
print(h_n)
print("*"*100)
print(c_n)
print("*"*100)
print(output.size())
print("*"*100)
print(h_n.size())
print("*"*100)
print(c_n.size())
print("*"*100)

LSTM的学习和一个使用实例_第3张图片

交叉熵损失:

1、对输出值计算softmax和取对数

  • output=F.log_softmax(x,dim=-1)

2、使用torch中的带权损失

  • loss=F.nll_loss(output,target)

你可能感兴趣的:(NLP,lstm,rnn,深度学习,NLP)