对于LSTM变量,出现错误“ tensorflow:变量不存在渐变”

问题描述

嗨,我有一个双向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的隐藏状态(而不是单元状态)

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

警告:tensorflow :(后退层)变量的渐变不存在:

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

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

解决方法

好的,我终于可以解决此警告。

要找出问题所在,这有点棘手。

所以基本上发生了什么事

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)对此进行过测试

,

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