张量流中的RNN和LSTM实现

时间:2016-10-25 19:08:48

标签: tensorflow lstm

我一直在努力学习如何在张量流中编码RNN和LSTM。我在这个博客文章中找到了一个在线示例

http://r2rt.com/recurrent-neural-networks-in-tensorflow-ii.html

以下是我无法理解最终用于生成代码的LSTM网络的片段

    x = tf.placeholder(tf.int32, [batch_size, num_steps], name='input_placeholder')
    y = tf.placeholder(tf.int32, [batch_size, num_steps], name='labels_placeholder')

    embeddings = tf.get_variable('embedding_matrix', [num_classes, state_size])
    rnn_inputs = [tf.squeeze(i) for i in tf.split(1,
                            num_steps, tf.nn.embedding_lookup(embeddings, x))]

代码的不同部分现在定义权重

 with tf.variable_scope('softmax'):
         W = tf.get_variable('W', [state_size, num_classes])
         b = tf.get_variable('b', [num_classes], initializer=tf.constant_initializer(0.0))
 logits = [tf.matmul(rnn_output, W) + b for rnn_output in rnn_outputs]

 y_as_list = [tf.squeeze(i, squeeze_dims=[1]) for i in tf.split(1, num_steps, y)]

x是要输入的数据,y是标签集。在lstm方程中,我们有一系列门,x(t)乘以一系列,prev_hidden_​​state乘以一组权重,加上偏差并应用非线性。

以下是我的疑虑

  • 在这种情况下,只定义了一个权重矩阵 适用于x(t)和prev_hidden_​​state。
  • 对于嵌入矩阵,我知道它必须乘以 权重矩阵但为什么是第一维num_classes
  • 对于rnn_inputs,我们使用squeeze删除1的维度 但为什么我要用一个热编码来做呢。
  • 同样从分裂我明白我们正在展开x 维度(batch_size X num_steps)为离散(batch_size X 1) 向量,然后通过网络传递这些值是这个 右

1 个答案:

答案 0 :(得分:0)

我可以帮你。

在这种情况下,只定义了一个权重矩阵,这意味着它也适用于x(t)和prev_hidden_​​state。

调用tf.nn.rnn_cell.LSTMCell时有更多权重。它们是RNN单元格的内部权重,当您调用单元格时,张量流会隐式地创建它。

您明确定义的权重矩阵是从隐藏状态到词汇空间的转换。

您可以查看计算重复部分的隐式权重,采用先前的隐藏状态和当前输入并输出新的隐藏状态。你定义的权重矩阵将隐藏状态(即state_size = 200)转换为更高的词汇空间。(即vocab_size = 2000

有关详细信息,您可以查看本教程:http://colah.github.io/posts/2015-08-Understanding-LSTMs/

对于嵌入矩阵,我知道它必须乘以权重矩阵但为什么是第一个维度num_classes

num_classes考虑vocab_size,嵌入矩阵正在将词汇表转换为所需的嵌入大小(在此示例中等于state_size)。

对于rnn_inputs,我们使用squeeze删除1的维度,但为什么我要在单热编码中这样做。

您需要摆脱额外维度,因为tf.nn.rnn将输入视为(batch_size, input_size)而不是(batch_size, 1, input_size)

同样从分裂中我理解我们将维度x(batch_size X num_steps)展开为离散(batch_size X 1)向量,然后通过网络传递这些值是对的吗?

嵌入后更精确。 (batch_size, num_steps, state_size)变成num_step个元素列表,每个元素的大小为(batch_size, 1, state_size)

流程如下:

  1. 嵌入矩阵将每个单词嵌入为state_size维度向量(矩阵的一行),大小为(vocab_size, state_size)
  2. 检索x占位符指定的索引并获取rnn输入,其大小为(batch_size, num_steps, state_size)
  3. tf.split将输入拆分为(batch_size, 1, state_size)
  4. tf.squeeze将它们平铺到(batch_size, state_size),形成tf.nn.rnn所需的输入格式。
  5. 如果tensorflow方法有任何问题,也许您可​​以在tensorflow API中搜索它们以获得更详细的介绍。

相关问题