将 Pytorch LSTM 的状态参数转换为 Keras LSTM
Converting state-parameters of Pytorch LSTM to Keras LSTM
我试图将现有的经过训练的 PyTorch 模型移植到 Keras 中。
在移植过程中,我卡在了 LSTM 层。
LSTM 网络的 Keras 实现似乎具有三种状态类型的状态矩阵,而 Pytorch 实现具有四种。
例如,对于 hidden_layers=64 的双向 LSTM,input_size=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>]
PyTorch LSTM 的状态参数
['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 中实现的相同。
这是 PyTorch documentation 上的 LSTM 公式:
PyTorch 使用两个独立的偏置向量进行输入转换(下标以 i
开头)和递归转换(下标以 h
开头)。
在 Keras 中 LSTMCell
:
x_i = K.dot(inputs_i, self.kernel_i)
x_f = K.dot(inputs_f, self.kernel_f)
x_c = K.dot(inputs_c, self.kernel_c)
x_o = K.dot(inputs_o, self.kernel_o)
if self.use_bias:
x_i = K.bias_add(x_i, self.bias_i)
x_f = K.bias_add(x_f, self.bias_f)
x_c = K.bias_add(x_c, self.bias_c)
x_o = K.bias_add(x_o, self.bias_o)
if 0 < self.recurrent_dropout < 1.:
h_tm1_i = h_tm1 * rec_dp_mask[0]
h_tm1_f = h_tm1 * rec_dp_mask[1]
h_tm1_c = h_tm1 * rec_dp_mask[2]
h_tm1_o = h_tm1 * rec_dp_mask[3]
else:
h_tm1_i = h_tm1
h_tm1_f = h_tm1
h_tm1_c = h_tm1
h_tm1_o = h_tm1
i = self.recurrent_activation(x_i + K.dot(h_tm1_i,
self.recurrent_kernel_i))
f = self.recurrent_activation(x_f + K.dot(h_tm1_f,
self.recurrent_kernel_f))
c = f * c_tm1 + i * self.activation(x_c + K.dot(h_tm1_c,
self.recurrent_kernel_c))
o = self.recurrent_activation(x_o + K.dot(h_tm1_o,
self.recurrent_kernel_o))
输入转换中只添加了一个偏差。但是,如果我们将 PyTorch 中的两个偏差相加,则方程式将是等价的。
双偏置 LSTM 是在 cuDNN 中实现的(参见 developer guide)。我真的不太熟悉 PyTorch,但我想这就是他们使用两个偏置参数的原因。在 Keras 中,CuDNNLSTM
层也有两个偏置权重向量。
我试图将现有的经过训练的 PyTorch 模型移植到 Keras 中。
在移植过程中,我卡在了 LSTM 层。
LSTM 网络的 Keras 实现似乎具有三种状态类型的状态矩阵,而 Pytorch 实现具有四种。
例如,对于 hidden_layers=64 的双向 LSTM,input_size=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>]
PyTorch LSTM 的状态参数
['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 中实现的相同。
这是 PyTorch documentation 上的 LSTM 公式:
PyTorch 使用两个独立的偏置向量进行输入转换(下标以 i
开头)和递归转换(下标以 h
开头)。
在 Keras 中 LSTMCell
:
x_i = K.dot(inputs_i, self.kernel_i)
x_f = K.dot(inputs_f, self.kernel_f)
x_c = K.dot(inputs_c, self.kernel_c)
x_o = K.dot(inputs_o, self.kernel_o)
if self.use_bias:
x_i = K.bias_add(x_i, self.bias_i)
x_f = K.bias_add(x_f, self.bias_f)
x_c = K.bias_add(x_c, self.bias_c)
x_o = K.bias_add(x_o, self.bias_o)
if 0 < self.recurrent_dropout < 1.:
h_tm1_i = h_tm1 * rec_dp_mask[0]
h_tm1_f = h_tm1 * rec_dp_mask[1]
h_tm1_c = h_tm1 * rec_dp_mask[2]
h_tm1_o = h_tm1 * rec_dp_mask[3]
else:
h_tm1_i = h_tm1
h_tm1_f = h_tm1
h_tm1_c = h_tm1
h_tm1_o = h_tm1
i = self.recurrent_activation(x_i + K.dot(h_tm1_i,
self.recurrent_kernel_i))
f = self.recurrent_activation(x_f + K.dot(h_tm1_f,
self.recurrent_kernel_f))
c = f * c_tm1 + i * self.activation(x_c + K.dot(h_tm1_c,
self.recurrent_kernel_c))
o = self.recurrent_activation(x_o + K.dot(h_tm1_o,
self.recurrent_kernel_o))
输入转换中只添加了一个偏差。但是,如果我们将 PyTorch 中的两个偏差相加,则方程式将是等价的。
双偏置 LSTM 是在 cuDNN 中实现的(参见 developer guide)。我真的不太熟悉 PyTorch,但我想这就是他们使用两个偏置参数的原因。在 Keras 中,CuDNNLSTM
层也有两个偏置权重向量。