代码之家  ›  专栏  ›  技术社区  ›  Shlomi Schwartz

python—使用Keras和TensorFlow实现LSTM网络

  •  0
  • Shlomi Schwartz  · 技术社区  · 6 年前

    凭借有限的知识,我建立了一个LSTM网络。我想验证我的假设,更好地理解kerasapi。

    网络代码:

    #...
    model.add(LSTM(8, batch_input_shape=(None, 100, 4), return_sequences=True))
    model.add(LeakyReLU())
    model.add(LSTM(4, return_sequences=True))
    model.add(LeakyReLU())
    model.add(LSTM(1, return_sequences=False, activation='softmax'))
    #...
    

    我试着建立一个有4个特征输入,2个隐藏层的网络:第一个有8个神经元,第二个有4个神经元,输出层有1个神经元。

    enter image description here

    我想要的激活是利基雷卢。

    1. 实施是否正确?
    2. 使用LeakyReLU时,我应该在前一层上添加线性激活吗?
      i、 e:我需要补充吗 activation='linear' 到LSTM层?
    1 回复  |  直到 6 年前
        1
  •  4
  •   today    6 年前

    至于第一个问题:“正确”在什么意义上?i、 e.这取决于你建模的问题,因此需要提供更多细节。

    softmax 当最后一层只有一个输出单元时,不用作激活函数。这是因为softmax将输出标准化,使其元素之和为1,即类似于概率分布。因此,如果在只有一个输出单元的层上使用它,它的输出总是1 linear sigmoid (在二进制分类的情况下)使用。此外,通常 Dense 层作为最后一层,作为最终的回归或分类器。例如:

    model.add(LSTM(8, batch_input_shape=(None, 100, 4), return_sequences=True))
    model.add(LeakyReLU())
    model.add(LSTM(4, return_sequences=True))
    model.add(LeakyReLU())
    model.add(LSTM(1, return_sequences=False))
    model.add(Dense(1, activation='sigmoid'))
    

    LeakyReLU 应用于LSTM层的输出):

    model.add(LSTM(4, batch_input_shape=(None, 100, 4), return_sequences=True))
    model.add(LeakyReLU())
    model.add(LSTM(8, return_sequences=True))
    model.add(LeakyReLU())
    model.add(LSTM(4, return_sequences=False))
    model.add(Dense(1, activation='sigmoid')) # or activation='linear' if it is a regression problem
    

    至于使用 利基雷卢 我想你是对的 激活应作为其前一层的激活(也建议 here ,虽然 层已在那里使用)。这是因为默认情况下,LSTM层的激活是双曲正切的(即。 tanh )因此,它会将输出压缩到[-1,1]范围,我认为在应用时可能没有效率 在它上面;然而,我不确定这一点,因为我不完全熟悉leaky relu的实用和推荐用法。