2016-12-06 1 views
1

Tensorflow의 LSTM 튜토리얼을 이해하고 https://github.com/tensorflow/tensorflow/blob/master/tensorflow/models/rnn/ptb/ptb_word_lm.py 코드에 대한 질문이 있습니다.Tensorflow의 PTB LSTM 예제에서 배치가 반복되는 방식은 무엇입니까?

for step in range(model.input.epoch_size): 
    feed_dict = {} 
    for i, (c, h) in enumerate(model.initial_state): 
     feed_dict[c] = state[i].c 
     feed_dict[h] = state[i].h 

    vals = session.run(fetches, feed_dict) 
    cost = vals["cost"] 
    state = vals["final_state"] 

    costs += cost 
    iters += model.input.num_steps 

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

하지만 궁금해하는 방법이 코드는 우리가 어떤 시대의 LSTM 모델을 "에게"않습니다 run_epoch()이 라인은 시대를 실행하는 기능에서 는 input.epoch_size는 실제로 데이터의 일괄 처리의 수? init 메소드의 LSTM 클래스에서 전체 데이터가로드되고 계산은 일반적으로 데이터에 정의됩니다.

두 번째 질문은 ch을 계산에 넣는 것입니다. 왜 우리가 그걸합니까? 그것은 상태없는 vs 무국적 LSTM과 관련이 있습니까? 그래서 바닐라 LSTM에 대해이 코드를 안전하게 제거 할 수 있습니까?

감사합니다.

+0

첫 번째 질문을 완전히 이해하고 있는지 잘 모르겠습니다. 오역 한 경우를 대비하여 의견을 남기십시오. – martianwars

답변

3

동일한 파일에 line 348이 표시되는 경우 코드는 run_epoch()을 각 에포크에 한 번 호출합니다. 각 신기원, LSTM 셀은 훈련이 진행됨에 따라 모두 제로 상태로 초기화됩니다. 귀하의 질문에,

하지만이 코드는 우리가 어떤 시대의 LSTM 모델을 "알 수 있습니까?" init 메소드의 LSTM 클래스에서 전체 데이터가로드되고 계산은 일반적으로 데이터에 정의됩니다.

LSTM 셀 내부의 가중치가 업데이트되고 각 신기원 초기에 LSTM의 initial_state이 사용됩니다. 명시 적으로 LSTM에 기원 번호를 말할 필요가 없습니다.

내 두 번째 질문은 c와 h를 계산에 넣는 것입니다. 왜 우리가 그걸합니까? 그것은 상태없는 vs 무국적 LSTM과 관련이 있습니까? 그래서 바닐라 LSTM에 대해이 코드를 안전하게 제거 할 수 있습니까?

이것은 매우 중요한 단계입니다. 이는 다양한 배치에 걸쳐 LSTM 상태를 전달하기 위해 수행됩니다. LSTM에는 두 가지 내부 상태, ch이 있습니다. 이 값이 그래프에 입력되면 이전 배치의 최종 상태가 다음 배치의 초기 상태가됩니다. 이 값을 model.final_state으로 계산하고 feed_dict에 전달하면됩니다. TensorFlow 코드를 보면 here을 읽을 수 있으므로 statestate_is_tupleTrue 일 때 본질적으로 ch의 튜플입니다.

+0

감사합니다. 그것은 매우 유익했습니다. – Gemini

+0

도움이된다면 대답을 잊지 마라. – martianwars

+0

또 다른 한가지는 네트워크의 모든 레이어에 변수를 제공하기 위해 튜토리얼에서 'for' 루프가 사용되었다는 것이다. 내가 아는 한, 이것은 필요하지 않다.'state'를 직접 전달할 수 있는데, 이것은'LSTMStateTuple'의 튜플입니다. – martianwars

0
# for i, (c, h) in enumerate(model.initial_state): 
# feed_dict[c] = state[i].c 
# feed_dict[h] = state[i].h 

feed_dict[model._initial_state]=state; 

루프는 현재 일괄 처리의 첫 번째 셀 상태를 마지막 일괄 처리의 최종 셀 상태로 초기화하는 것입니다.

관련 문제