首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Keras和TensorFlow实现LSTM网络

用Keras和TensorFlow实现LSTM网络
EN

Stack Overflow用户
提问于 2018-10-04 12:47:48
回答 1查看 2.6K关注 0票数 0

由于知识有限,我建立了一个LSTM网络。我想验证我的假设并更好地理解Keras。

网络代码:

代码语言:javascript
复制
#...
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个神经元。

我想要的激活是LeakyReLU。

问:

  1. 实施是否正确? 即:代码是否反映了我的计划?
  2. 在使用LeakyReLU时,应该在前一层添加线性激活吗? 即:我是否需要将activation='linear'添加到LSTM层?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-04 15:10:53

至于第一个问题:“正确”在什么意义上?也就是说,这取决于您正在建模的问题,因此需要提供更多的细节。

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

代码语言:javascript
复制
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'))

至于层数(根据图):有点模糊,但我认为有三个LSTM层,第一个层有4个单元,第二个层有8个单元,最后一个层有4个单元。至于最后一层,它似乎是一个密集的层。因此,模型将如下所示(假设LeakyReLU应用于LSTM层的输出):

代码语言:javascript
复制
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

至于使用LeakyReLU层:我想您是正确的,应该使用linear激活作为其上一层的激活(也像建议的这里那样,尽管在那里使用了Dense层)。这是因为在默认情况下,LSTM层的激活是双曲切线(即tanh),因此它将输出压缩到-1,1,我认为当您将LeakyReLU应用到这个范围时,这可能并不有效;但是,我不确定这一点,因为我不完全熟悉layer的实际使用和推荐用法。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52647115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档