2017-10-05 3 views
1

出力状態を取得し、次のRUN()で持続するように割り当てる方法があります。同様の方法でこの状態のINITを注入することもできます。これは "state_is_tuple = False"でうまくいきます。私は警告を受け取るようになっているので、TensorFlowが動いている "state_is_tuple = True"設定に移行しようとしました。tf.Assign()を使用してLSTMStateTuple()を割り当てるにはどうすればよいですか?

 self.initiate_state = self.cell_L1.zero_state(batch_size, tf.float32) 

     self.state = tf.Variable(self.initiate_state, trainable=False) 

     with tf.control_dependencies([self.state.assign(self.initiate_state)]): 
      self.initiate_state_op = tf.no_op(name="initiate_state") 

     output, self.new_state = tf.nn.dynamic_rnn(self.cell_L1,hidden_input,time_major=True,\ 
       initial_state=self.state, dtype=tf.float32, swap_memory=True) 

     with tf.control_dependencies([self.state.assign(self.new_state)]): 
      outputs = tf.identity(output) 

     outputs   = tf.reshape(outputs, [-1,self.hidden_state_size]) 

私は「を割り当てる()」OPでいくつかの異なる構成を試してみましたが、それはタプルであると、それは同じように動作するように見えることはできません。もちろん、assign()がTuplesをサポートしていれば素晴らしいだろうが、それが起こるまで、私はこの同じタスクをどのように達成するだろうか?

答えて

1

LSTMStateTupleには2つの部分、つまりcとhが含まれているため、別々に割り当てる必要があります。例:

In [108]: c = tf.Variable([[1, 1, 1, 2, 2, 2], [3, 3, 3, 4, 4, 4]])                                                                         

In [110]: h = tf.Variable([[5, 5, 5, 6, 6, 6], [7, 7, 7, 8, 8, 8]])                                     

In [111]: c_new = tf.Variable([[11, 11, 11, 22, 22, 22], [33, 33, 33, 44, 44, 44]])                                 

In [112]: h_new = tf.Variable([[55, 55, 55, 66, 66, 66], [77, 77, 77, 88, 88, 88]])                                 

In [113]: init = tf.initialize_all_variables()                                          
WARNING:tensorflow:From /usr/local/lib/python2.7/dist-packages/tensorflow/python/util/tf_should_use.py:175: initialize_all_variables (from tensorflow.python.ops.variables) is deprecated and will be removed after 2017-03-02. 
Instructions for updating: 
Use `tf.global_variables_initializer` instead. 

In [114]: ch = tf.contrib.rnn.LSTMStateTuple(c, h)                                         

In [115]: sess.run(init) 

In [116]: sess.run(ch) 
Out[116]: 
LSTMStateTuple(c=array([[1, 1, 1, 2, 2, 2], 
     [3, 3, 3, 4, 4, 4]], dtype=int32), h=array([[5, 5, 5, 6, 6, 6], 
     [7, 7, 7, 8, 8, 8]], dtype=int32)) 

In [117]: ass = tf.assign(ch.c, c_new)                                            

In [118]: sess.run(ass) 
Out[118]: 
array([[11, 11, 11, 22, 22, 22], 
     [33, 33, 33, 44, 44, 44]], dtype=int32) 

In [119]: sess.run(ch)                                                
Out[119]: 
LSTMStateTuple(c=array([[11, 11, 11, 22, 22, 22], 
     [33, 33, 33, 44, 44, 44]], dtype=int32), h=array([[5, 5, 5, 6, 6, 6], 
     [7, 7, 7, 8, 8, 8]], dtype=int32)) 

ch.cが更新されていることがわかります。

+0

ありがとう、これはNamedTuple()を更新する方法を明確に示しています。TupleをTensorFlow Opsでサポートすることに取り組んでいますが、これまでは役に立ちました... https://github.com/tensorflow/テンソルフロー/問題/ 13537 – mazecreator

関連する問題