本篇写LSTM的输入输出。

一、输入格式

首先粘贴官方文档:

cnn结合lstm模型 pytorch代码 cnn-lstm模型的输入数据_数据

h和c的解释看下面,直接来看输入Input。

其格式为(seq_len,batch,input_size),输入为一个三维向量,第一维表示序列长度,即按时间序列展开有多少个可见的cell,等价于time_step;第二维表示数据批次的多少batch,即数据分为几批送进来;第三维input_size,表示每个time_step代表输入x的特征维数,即输入的特征向量的长度。

二、输出格式

官方文档:

cnn结合lstm模型 pytorch代码 cnn-lstm模型的输入数据_数据_02

(1)output形状为(seq_len,batch,num_direction*hidden_size),这个张量包含LSTM最后一层每个周期的输出特征(h_t),如果是双向LSTM,每个time_step的输出h=[h正向,h负向]。

output是一个三维张量,第一维表示序列长度,第二维表示数据批次的多少batch,即数据分为几批送进来,第三维hidden_size隐藏层大小,双向则二倍,单向则等价于隐藏层大小。

(2)h_n保存了每一层最后一个time_step的输出h,如果是双向LSTM,单独保存前向和后向的最后一个time_step的输出h;这里的h的大小应该是每一个隐藏层节点的值(或称状态),这就是h_n的含义。

h_n是一个三维张量,(num_layers*num_directions,batch,hidden_size),第一维num_layers为层数,第三维为隐藏层节点的个数,即想要的节点值。说白了就是有几个长度为hidden_size的一维向量,每个表示一组隐藏节点的状态值。

(3)c_n与h_n一致,保存的是c值。维数也一样。

总结:

单层LSTM:

输入数据:

——input的格式:(seq_len,batch,input_size) #batch是批次数,可以在LSTM()中设置batch_first,使得X的输入格式要求变为(batch,seq_len,input_size)
——h0的格式:(1,batch,hidden_size)
——c0的格式:(1,batch,hidden_size

因为不管输入的数据X是多少个特征的,h0和c0的都只需要一个输入就行。

对于输出,输出的hidden_size的大小是由门控中的隐藏的神经元的个数来确定的。

输出的格式:

——output的格式:(seq_len,batch,hidden_size) #如果按照(seq_len,batch,hidden_size) 的格式输出,需要在LSTM()中设置return_sequences=True,否则默认只输出最后一个时间步的输出结果(1,batch,hidden_size).

——hn的格式:(1,batch,hidden_size)

——cn的格式:(1,batch,hidden_size)

多层LSTM:

如果是单向的,

输入数据:
——X的格式:(seq_len,batch,input_size)
——h0的格式:(num_layers,batch,hidden_size)
——c0的格式:(num_layers,batch,hidden_size)
输出数据:
——H的格式:(seq_len,batch,hidden_size)
——hn的格式:(num_layers,batch,hidden_size)
——cn的格式:(num_layers,batch,hidden_size)

如果是双向的,即在LSTM()函数中,添加关键字bidirectional=True,则:
单向则num_direction=1,双向则num_direction=2

输入数据格式:
——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)