首页 文章

张量流中的RNN和LSTM实现

提问于
浏览
2

我一直在努力学习如何在张量流中编码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

    我可以帮你吗 .

    在这种情况下,只定义了一个权重矩阵,这意味着它同样适用于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) .

    流程如下:

    • 嵌入矩阵将每个单词嵌入为 state_size 维度向量(矩阵的一行),大小为 (vocab_size, state_size) .

    • 检索x占位符指定的索引并获取rnn输入,其大小为 (batch_size, num_steps, state_size) .

    • tf.split 将输入拆分为 (batch_size, 1, state_size)

    • tf.squeeze sqeeze to (batch_size, state_size) ,为 tf.nn.rnn 形成所需的输入格式 .

    如果tensorflow方法有任何问题,也许您可以在tensorflow API中搜索它们以获得更详细的介绍 .

相关问题