2017-06-22 15 views
2

私の理解では、tf.nn.dynamic_rnnは、各タイムステップおよび最終状態でRNNセル(例:LSTM)の出力を返します。最後のものだけでなく、どのようにすべての時間ステップでセル状態にアクセスできますか?たとえば、すべての隠れた状態を平均して、それを後続のレイヤーで使用できるようにしたいとします。Tensorflow、最後の状態だけでなく、RNNのすべての中間状態にアクセスする方法

以下は、LSTMセルを定義し、tf.nn.dynamic_rnnを使用してそれを展開する方法です。しかし、これはLSTMの最後のセル状態を与えるだけです。

import tensorflow as tf 
import numpy as np 

# [batch-size, sequence-length, dimensions] 
X = np.random.randn(2, 10, 8) 
X[1,6:] = 0 
X_lengths = [10, 6] 

cell = tf.contrib.rnn.LSTMCell(num_units=64, state_is_tuple=True) 

outputs, last_state = tf.nn.dynamic_rnn(
    cell=cell, 
    dtype=tf.float64, 
    sequence_length=X_lengths, 
    inputs=X) 
sess = tf.InteractiveSession() 
sess.run(tf.global_variables_initializer())         
out, last = sess.run([outputs, last_state], feed_dict=None) 
+0

出力の一部ではない内部状態にアクセスする必要はありません。これがあなたのユースケースであれば、私はLSTMと同じRNNを定義しようとしますが、その完全な状態を出力します。 – jasekp

+0

このQAをご覧ください:https://stackoverflow.com/q/39716241/4282745 – npf

+0

またはhttps://github.com/tensorflow/tensorflow/issues/5731#issuecomment-262151359 – npf

答えて

1

何かが動作するはずです。

import tensorflow as tf 
import numpy as np 


class CustomRNN(tf.contrib.rnn.LSTMCell): 
    def __init__(self, *args, **kwargs): 
     kwargs['state_is_tuple'] = False # force the use of a concatenated state. 
     returns = super(CustomRNN, self).__init__(*args, **kwargs) # create an lstm cell 
     self._output_size = self._state_size # change the output size to the state size 
     return returns 
    def __call__(self, inputs, state): 
     output, next_state = super(CustomRNN, self).__call__(inputs, state) 
     return next_state, next_state # return two copies of the state, instead of the output and the state 

X = np.random.randn(2, 10, 8) 
X[1,6:] = 0 
X_lengths = [10, 10] 

cell = CustomRNN(num_units=64) 

outputs, last_states = tf.nn.dynamic_rnn(
    cell=cell, 
    dtype=tf.float64, 
    sequence_length=X_lengths, 
    inputs=X) 

sess = tf.InteractiveSession() 
sess.run(tf.global_variables_initializer())         
states, last_state = sess.run([outputs, last_states], feed_dict=None) 

これは、任意の数のタプル状態を格納できるかどうかわからないため、連結状態を使用します。状態変数の形状は(batch_size、max_time_size、state_size)です。

+0

このCustomRNNコードが中間の状態をどのように返すかについて少し詳しく説明できますか?あなたのコードを理解しようとしています! – CentAu

+1

LSTM状態は、出力(m)と隠れ状態(c)の組み合わせです。このコードは、出力(m)を取り込み、それを連結状態(c + m)に置き換えます。バッチサイズを無視すると、出力は[m1、m2、...]の代わりに[(c1 + m1)、(c2 + m2)、...]のリストになります。 – jasekp

+0

これは、実際の出力(m)を隠し状態(c)、右( 'return m、new_state'ではなく' return next_state、next_state')に置き換えますか?出力と非表示の状態( 'm + c')をどこで連結していますか? – CentAu

1

私はこのthread(私からハイライト)にあなたを指すようになります。

あなたは両方のCが必要な場合は、出力の一部として両方の状態のテンソルを返すLSTMCellの変形を書くことができます時間ステップごとにh状態を示す。 hの状態が必要な場合は、各時間ステップの出力はです。

@jasekpがコメントに書いたとおり、出力は実際にはhの状態の一部です。その後dynamic_rnn方法は、単に時間にわたるすべてのh一部をスタックします(this file_dynamic_rnn_loopの文字列のドキュメントを参照してください):このような

def _dynamic_rnn_loop(cell, 
         inputs, 
         initial_state, 
         parallel_iterations, 
         swap_memory, 
         sequence_length=None, 
         dtype=None): 
    """Internal implementation of Dynamic RNN. 
    [...] 
    Returns: 
    Tuple `(final_outputs, final_state)`. 
    final_outputs: 
     A `Tensor` of shape `[time, batch_size, cell.output_size]`. If 
     `cell.output_size` is a (possibly nested) tuple of ints or `TensorShape` 
     objects, then this returns a (possibly nsted) tuple of Tensors matching 
     the corresponding shapes. 
+0

LSTMCellは1つのセルです私が間違っていなければ状態と出力の両方を返します。私は、 'tf.nn.dynamic_rnn'によるアンロール部分は最後のステップを返してくれると思います。だから、私はそれを変更する必要がありますか?これにはまだ高いレベルの解決策がないのは不思議です。 – CentAu

関連する問題