首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么要为tf.keras.layers.LSTM设置return_sequences=True和stateful=True?

问为什么要为tf.keras.layers.LSTM设置return_sequences=True和stateful=True?
EN

Stack Overflow用户
提问于 2019-03-22 16:56:18
回答 3查看 4.7K关注 0票数 8

我正在学习tensorflow2.0,并遵循tutorial。在rnn示例中,我找到了以下代码:

代码语言:javascript
复制
def build_model(vocab_size, embedding_dim, rnn_units, batch_size):
  model = tf.keras.Sequential([
    tf.keras.layers.Embedding(vocab_size, embedding_dim, 
                              batch_input_shape=[batch_size, None]),
    tf.keras.layers.LSTM(rnn_units, 
                        return_sequences=True, 
                        stateful=True, 
                        recurrent_initializer='glorot_uniform'),
    tf.keras.layers.Dense(vocab_size)
  ])
  return model

我的问题是:为什么代码设置了参数return_sequences=True和stateful=True?使用默认参数如何?

EN

回答 3

Stack Overflow用户

发布于 2019-03-22 19:06:18

本教程中的示例是关于文本生成的。这是批量输入到网络的输入:

(64,100,65) # (batch_size,sequence_length,vocab_size)

  1. return_sequences=True

由于意图是预测每个时间步的字符,即序列中的每个字符,因此需要预测下一个字符。

因此,将参数return_sequences=True设置为true,以获得(64,100,65)的输出形状。如果此参数设置为False,则只返回最后一个输出,因此对于64个字符的批次,输出将为(64,65),即对于每个100个字符的序列,将只返回最后预测的字符。

  1. stateful=True

在文档中,“如果为True,则批次中索引i处的每个样本的最后一个状态将用作下一批次中索引i的样本的初始状态。”

在本教程的下图中,您可以看到,通过提供先前预测的上下文,设置有状态有助于LSTM做出更好的预测。

​

​

票数 18
EN

Stack Overflow用户

发布于 2019-03-22 19:40:00

返回序列

让我们看一下使用LSTM构建的典型模型体系结构。

按顺序排序模型:

​

​

我们输入一系列输入(X),一次一批,每个LSTM单元返回一个输出(y_i)。因此,如果您的输入是batch_size x time_steps X input_size大小,那么LSTM输出将是batch_size X time_steps X output_size。这被称为序列到序列模型,因为输入序列被转换为输出序列。此模型的典型用法是在标记器中(POS标记器,NER标记器)。在keras中,这是通过设置return_sequences=True来实现的。

序列分类-多对一架构

​

​

在多对一架构中,我们仅使用最后一个LSTM信元的输出状态。这种架构通常用于分类问题,如预测电影评论(表示为单词序列)是否为-ve的+ve。在keras中,如果我们设置了return_sequences=False,那么模型只返回最后一个LSTM单元的输出状态。

有状态

一个LSTM单元由许多门组成,如下图所示,来自this blog post。前一单元的状态/门用于计算当前单元的状态。在keras中,如果为stateful=False,则在每次批处理后重置状态。如果为stateful=True,则索引i的前一批状态将用作下一批索引i的初始状态。因此,使用stateful=True在批处理之间传播状态信息。请查看此link,了解如何使用示例解释状态性的有用性。

​

​

票数 13
EN

Stack Overflow用户

发布于 2019-03-22 18:59:20

让我们看看在处理参数时的区别:

代码语言:javascript
复制
tf.keras.backend.clear_session()
tf.set_random_seed(42)
X = np.array([[[1,2,3],[4,5,6],[7,8,9]],[[1,2,3],[4,5,6],[0,0,0]]], dtype=np.float32)
model = tf.keras.Sequential([tf.keras.layers.LSTM(4, return_sequences=True, stateful=True, recurrent_initializer='glorot_uniform')])
print(tf.keras.backend.get_value(model(X)).shape)
# (2, 3, 4)
print(tf.keras.backend.get_value(model(X)))
# [[[-0.16141939  0.05600287  0.15932009  0.15656665]
#  [-0.10788933  0.          0.23865232  0.13983202]
   [-0.          0.          0.23865232  0.0057992 ]]

# [[-0.16141939  0.05600287  0.15932009  0.15656665]
#  [-0.10788933  0.          0.23865232  0.13983202]
#  [-0.07900514  0.07872108  0.06463861  0.29855606]]]

因此,如果return_sequences设置为True,模型将返回它预测的完整序列。

代码语言:javascript
复制
tf.keras.backend.clear_session()
tf.set_random_seed(42)
model = tf.keras.Sequential([
tf.keras.layers.LSTM(4, return_sequences=False, stateful=True, recurrent_initializer='glorot_uniform')])
print(tf.keras.backend.get_value(model(X)).shape)
# (2, 4)
print(tf.keras.backend.get_value(model(X)))
# [[-0.          0.          0.23865232  0.0057992 ]
#  [-0.07900514  0.07872108  0.06463861  0.29855606]]

因此,正如文档所述,如果将return_sequences设置为False,则模型仅返回最后一个输出。

至于stateful,它更难深入研究。但本质上,它所做的是当有多批输入时,batch i的最后一个单元格状态将是batch i+1的初始状态。但是,我认为使用默认设置会更好。​

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

https://stackoverflow.com/questions/55296013

复制
相关文章

相似问题

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