将Pyrotch LSTM的状态参数转换为Keras LSTM

将Pyrotch LSTM的状态参数转换为Keras LSTM,keras,lstm,pytorch,Keras,Lstm,Pytorch,我试图将一个现有的经过训练的PyTorch模型移植到Keras中 在移植过程中,我被困在LSTM层 LSTM网络的Keras实现似乎有三种状态类型的状态矩阵,而Pytorch实现有四种 例如,对于隐藏层为64的双向LSTM,输入大小为512,输出大小为128,状态参数如下 Keras LSTM的状态参数 [<tf.Variable 'bidirectional_1/forward_lstm_1/kernel:0' shape=(512, 256) dtype=float32_ref>

我试图将一个现有的经过训练的PyTorch模型移植到Keras中

在移植过程中,我被困在LSTM层

LSTM网络的Keras实现似乎有三种状态类型的状态矩阵,而Pytorch实现有四种

例如,对于隐藏层为64的双向LSTM,输入大小为512,输出大小为128,状态参数如下

Keras LSTM的状态参数

[<tf.Variable 'bidirectional_1/forward_lstm_1/kernel:0' shape=(512, 256) dtype=float32_ref>,
 <tf.Variable 'bidirectional_1/forward_lstm_1/recurrent_kernel:0' shape=(64, 256) dtype=float32_ref>,
 <tf.Variable 'bidirectional_1/forward_lstm_1/bias:0' shape=(256,) dtype=float32_ref>,
 <tf.Variable 'bidirectional_1/backward_lstm_1/kernel:0' shape=(512, 256) dtype=float32_ref>,
 <tf.Variable 'bidirectional_1/backward_lstm_1/recurrent_kernel:0' shape=(64, 256) dtype=float32_ref>,
 <tf.Variable 'bidirectional_1/backward_lstm_1/bias:0' shape=(256,) dtype=float32_ref>]
 ['rnn.0.rnn.weight_ih_l0', torch.Size([256, 512])],
 ['rnn.0.rnn.weight_hh_l0', torch.Size([256, 64])],
 ['rnn.0.rnn.bias_ih_l0', torch.Size([256])],
 ['rnn.0.rnn.bias_hh_l0', torch.Size([256])],
 ['rnn.0.rnn.weight_ih_l0_reverse', torch.Size([256, 512])],
 ['rnn.0.rnn.weight_hh_l0_reverse', torch.Size([256, 64])],
 ['rnn.0.rnn.bias_ih_l0_reverse', torch.Size([256])],
 ['rnn.0.rnn.bias_hh_l0_reverse', torch.Size([256])],
我试图查看这两个实现的代码,但理解不了多少


有人能帮我把PyTorch中的4组状态参数转换成Keras中的3组状态参数吗?它们其实没什么不同。如果你将PyTorch中的两个偏差向量相加,那么方程将与Keras中实现的方程相同

这是关于以下各项的LSTM公式:

PyTorch使用两个单独的偏差向量进行输入变换(下标以
i
开头)和循环变换(下标以
h
开头)

在Keras
LSTMCell
中:

x_i=K.dot(输入,self.kernel)
x\u f=K.dot(输入,self.kernel\u f)
x_c=K.dot(输入_c,self.kernel_c)
x_o=K.dot(输入,self.kernel)
如果使用self.u偏差:
x_i=K.bias_add(x_i,self.bias_i)
x\u f=K.bias\u add(x\u f,self.bias\u f)
x_c=K.bias_add(x_c,self.bias_c)
x_o=K.bias_add(x_o,self.bias_o)
如果0
在输入转换中只添加了一个偏差。然而,如果我们在PyTorch中总结这两个偏差,则方程是等价的


双偏置LSTM是在cuDNN中实现的(请参阅)。我真的不太熟悉Pytork,但我想这就是为什么他们使用两个偏差参数。在Keras中,
CuDNNLSTM
层也有两个偏差权重向量。

奇怪的是,Torch在LSTM中有4个状态矩阵,考虑到模型设计上应该有3个。是的,LSTM的PyTorch实现几乎没有什么不同:。有两组偏差参数。如果您想将PyTorch参数转换为Keras,我的建议是关闭偏差参数。谢谢。我核实过了,你是对的。两个输出之间只有很小的差异(按1E-7的顺序)。在检查时我还发现,Pytorch使用sigmoid作为激活函数,而Keras使用hard_sigmoid作为激活函数default@harish2704如果这个答案对你有帮助(似乎是这样的话),你应该考虑接受它。