循环神经网络:
- 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
- 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
- 原理图示:
- 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)
交叉熵损失:
1、对输出值计算softmax和取对数
- output=F.log_softmax(x,dim=-1)
2、使用torch中的带权损失
- loss=F.nll_loss(output,target)