
## 一、GRU模型的关键参数

1. input_size：输入的特征数，代表输入序列数据中每个值由多少个特征表示，比如NLP中，每个单次由几维的词向量表示；

	> 个人经验：在氢燃料电池系统性能均值预测模型中，input_size代表了输入序列中每个值有多少个特征维度；
	
2. hidden_size：隐藏层特征数；
3. num_layers：代表GRU的层数；
4. bias：是否带有偏置， False则没有偏置，即$b_{ih}=0, b_{hh}=0$. 默认为True
5. batch_first：输入序列中，第一个维度是否为batch. 默认为False;
6. dropout：除最后一层，每一层的输出都进行dropout，默认为: 0
7. bidirectional：是否为双向GRU，默认为False；

## 二、GRU模型的输入和输出及维度

### 2.1 输入

1. GRU模型的输入为input和$h_0$，其中input是输入的序列数据，$h_0$是第一个GRU cell的隐藏层在每个batch中的初始值，$h_0$可以不提供，系统会默认生成一个符合维度要求的全零tensor。
2. 输入维度：
	1. input，当参数batch_first为False时，input的维度为(seq_size, batch_size, feature_size)，当batch_first为True时，input的维度为(batch_size, seq_size,  feature_size)；
	2. $h_0$的维度为(num_layers×GRU方向数，batch_size，hidden_size)；

### 2.2 输出

1. GRU模型的输出为output和$h_n$，其中output为模型输出值，$h_n$为模型最后一个GRU cell的隐藏层状态；
2. 输出维度：
	1. output的维度为(seq_size，batch_size，num_layers×GRU方向数)
	2. $h_n$的维度为(num_layers×GRU方向数，batch_size，hidden_size)

> 1. GRU方向数：当bidirectional为True时，GRU方向数为2，当bidirectional为False时，GRU方向数为1；
> 2. seq_size为输入的单个序列长度，对于NLP代表了每个句子的长度，对于氢燃料电池系统性能均值预测模型中，seq_size代表了序列的时间窗口长度；

## 三、对应关系

1. GRU设置参数中input_size与输入序列input的最后一个维度即feature_size对应；
2. GRU设置参数中hidden_size与输入$h_0$、输出output和$h_n$的最后一个维度对应；
3. GRU设置参数中num_layers与输入$h_0$、输出$h_n$的第一个维度中num_layers对应；
4. GRU设置参数中bidirectional与输入$h_0$、输出output和$h_n$的第一个维度中GRU方向数对应；
5. GRU输入和输出中seq_size、batch_size不变，但是最后一个维度由输入的feature_size变为输出的hidden_size；

> 由于上述对应关系，在encoder-decoder架构中，decoder和encoder的hidden_size必须保持一致，否则会出现维度不匹配的问题；

## 参考文献

1. [循环神经网络 - torch.nn.GRU（）参数详解](https://blog.51cto.com/u_11299290/4727876)
2. [RNN, LSTM, GRU中输入输出维度](https://blog.csdn.net/sophicchen/article/details/108005115)