tid*_*idy 8 lstm keras tensorflow recurrent-neural-network
我正在学习 tensorflow2.0 并按照教程进行操作。在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
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么代码设置了参数return_sequences=True和stateful=True?如何使用默认参数?
Man*_*han 17
本教程中的示例是关于文本生成的。这是批量输入网络的输入:
(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从文档中, “如果为真,批次中索引 i 处每个样本的最后状态将用作下一批中索引 i 样本的初始状态。”
在本教程的下图中,您可以看到设置有状态通过提供先前预测的上下文来帮助 LSTM 做出更好的预测。
muj*_*iga 13
让我们看一下使用 LSTM 构建的典型模型架构。
我们输入一系列输入 (x),一次一批,每个 LSTM 单元返回一个输出 (y_i)。因此,如果您的输入大小,batch_size x time_steps X input_size那么 LSTM 输出将为batch_size X time_steps X output_size. 这被称为序列到序列模型,因为输入序列被转换为输出序列。该模型的典型用法是在标注器(POS tagger,NER Tagger)中。在 keras 中,这是通过设置return_sequences=True.
在多对一架构中,我们使用最后一个 LSTM 单元的输出状态。这种架构通常用于分类问题,例如预测电影评论(表示为单词序列)是否为 +ve of -ve。在 keras 中,如果我们设置return_sequences=False模型只返回最后一个 LSTM 单元的输出状态。
一个LSTM细胞是由许多盖茨在展会从下图的这个博客帖子。前一个单元的状态/门用于计算当前单元的状态。在 keras 中,如果stateful=False然后在每批之后重置状态。如果stateful=True上一批索引的状态i将用作i下一批索引的初始状态。因此状态信息在批次之间传播stateful=True。检查此链接以通过示例解释有状态的有用性。
让我们看看处理参数时的差异:
\n\ntf.keras.backend.clear_session()\ntf.set_random_seed(42)\nX = np.array([[[1,2,3],[4,5,6],[7,8,9]],[[1,2,3],[4,5,6],[0,0,0]]], dtype=np.float32)\nmodel = tf.keras.Sequential([tf.keras.layers.LSTM(4, return_sequences=True, stateful=True, recurrent_initializer='glorot_uniform')])\nprint(tf.keras.backend.get_value(model(X)).shape)\n# (2, 3, 4)\nprint(tf.keras.backend.get_value(model(X)))\n# [[[-0.16141939 0.05600287 0.15932009 0.15656665]\n# [-0.10788933 0. 0.23865232 0.13983202]\n [-0. 0. 0.23865232 0.0057992 ]]\n\n# [[-0.16141939 0.05600287 0.15932009 0.15656665]\n# [-0.10788933 0. 0.23865232 0.13983202]\n# [-0.07900514 0.07872108 0.06463861 0.29855606]]]\nRun Code Online (Sandbox Code Playgroud)\n\n所以,如果return_sequences设置为True模型,则返回其预测的完整序列。
tf.keras.backend.clear_session()\ntf.set_random_seed(42)\nmodel = tf.keras.Sequential([\ntf.keras.layers.LSTM(4, return_sequences=False, stateful=True, recurrent_initializer='glorot_uniform')])\nprint(tf.keras.backend.get_value(model(X)).shape)\n# (2, 4)\nprint(tf.keras.backend.get_value(model(X)))\n# [[-0. 0. 0.23865232 0.0057992 ]\n# [-0.07900514 0.07872108 0.06463861 0.29855606]]\nRun Code Online (Sandbox Code Playgroud)\n\n因此,正如文档所述,如果return_sequences设置为False,则模型仅返回最后的输出。
至于stateful深入起来就有点困难了。但本质上,它的作用是当有多个批次的输入时,批次的最后一个单元状态i将是批次的初始状态i+1。不过,我认为您使用默认设置就可以了。\n\xe2\x80\x8b