Pytorch中的LSTM和LSTMCell

LSTM

class torch.nn.LSTM(*args, **kwargs)

参数列表

  • input_size:x的特征维度
  • hidden_size:隐藏层的特征维度
  • num_layers:lstm隐层的层数,默认为1
  • bias:False则bih=0和bhh=0. 默认为True
  • batch_first:True则输入输出的数据格式为 (batch, seq, feature)
  • dropout:除最后一层,每一层的输出都进行dropout,默认为: 0
  • bidirectional:True则为双向lstm默认为False
  • 输入:input, (h0, c0)
  • 输出:output, (hn,cn)

输入数据格式: 
input(seq_len, batch, input_size) 
h0(num_layers * num_directions, batch, hidden_size) 
c0(num_layers * num_directions, batch, hidden_size)

输出数据格式: 
output(seq_len, batch, hidden_size * num_directions) 
hn(num_layers * num_directions, batch, hidden_size) 
cn(num_layers * num_directions, batch, hidden_size)

Pytorch里的LSTM单元接受的输入都必须是3维的张量(Tensors).每一维代表的意思不能弄错。第一维体现的是序列(sequence)结构,也就是序列的个数,嘿嘿,也就是这一串的输入中,多少个明确的单元数,第二维度体现的是小块(mini-batch)结构,第三位体现的是输入的元素(elements of input)。如果在应用中不适用小块结构,那么可以将输入的张量中该维度设为1,但必须要体现出这个维度。下文的例子中,我们就不打算使用小块结构。

假如我们要把下面这句话“The cow junped”送入网络,那么输入看起来像下面这样:

 

 

注:上式中的 q后面跟一个单词,表示该单词的一定维度的向量表示,该维度即是LSTM接受的张量中的第三个维度。记住这里存在一个尺寸为1的第二维度。

 

LSTMCell

一个LSTM单元,相当于一个time step的处理。LSTMCell参数中没有num_layers(层数)、bidirectional(双向)、dropout选项。

 

LSTMCell的输入是一个时间步x_t,需要写一个循环跑一个完整的序列。

LSTM的输入是SEQUENCE of inputs x_1,x_2,…,x_T,因此不需要写循环。

关于二者区别的讨论

https://discuss.pytorch.org/t/lstm-and-lstmcell/7488

https://stackoverflow.com/questions/57048120/pytorch-lstm-vs-lstmcell

 

 

总之,根据需要和具体的场景选用。

 

posted on 2019-03-26 15:01  那抹阳光1994  阅读(3139)  评论(1编辑  收藏  举报

导航