我正在学习tensorflow2.0,并遵循tutorial。在rnn示例中,我找到了以下代码:
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?使用默认参数如何?
发布于 2019-03-22 19:06:18
本教程中的示例是关于文本生成的。这是批量输入到网络的输入:
(64,100,65) # (batch_size,sequence_length,vocab_size)
return_sequences=True由于意图是预测每个时间步的字符,即序列中的每个字符,因此需要预测下一个字符。
因此,将参数return_sequences=True设置为true,以获得(64,100,65)的输出形状。如果此参数设置为False,则只返回最后一个输出,因此对于64个字符的批次,输出将为(64,65),即对于每个100个字符的序列,将只返回最后预测的字符。
stateful=True在文档中,“如果为True,则批次中索引i处的每个样本的最后一个状态将用作下一批次中索引i的样本的初始状态。”
在本教程的下图中,您可以看到,通过提供先前预测的上下文,设置有状态有助于LSTM做出更好的预测。

发布于 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,了解如何使用示例解释状态性的有用性。

发布于 2019-03-22 18:59:20
让我们看看在处理参数时的区别:
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,模型将返回它预测的完整序列。
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的初始状态。但是,我认为使用默认设置会更好。
https://stackoverflow.com/questions/55296013
复制相似问题