【问题标题】:How to create a RNN that is recursive within a mini-batch?如何在小批量中创建递归的 RNN?
【发布时间】:2017-10-08 10:49:13
【问题描述】:

我在 TensorFlow 中构建了一个图表,分为两部分:

  • 第 1 部分采用长度为 N 的列表并将其转换为 M 个连续窗口,这些窗口构成了我的小批量。最小示例:输入 [a,b,c,d,e,f] 变为 [[a,b,c],[b,c,d],[c,d,e],[d,e,f] ]
  • 第 2 部分对每个窗口进行操作,因此 [[a,b,c],[b,c,d],[c,d,e],[d,e,f]] 变为 [x1,x2, x3,x4]。

这里没有问题。

我想通过让第二部分使用前一个窗口的输出来计算其输出来将此图转换为递归图,如下所示: 第 2 部分采用 [a,b,c] 和默认 x0 生成 x1,然后 [[b,c,d], x1] 输出 x2,然后 [[c,d,e], x2] 输出 x3 和以此类推。

我如何做到这一点?

【问题讨论】:

    标签: python tensorflow recurrent-neural-network


    【解决方案1】:

    如果您要将每个 3 字母数组视为输入步骤,即:

    step 1: [abc]
    step 2: [bcd]
    step 3: [cde]
    

    隐藏状态会通过每个时间步进行传播,隐藏状态与输出相同,因此您无需担心。


    import tensorflow as tf
    import numpy as np
    
    sess = tf.InteractiveSession()
    
    def lstm_cell(hidden_size):
        return tf.contrib.rnn.BasicLSTMCell(num_units = hidden_size)
    
    in_seqlen = 3
    input_dim = 3
    
    x = tf.placeholder("float", [None, in_seqlen, input_dim])
    
    out, state = tf.nn.dynamic_rnn(lstm_cell(input_dim), x, dtype=tf.float32)
    

    ...

    sess.run(tf.global_variables_initializer())
    output, states = sess.run([out, state], feed_dict={x:[[[1,2,3],[2,3,4],[3,4,5]]]})
    

    如果你的意思是把每一个都当作一个序列,即:

    step 1: a,x0
    step 2: b,x0
    step 3: c,x0
    output: x1
    
    step 1: b,x1
    step 2: c,x1
    step 3: d,x1
    output: x2
    
    etc...
    

    然后您需要在每次运行会话时将最后一个状态作为输入提供给会话:

    ...
    
    in_seqlen = 3
    input_dim = 1
    hidden_dim = input_dim
    
    x = tf.placeholder(tf.float32, [None, in_seqlen, input_dim])
    s = tf.placeholder(tf.float32, [2, None, hidden_dim])
    
    state_tuple = tf.nn.rnn_cell.LSTMStateTuple(s[0], s[1])
    out, state = tf.nn.dynamic_rnn(lstm_cell(hidden_dim), x, initial_state=state_tuple, dtype=tf.float32)
    

    ...

    sess.run(tf.global_variables_initializer())
    
    batch_size = 1
    init_state = np.zeros((2, batch_size, hidden_dim))
    
    output, states = sess.run([out, state], feed_dict={x:[[[1],[2],[3]]], s:init_state})
    #feed state of previous run
    output, states = sess.run([out, state], feed_dict={x:[[[1],[2],[3]]], s:states})
    

    您需要添加目标占位符、损失等。

    有用: TensorFlow: Remember LSTM state for next batch (stateful LSTM) http://colah.github.io/posts/2015-08-Understanding-LSTMs/

    【讨论】:

    • 我不确定我是否理解。我的情况是您提到的第一个,即输入是完整数组(例如)[b,c,d] 和上一步的输出 x1。但是我应该把从 [b,c,d] 和 x1 计算 x2 的图贴在哪里呢? (我已经有了,减去接受 x1 的小修改)
    • 如果您查看 LSTM 或 GRU 的结构,它已经在执行您在单元格内尝试执行的操作。完全没有必要将输出反馈回输入。我真的建议您阅读我发布的第二个链接以了解我的意思。
    • 好的,我正在阅读它(目前我的困惑是因为我已经想到了一个循环结构,我想知道是否以及如何实现它)。
    • 这并不能解决我的问题,或者我仍然不知道如何解决。处理(比如说)[b,c,d] 的图的第二部分非常复杂(它进行卷积、张量形状操作等)。我在哪里告诉 TF 递归地使用 that 图?
    • 如果您正在这样做,请查看 raw_rnn,您可以在其中定义自己的自定义循环函数 tensorflow.org/api_docs/python/tf/nn/raw_rnn
    猜你喜欢
    • 2019-03-22
    • 1970-01-01
    • 2012-06-03
    • 2021-01-13
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 2020-09-20
    • 2012-10-08
    相关资源
    最近更新 更多