torch.nn.LSTM的参数、输入输出维度

参考资料:
https://blog.csdn.net/clam76890/article/details/110235897
https://blog.csdn.net/foneone/article/details/104002372
https://www.caidhome.cn/details/422

场景:
场景一:假如有很多句子,每个句子都由50个词组成,每个词都由一个向量表示,向量的长度为8(用一些词嵌入等方法形成的,例如10010011表示“你”这个字,01101101表示“我”这个字)。这里的一个句子就是一个序列
场景二:假如有很多城市的天气信息,每个城市的天气信息都由50天的天气信息组成,每天的天气信息都由一个向量表示,向量的长度为8(比如由温度、空气质量等8个指标组成)。这里的一个城市在这50天的天气信息就是一个序列

规定:
seq_len:序列长度。在场景一中就是一个句子的长度50;场景二中就是一个城市的天气信息所统计的天数,也是50
batch_size:一个Batch的大小,例如为5,每次gradient descent需要考虑的句子数/城市数。
input_size:一个序列中每个元素的向量长度。场景一中就是一个词的向量长度8,场景二中就是一天的天气信息的向量长度,也是8。
num_layers:隐藏层层数
hidden_size:隐藏层单元个数。注意:一层单向LSTM的输出向量长度=hidden_size,而一层双向LSTM的输出向量长度=2*hidden_size

尤其注意的是hidden_size和bidirectional的关系。
按照我的理解,hidden_size=层数*隐藏层单元个数
假如希望隐藏层单元是10个,
如果bidirectional=False,意味着是单层LSTM,则hidden_size就要设置为10
如果bidirectional=True,意味着是双层LSTM,则hidden_size要设置为20

函数定义(以双层LSTM为例):
torch.nn.LSTM(input_size=8,hidden_size=20,num_layers=1,bias=True,batch_first=False,dropout=0.5,bidirectional=True)

输入的维度:
(input, (h_0, c_0))
其中:
input的维度为:(seq_len, batch_size, input_size)
h_0维度为:(num_layers*num_directions, batch_size, hidden_size),表示隐藏层的初始状态
c_0的维度为:(num_layers*num_directions, batch_size, hidden_size),表示cell的初始状态
例如:
((50, 5, 8), ((1*2, 5, 10),(1*2, 5, 10)))

输出的维度:
(ouput,(h_n, c_n))
其中:
output维度为:(seq_len, batch_size, num_directions* hidden_size)
h_n维度为:(num_layers*num_directions, batch_size, hidden_size)
c_n维度为:(num_layers*num_directions, batch_size, hidden_size)
(注意上述output中的num_directions的位置,和h_0、c_0、h_n、c_n的位置是不一样的,前者是乘在第三个参数hidden_size上的,后者是乘在第一个参数num_layers上的。)
例如:
((50, 5, 2*10), ((1*2, 5, 10),(1*2, 5, 10)))

你可能感兴趣的:(学习笔记,深度学习,lstm)