web-dev-qa-db-ja.com

TensorflowのRNNのLSTMStateTupleとcell.zero_state()

RNNのTensorflowで初期状態テンソルを使用する正しい方法が何なのか混乱しています。 LSTMStateTuple または cell.zero_state を使用するチュートリアル間でほぼ50/50の分割があります。

2つは同じですか?もしそうなら、なぜ2つの方法があるのですか?

1つの例では_tf.nn.rnn_cell.LSTMStateTuple_を使用して初期状態を設定し、もう1つの例ではcell.zero_state()を使用します。

なぜ2つの方法があるのですか?どちらを好むのですか? _state_is_Tuple_を設定するときにのみLSTMStateTupleを使用できますか?その場合、cell.zero_state()は機能しなくなりますか?

12
user3139545

2つは異なるものです。 LSTMセルの状態はタプルであるため、_state_is_Tuple_はLSTMセルで使用されます。 _cell.zero_state_は、すべてのRNNセルの状態の初期化子です。

_cell.zero_state_がtrueかどうかに応じて必要な状態クラスを初期化するため、通常は_state_is_Tuple_関数を優先します。

_cell.zero_state_が推奨されている this GitHubの問題-「セルオブジェクトでzero_state関数を使用する」を参照してください。

_cell.zero_state_が必要になるもう1つの理由は、セルのタイプ(LSTM、GRU、RNN)に依存せず、次のようなことができるためです。

_if type == 'GRU':
   cell = BasicGRUCell
else:
   cell = BasicLSTMCell(state_is_Tuple=True)

init_state = cell.zero_state(batch_size)
_

初期状態はOKです。

LSTMStateTupleは、タプルとしての状態を持つセルでのみ機能します。

LSTMStateTupleを使用する場合

(トレーナーから渡された)カスタム値を使用して状態を初期化する場合は、LSTMStateTupleを使用する必要があります。 cell.zero_state()は、すべての値が0.0に等しい状態を返します。

バッチ間で状態を保持したい場合は、各バッチの後で取得して、次のバッチの_feed_dict_に追加する必要があります。

LSTM状態がタプルである理由の説明については this を参照してください。

9
Mihail Burduja