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
总之,根据需要和具体的场景选用。