参考资料:https://zhuanlan.zhihu.com/p/30844905
基本概念
RNN
对任意输入的输出,不仅和当前输入有关,还和上一输入的隐层状态有关。
BRNN
双向RNN,对任意输入的输出,不仅和当前输入有关,还和上一输入的隐层状态,以及下一输入的隐层状态有关。即对于一个序列正向计算一次隐层状态,再反向计算一次,最终得到输出
LSTM(长短期模型)
LSTM相比于RNN,主要解决的长依赖问题,因为RNN的输出只跟上一时刻和这一时刻有关,但对于一些情况,这一时刻的输出可能和序列中很前的状态有关,那么LSTM通过引入细胞状态,使得当前输入与当前输入,上一输出,细胞状态都有关系。与BRNN类似,BLSTM也就是两个方向相反的LSTM组合在一起。
详细理解可以参考:https://www.jianshu.com/p/4b4701beba92
函数代码学习
torch.nn.RNN()函数解析:
官方文档:https://pytorch-cn.readthedocs.io/zh/latest/package_references/torch-nn/#class-torchnnrnn-args-kwargssource
1.参数解析:
input_size:必选参数,指输入序列中一个输入的特征个数,相当于CNN中的输入个数。
hidden_size:必选参数,指的是隐藏层中的特征个数,这个是自定义的超参数,相当于CNN中隐层神经元个数。
num_layers:必选参数,串联RNN的层数,指的是纵向的隐藏层的个数,相当于CNN中的层数。
batch_first:默认为FALSE,是否将batch_size作为第一个维度,如果是,则输入的尺寸为(batch_size, seq_length,input_size),否则为(seq_length,batch_size, input_size)。
bidirectional:指定是否使用双向RNN,使用num_directions=2,不使用为1。
2.函数输入 (input, h_0)
input为当前输入值:input (seq_len, batch, input_size)
h_0为初始隐层状态:h_0 (num_layers * num_directions, batch, hidden_size)
3.函数输出(output, h_n),输出指的是隐藏层在各个序列上计算并输出的隐藏状态,它们通常作为后续输出层的输⼊。
output为当前输出值:output (seq_len, batch, hidden_size * num_directions)
h_n为最终隐层状态:h_n (num_layers * num_directions, batch, hidden_size)
4.示例
#input_size = 10,hidden_size = 20,num_layers = 2
rnn = nn.RNN(10, 20, 2)
#seq_length = 5, batch_size = 3, inputsize = 10
input = Variable(torch.randn(5, 3, 10))
#num_layers * num_directions = 2*1, batch_size = 3, hidden_size = 20
h0 = Variable(torch.randn(2, 3, 20))
#oupt(5,3,20),hn(2,3,20)
output, hn = rnn(input, h0)
torch.nn.LSTM()
参数与上一个函数类似,相信大家在理解了RNN函数后,可以很快理解。
1.参数说明:
input_size – 输入的特征维度
hidden_size – 隐状态的特征维度
num_layers – 层数(和时序展开要区分开)
batch_first – 如果为True,那么输入和输出Tensor的形状为(batch, seq, feature)
dropout – 如果非零的话,将会在RNN的输出上加个dropout,最后一层除外。那么什么是dropout呢,我们在前向传播的时候,让某个神经元的激活值以一定的概率p停止工作,这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征
bidirectional – 如果为True,将会变成BLSTM,默认为False。
2.LSTM输入: input, (h_0, c_0)
input (seq_len, batch, input_size): 包含输入序列特征的Tensor。
h_0 (num_layers * num_directions, batch, hidden_size):保存着batch中每个元素的初始化隐状态的Tensor
c_0 (num_layers * num_directions, batch, hidden_size): 保存着batch中每个元素的初始化细胞状态的Tensor
2.LSTM输出 output, (h_n, c_n)
output (seq_len, batch, hidden_size * num_directions): 保存RNN最后一层的输出的Tensor。
h_n (num_layers * num_directions, batch, hidden_size): Tensor,保存着RNN最后一个时间步的隐状态。
c_n (num_layers * num_directions, batch, hidden_size): Tensor,保存着RNN最后一个时间步的细胞状态。
lstm = nn.torch.lstm(10,20,2)
input = Variable(torch.rand(5,3,10))
h0 = Variable(torch.rand(2,3,10))
c0 = Variable(torch.rand(2,3,10))
ouput,hn,cn = lstm(input,(h0,c0))
代码实战
用pytorch搭建一个CTPN所需的BLSTM网络
class BLSTM(nn.Module):
def __init__(self,input_size,hidden_size):
super(VGG,self).__int__()
self.lstm = nn.LSTM(input_size=input_size,hidden_size=hidden_size,num_layer=1,bidirectional=True)
def forward(self,x):
#x(batch,channel,h,w)->x(seq_len, batch, input_size)
out,_,_ = self.lstm(x)
return out