gpt4 book ai didi

keras - 将Pytorch LSTM的状态参数转换为Keras LSTM

转载 作者:行者123 更新时间:2023-12-04 11:33:50 37 4
gpt4 key购买 nike

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

在移植期间,我陷入了LSTM层。

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

例如,对于具有hidden_​​layers = 64的双向LSTM,input_size = 512和output size = 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公式:

enter image description here

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中的两个偏差相加,则这些方程式将是等效的。

cuDNN中实现了两偏置LSTM(请参阅 developer guide)。我对PyTorch确实不那么熟悉,但是我想这就是为什么他们使用两个偏置参数。在Keras中, CuDNNLSTM层还具有两个偏置权重向量。

关于keras - 将Pytorch LSTM的状态参数转换为Keras LSTM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48361376/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com