2017-02-23 4 views
2

多階層のLSTMモデル(stateIsTuple = True)をPythonでビルドしてトレーニングし、C++でロードして使用したいと考えています。しかし、主に私が参照できる文字列名を持っていないため、C++で状態をフィードしフェッチする方法を考えるのは難しいです。テンソルフローC/C++でLSTMの状態を取得して取得する方法

など。

with tf.name_scope('rnn_input_state'): 
     self.initial_state = cell.zero_state(args.batch_size, tf.float32) 

などの名前付きスコープに初期状態を設定しましたが、これは以下のグラフに表示されますが、これらをC++でどのようにフィードできますか?

enter image description here

また、どのように私はC++での現在の状態を取得することができますか?私はpythonでグラフの構築コードを試しましたが、私はそれが正しいことであるかどうかはわかりません。なぜならlast_stateはテンソルのタプルでなければならないからです(テンソルボードのlast_stateノードは2x2x50x128、 2つのレイヤー、128のrnnサイズ、50のミニバッチサイズ、およびlstmセル - 2つの状態ベクトルを持つように、状態を連結したように聞こえます)。

with tf.name_scope('outputs'): 
     outputs, last_state = legacy_seq2seq.rnn_decoder(inputs, self.initial_state, cell, loop_function=loop if infer else None) 
     output = tf.reshape(tf.concat(outputs, 1), [-1, args.rnn_size], name='output') 

、これはそれが

enter image description here

私はCONCATと内と外出しか一つの状態テンソルがあるので、状態テンソルを分割すべきtensorboardにどのように見えるのですか?それとも良い方法がありますか?

P.S.理想的には、レイヤー(またはrnnサイズ)の数をハードコーディングする必要はありません。ですから、私は4つの文字列input_node_name、output_node_name、input_state_name、output_state_nameを持つことができ、残りはそこから派生しています。

答えて

3

私は、手動で状態を1つのテンソルに連結することによってこれを行うことができました。テンソルフローを使用して状態を処理する方法であるため、これが賢明なのかどうかはわかりませんが、現在は廃止され、タプル状態に切り替わります。 state_is_tuple = Falseを設定する代わりに、私のコードがまもなく時代遅れになる危険性を排除するために、追加の関数を追加して、1つのテンソルにステートを手動で積み重ね、アンスタックします。それは、PythonとC++の両方でうまくいきます。

キーコードは次のとおりです。誰もが https://github.com/memo/char-rnn-tensorflow

それを必要とする場合はここで

# setting up 
zero_state = cell.zero_state(batch_size, tf.float32) 
state_in = tf.identity(zero_state, name='state_in')   

# based on https://medium.com/@erikhallstrm/using-the-tensorflow-multilayered-lstm-api-f6e7da7bbe40#.zhg4zwteg 
state_per_layer_list = tf.unstack(state_in, axis=0) 
state_in_tuple = tuple(
    # TODO make this not hard-coded to LSTM 
    [tf.contrib.rnn.LSTMStateTuple(state_per_layer_list[idx][0], state_per_layer_list[idx][1]) 
    for idx in range(num_layers)] 
) 

outputs, state_out_tuple = legacy_seq2seq.rnn_decoder(inputs, state_in_tuple, cell, loop_function=loop if infer else None) 
state_out = tf.identity(state_out_tuple, name='state_out') 

# running (training or inference) 
state = sess.run('state_in:0') # zero state 

loop: 
    feed = {'data_in:0': x, 'state_in:0': state} 
    [y, state] = sess.run(['data_out:0', 'state_out:0'], feed) 

は完全なコードです

関連する問題