如何在LSTMCell中应用层归一化

时间:2019-12-17 07:06:06

标签: tensorflow lstm tensorflow2.0 tf.keras batch-normalization

我想在使用tf.compat.v1.nn.rnn_cell.LSTMCell时将Layer Normalisation应用于递归神经网络。

有一个LayerNormalization类,但是我应该如何在LSTMCell中应用它。 我使用tf.compat.v1.nn.rnn_cell.LSTMCell是因为我想使用投影层。在这种情况下,我应该如何实现规范化。

class LM(tf.keras.Model):
  def __init__(self, hidden_size=2048, num_layers=2):
    super(LM, self).__init__()
    self.hidden_size = hidden_size
    self.num_layers = num_layers
    self.lstm_layers = []
    self.proj_dim = 640
    for i in range(self.num_layers):
        name1 = 'lm_lstm'+str(i)
        self.cell = tf.compat.v1.nn.rnn_cell.LSTMCell(2048, num_proj=640)
        self.lstm_layers.append(tf.keras.layers.RNN(self.cell, return_sequences=True, name=name1))

  def call(self, x):
    for i in range(self.num_layers):
      output = self.lstm_layers[i](x)
      x = output
    state_h = ""
    return x, state_h

1 个答案:

答案 0 :(得分:0)

这取决于您是要在单元级还是在层级应用规范化-我不确定哪种规范化是正确的方法-本文未指定规范化。 Here是您可以用来启发灵感的较旧的实现。

要在单元格级别进行规范化,您可能需要创建一个custom RNNCell并在那里进行规范化。

P.S。您可能还可以将LayerNormalization应用于RNN的输出,例如如下所示,但是您需要仔细考虑它是否具有所需的效果,尤其是考虑到序列模型固有的可变形状时。

self.lstm_layers.append(tf.keras.layers.RNN(self.cell, return_sequences=True, name=name1))
self.lstm_layers.append(tf.keras.layers.LayerNormalization())