【发布时间】:2019-07-30 20:11:46
【问题描述】:
上下文
我正在阅读Hands on ML 的第二部分,并正在寻找关于在 RNN 的损失计算中何时使用“输出”以及何时使用“状态”的一些明确说明。
在书中(有书的人第 396 页),作者说,“请注意,全连接层连接到 states 张量,其中仅包含 RNN 的最终状态,”指到展开超过 28 个步骤的序列分类器。由于states 变量将具有len(states) == <number_of_hidden_layers>,因此在构建深度 RNN 时,我一直使用 states[-1] 仅连接到最后一层的最终状态。例如:
# hidden_layer_architecture = list of ints defining n_neurons in each layer
# example: hidden_layer_architecture = [100 for _ in range(5)]
layers = []
for layer_id, n_neurons in enumerate(hidden_layer_architecture):
hidden_layer = tf.contrib.rnn.BasicRNNCell(n_neurons,
activation=tf.nn.tanh,
name=f'hidden_layer_{layer_id}')
layers.append(hidden_layer)
recurrent_hidden_layers = tf.contrib.rnn.MultiRNNCell(layers)
outputs, states = tf.nn.dynamic_rnn(recurrent_hidden_layers,
X_, dtype=tf.float32)
logits = tf.layers.dense(states[-1], n_outputs, name='outputs')
考虑到作者之前的陈述,这可以正常工作。但是,我不明白什么时候会使用outputs 变量(tf.nn.dynamic_rnn() 的第一个输出)
我看过this question,它在回答细节方面做得很好,并提到,“如果你只对单元格的最后一个输出感兴趣,你可以切分时间维度来选择最后一个元素(例如outputs[:, -1, :])。”我推断这意味着类似于states[-1] == outputs[:, -1, :],在测试时它是错误的。为什么不是这样呢?如果输出是每个时间步的单元格的输出,为什么不是这种情况?一般...
问题
什么时候在损失函数中使用tf.nn.dynamic_rnn() 中的outputs 变量,什么时候使用states 变量?这如何改变网络的抽象架构?
任何澄清将不胜感激。
【问题讨论】:
-
仅供参考:在 cmets 中“标记”某人无济于事。
标签: python tensorflow machine-learning neural-network