2016-07-19 14 views
1

RNNチュートリアルptd_word_lm.py。 run_epochを使用してRNNをトレーニングする場合、self._initial_stateを評価する必要があるのはなぜですか?TensorflowでRNNをトレーニングするときにself._initial_stateを評価する理由

def run_epoch(session, m, data, eval_op, verbose=False): 
    """Runs the model on the given data.""" 
    epoch_size = ((len(data) // m.batch_size) - 1) // m.num_steps 
    start_time = time.time() 
    costs = 0.0 
    iters = 0 
    state = m.initial_state.eval() 
    for step, (x, y) in enumerate(reader.ptb_iterator(data, m.batch_size, 
                m.num_steps)): 
    cost, state, _ = session.run([m.cost, m.final_state, eval_op], 
           {m.input_data: x, 
            m.targets: y, 
            m.initial_state: state}) 
    costs += cost 
    iters += m.num_steps 

    if verbose and step % (epoch_size // 10) == 10: 
     print("%.3f perplexity: %.3f speed: %.0f wps" % 
      (step * 1.0/epoch_size, np.exp(costs/iters), 
      iters * m.batch_size/(time.time() - start_time))) 

    return np.exp(costs/iters) 

初期状態は以下のように定義され、訓練中は変更されません。 PTBの例で

self._initial_state = cell.zero_state(batch_size, tf.float32) 

答えて

2

、文は(サイズBATCH_SIZE第X num_stepsの)バッチに連結し、分割されています。各バッチの後、RNNの最後の状態が次のバッチの初期状態として渡されます。これにより、RNNをPTBコーパス全体に渡って非常に長い連鎖のように訓練することができます(これは、model.final_stateが評価される理由と、なぜ州がfeed_dictのm.initial_stateに渡されるのかを説明します)。つまり、実際にinitial_stateがの場合、すべてのステップでが変化することがわかります。

エポックの最初の時点では、initial_stateとして渡す以前の状態がないので、state = m.initial_state.eval()で表されるすべてのゼロを使用します。おそらく、この初期状態を取得するために評価したm.zero_stateという別のプロパティがあると、混乱は少なくなります。たとえば、適切なサイズのゼロの配列を使用することもできます。これはうまく動作します。評価は、適切なサイズのテンソルまたはゼロを得る便利な方法です。

希望はこれが理にかなっています!

関連する問題