Tensorflow的dynamic_rnn返回隐藏状态与最终状态

时间:2018-04-22 18:28:45

标签: python tensorflow recurrent-neural-network

tensorflow.nn.dynamic_rnn创建一个给定.ts的递归神经网络,它是cell的一个实例,并返回一对由以下内容组成的对:

  • RNNCell:RNN输出Tensor
  • outputs:最终状态

这是一个玩具反复神经网络及其输出[*]:

state

输出:

import numpy as np
import tensorflow as tf

dim = 3
hidden = 4

lengths = tf.placeholder(dtype=tf.int32, shape=[None])
inputs = tf.placeholder(dtype=tf.float32, shape=[None, None, dim])
cell = tf.nn.rnn_cell.LSTMCell(hidden, state_is_tuple=True)
output, final_state = tf.nn.dynamic_rnn(
          cell, inputs, lengths, dtype=tf.float32)

inputs_ = np.asarray([[[0, 0, 0], [1, 1, 1], [2, 2, 2]],
                     [[6, 6, 6], [7, 7, 7], [8, 8, 8]],
                     [[9,9,9], [10,10,10], [11,11,11]]],                                          
                     dtype=np.int32)

lengths_ = np.asarray([3, 1, 2], dtype=np.int32)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    output_, final_state_ = sess.run(
        [output, final_state],
        {inputs: inputs_, lengths: lengths_})

    print('hidden states:')
    print(output_)

    print('final state :')
    print(final_state_)

我的理解如下:

  • 隐藏状态对应于批次中每个序列的每个时间步长的LSTM单元格的输出;
  • 最终状态包含每个序列(hidden states: [[[ 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00] [-3.0096283e-02 1.6747195e-01 2.3113856e-02 -4.5677904e-02] [-6.0795926e-02 3.5036778e-01 6.0140129e-02 -1.6039203e-01]] [[-2.1957003e-03 8.1749000e-02 1.2620161e-02 -2.8342882e-01] [ 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00] [ 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00]] [[-1.7376180e-04 2.7789388e-02 3.1011081e-03 -3.5858861e-01] [-2.5059914e-04 4.5771234e-02 4.5708413e-03 -6.5035087e-01] [ 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00]]] final state : LSTMStateTuple( c=array([[-1.0705842e-01, 5.2945197e-01, 1.5602852e-01, -2.5641304e-01], [-3.3140955e-03, 8.6112522e-02, 7.2794281e-02, -3.6088336e-01], [-3.4701003e-04, 4.6147645e-02, 6.7321308e-02, -8.6465287e-01]], dtype=float32), h=array([[-6.0795926e-02, 3.5036778e-01, 6.0140129e-02, -1.6039203e-01], [-2.1957003e-03, 8.1749000e-02, 1.2620161e-02, -2.8342882e-01], [-2.5059914e-04, 4.5771234e-02, 4.5708413e-03, -6.5035087e-01]], dtype=float32)) 组件)的最后一个单元格状态以及每个序列的最后隐藏状态(c组件);

因此,我不应该在结局状态的h分量和每个序列的最后隐藏状态中获得相同的值吗?

[*]代码很大程度上受到this post

的启发

0 个答案:

没有答案