0

嗨,我有一个双向 LSTM 层:

class BiDirLSTMInput(Layer):

  def __init__(self):
    self.bidir_lstm = Bidirectional(
                         LSTM(32, return_sequences=True,return_state=True)
                       )


  def call(self, input):
    o, h1,h2, c1,c2 = self.bidir_lstm(input)
    return [h1,h2]

如您所见,我只是在使用 LSTM 的隐藏状态(而不是单元状态)

这就是原因,我是否收到以下警告:

警告:张量流:(后向层)的变量不存在梯度:

  1. lstm_cell_2/内核:0',
  2. lstm_cell_2/recurrent_kernel:0'
  3. lstm_cell_2/bias:0'

忽略这一点听起来不合逻辑。我该如何处理这个错误?

4

2 回答 2

1

好的,我终于能够解决这个警告了。

找出问题所在有点棘手。

所以基本上发生的事情是:

def call(self, input):
    o, h1,h2, c1,c2 = self.bidir_lstm(input)
    return (h1,h2)

如您所见,我只是在使用隐藏状态而不是单元状态。

这就是您看到渐变警告的原因。

解决方案是:

  1. 你只是消耗输出状态

  2. 如果你想使用隐藏状态,那么也要使用单元状态。

    您可以通过多种方式做到这一点:

    a) h_and_c = concat(h,c)

    b) h_and_c_avg = avg(h,c)

    c) h_and_c_sum = sum(h,c)

注意我已经用Tensorflow Keras 双向 LSTM测试了这个(我没有只用 LSTM 检查过)

于 2020-10-29T07:08:06.983 回答
0

我想是的。您是否也可以尝试食用hidden states,然后观察您是否收到相同的警告?

于 2020-10-27T07:55:00.463 回答