首页 > 解决方案 > 如何在 LSTMCell 中应用层归一化

问题描述

想在使用tf.compat.v1.nn.rnn_cell.LSTMCell.

有一个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

标签: tensorflowlstmtensorflow2.0tf.kerasbatch-normalization

解决方案


这取决于您是要在单元级别还是在层级别应用归一化 - 我不确定哪一个是正确的方法 - 论文没有指定它。是一个较旧的实现,您可能会使用它来获得灵感。

要在单元级别进行规范化,您可能需要创建一个自定义 RNNCell并在那里实现规范化。

PS 你也可以将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())

推荐阅读