tensorflow中RNN和LSTM的实现

tensorflow中RNN和LSTM的实现,tensorflow,lstm,Tensorflow,Lstm,我一直在努力学习如何在tensorflow中编写RNN和LSTM。我在这篇博文的网上找到了一个例子 下面是我在理解最终用于字符rnn生成的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'

我一直在努力学习如何在tensorflow中编写RNN和LSTM。我在这篇博文的网上找到了一个例子

下面是我在理解最终用于字符rnn生成的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))]
现在代码的不同部分定义了权重 x是要输入的数据,y是标签集。在lstm方程中,我们有一系列的门,x(t)乘以一系列,上一个隐藏状态乘以一组权重,添加偏差,应用非线性

以下是我的疑问
  • 在这种情况下,只定义了一个权重矩阵,这是否意味着 适用于x(t)和上一个隐藏状态
  • 对于嵌入矩阵,我知道它必须乘以 权重矩阵但为什么第一维度是num_类
  • 对于rnn_输入,我们使用的是去除1维的挤压 但我为什么要在一个热编码中这样做呢
  • 同样从拆分中,我了解到我们正在展开 将维度(批次大小X数量步数)分为离散维度(批次大小X 1) 向量,然后通过网络传递这些值 对
    • 我能为您效劳吗

      在这种情况下,只定义了一个权重矩阵,这是否意味着它也适用于x(t)和prev_hidden_状态。 当您调用
      tf.nn.rnn\u cell.LSTMCell
      时,会有更多权重。它们是RNN单元的内部权重,tensorflow在调用该单元时隐式创建了它

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

      您可以查看重复零件的隐式权重,采用以前的隐藏状态和当前输入,并输出新的隐藏状态。您定义的权重矩阵将隐藏状态(即
      state\u size=200
      )转换为更高的词汇空间(即
      vocab\u size=2000

      有关更多信息,您可以查看本教程:

      对于嵌入矩阵,我知道它必须乘以权重矩阵,但为什么第一维度是num_类 num_类说明了
      vocab_大小
      ,嵌入矩阵将词汇表转换为所需的嵌入大小(在本例中等于
      状态_大小

      对于rnn_输入,我们使用的是压缩,它去除了1的维数,但为什么我要在一个热编码中这样做呢。 您需要去掉额外的维度,因为
      tf.nn.rnn
      将输入作为
      (批大小,输入大小)
      而不是
      (批大小,1,输入大小)

      同样从拆分中,我了解到我们正在将维度的x(批次大小x数量步数)展开为离散(批次大小x 1)向量,然后通过网络传递这些值,对吗? 更精确,在嵌入之后<代码>(批次大小,数量步数,状态大小)变成一个
      num步数
      元素列表,每个元素的大小
      (批次大小,1,状态大小)

      流程如下所示:
    • 嵌入矩阵将每个单词嵌入为
      state\u size
      维度向量(矩阵的一行),使大小
      (vocab\u size,state\u size)
    • 检索由x占位符指定的索引并获取rnn输入,即大小
      (批大小、步骤数、状态大小)
    • tf.split
      将输入拆分为
      (批次大小,1,状态大小)
    • tf.squeeze
      squeeze它们到
      (批大小、状态大小)
      ,形成
      tf.nn.rnn
      所需的输入格式
    • 如果tensorflow方法有任何问题,您可以在tensorflow API中搜索它们以获得更详细的介绍

       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)]