如何将TensorFlow LSTM实现转换为PyTorch等价代码并匹配参数
参数对应关系梳理
- 你对
num_layers的判断完全准确:这个参数直接取原代码里的self.num_rnn_layers值。原TF代码用MultiRNNCell把同配置的基础LSTM单元堆叠指定层数的逻辑,和PyTorchnn.LSTM通过num_layers堆叠多层同结构LSTM的实现完全等价。 hidden_size直接对应原代码里的self.rnn_size。老版本tf.nn.rnn_cell.BasicLSTMCell的第一个构造参数就是单个LSTM单元的隐藏状态维度,和PyTorch对hidden_size的定义没有任何差别。input_size没法从你贴的这两行TF代码里直接取到值:老版TF的RNN Cell是延迟推导维度的设计,定义Cell的时候不需要提前指定输入维度,会在第一次接收输入的时候自动适配输入张量的最后一维。但PyTorch的nn.LSTM初始化时就必须显式传入输入维度,这个值的实际来源是你喂给这个LSTM层的单时间步特征维度——也就是原TF代码中,送入这个MultiRNNCell的输入张量的最后一维大小。举个例子,如果之前是把维度为128的词向量序列丢给这个LSTM,那这里input_size就填128。
容易踩的转换坑
- 原代码里
state_is_tuple=False是把LSTM的记忆状态c、隐藏状态h拼接成一个长向量返回,PyTorch的nn.LSTM默认返回的是(h_n, c_n)格式的元组,转换的时候不需要刻意模仿TF的拼接行为,按元组结构取对应状态值即可。 - 你设置了
batch_first=True之后,PyTorch要求输入张量形状是(batch_size, 序列长度, 输入特征维度),和老TF默认的(序列长度, batch_size, 输入特征维度)的顺序不一样,送数据的时候一定要调整维度顺序,不然会报形状不匹配的错。 - 两者默认都开启了LSTM门控的偏置项,默认的计算逻辑一致,不需要为了对齐功能刻意修改初始化配置。
内容的提问来源于stack exchange,提问作者Guy
相关产品推荐
相关产品推荐

