torch.nn包下实现了LSTM函数,实现LSTM层。多个LSTMcell组合起来是LSTM。python
LSTM自动实现了前向传播,不须要本身对序列进行迭代。函数
LSTM的用到的参数以下:建立LSTM指定以下参数,至少指定前三个参数编码
input_size: 输入特征维数 hidden_size: 隐层状态的维数 num_layers: RNN层的个数,在图中竖向的是层数,横向的是seq_len bias: 隐层状态是否带bias,默认为true batch_first: 是否输入输出的第一维为batch_size,由于pytorch中batch_size维度默认是第二维度,故此选项能够将 batch_size放在第一维度。如input是(4,1,5),中间的1是batch_size,指定batch_first=True后就是(1,4,5) dropout: 是否在除最后一个RNN层外的RNN层后面加dropout层 bidirectional: 是不是双向RNN,默认为false,若为true,则num_directions=2,不然为1
为了统一,之后都batch_first=True
code
LSTM的输入为:LSTM(input,(h0,co))
input
其中,指定batch_first=True
后,input就是(batch_size,seq_len,input_size)
it
(h0,c0)是初始的隐藏层,由于每一个LSTM单元其实须要两个隐藏层的。记hidden=(h0,c0)
io
其中,h0的维度是(num_layers*num_directions, batch_size, hidden_size)
class
c0维度同h0。注意,即便batch_first=True
,这里h0的维度依然是batch_size在第二维度import
LSTM的输出为:out,(hn,cn)
model
其中,out是每个时间步的最后一个隐藏层h的输出,假若有5个时间步(即seq_len=5),则有5个对应的输出,out的维度是:(batch_size,seq_len,hidden_size)
而hidden=(hn,cn)
,他本身实现了时间步的迭代,每次迭代须要使用上一步的输出和hidden层,最后一步hidden=(hn,cn)
记录了最后一各时间步的隐藏层输出,有几层对应几个输出,若是这个是RNN-encoder,则hn,cn就是中间的编码向量。hn的维度是(num_layers*num_directions,batch_size,hidden_size),cn同。
建立一LSTM:
lstm = torch.nn.LSTM(input_size,hidden_size,num_layers,batch_first=True)
forward使用LSTM层:
out,hidden = lstm(input,hidden)
其中,hidden=(h0,c0)
是个tuple
最终获得out,hidden
import torch # 实现一个num_layers层的LSTM-RNN class RNN(torch.nn.Module): def __init__(self,input_size, hidden_size, num_layers): super(RNN,self).__init__() self.input_size = input_size self.hidden_size=hidden_size self.num_layers=num_layers self.lstm = torch.nn.LSTM(input_size=input_size,hidden_size=hidden_size,num_layers=num_layers,batch_first=True) def forward(self,input): # input应该为(batch_size,seq_len,input_szie) self.hidden = self.initHidden(input.size(0)) out,self.hidden = lstm(input,self.hidden) return out,self.hidden def initHidden(self,batch_size): if self.lstm.bidirectional: return (torch.rand(self.num_layers*2,batch_size,self.hidden_size),torch.rand(self.num_layers*2,batch_size,self.hidden_size)) else: return (torch.rand(self.num_layers,batch_size,self.hidden_size),torch.rand(self.num_layers,batch_size,self.hidden_size)) input_size = 12 hidden_size = 10 num_layers = 3 batch_size = 2 model = RNN(input_size,hidden_size,num_layers) # input (seq_len, batch, input_size) 包含特征的输入序列,若是设置了batch_first,则batch为第一维 input = torch.rand(2,4,12) model(input)