0

두 부분으로 구성된 TensorFlow 그래프를 만듭니다. 인코더와 디코더. 디코더 다음에 최적화가 뒤 따른다. 인코더와 디코더는 모두 가변 길이 입력 및 타겟 시퀀스에 종속적 인 등록을 가진 반복적 인 신경망입니다. 즉, 입력 순서가 5 개의 요소를 가져, 타겟 순서가 6 개의 요소를 가지는 경우, 엔코더는 5 개의 엔트리를 가져, 디코더는 6 개의 엔트리를 가질 필요가 있습니다. 그래도 나는 그래프 위에 두 개의 변수를 작성하여이를 수행 할 수 있습니다 : 나는 세션을 실행할 때가변 반복 섹션이있는 TensorFlow 그래프

graph = tf.Graph() 
with graph.as_default(): 
... 
    # Encoder 
    for t in range(len_input): 
     ... 

    # Decoder 
    for t in range(len_target): 
     ... 

그럼, 적절하게 업데이트 할 것 :

len_input = 1 
len_target = 1 

및 그래프에 코드가

with sess = tf.Session(graph=graph): 
tf.initialize_all_variables().run() 
for step in range(num_batches): 
    input = en_data.pop() 
    len_input = input.shape[1] 
    target = fr_data.pop() 
    len_target = target.shape[1] 

그러나 원하는 결과를 얻지는 못합니다. 대신 그래프는 처음 컴파일 될 때와 같이 인코더와 디코더를 한 번만 등록합니다.

등록자들간에 Tensors를 저장할 수 있다고 말하기 전에, 제 경우의 문제는 손실 기능이 인코더의 출력에 종속적 인 디코더의 출력에 의존한다는 것입니다. 즉, 최적화 프로그램은 인코더와 디코더 모두에서 작동하는 모든 가중치를 최적화합니다. 즉, 모두가 하나의 그래프에 있어야합니다. 등록에 가치 Tensors를 저장하려면 인코더와 디코더에 대한 두 개의 개별 그래프를 만들어야합니다. 두 그래프의 등록 수가 동일 할 필요는 없습니다.

나는 이것에 매우 혼란 스럽다. 처음에는 인코더와 디코더의 등록 횟수를 줄이는 자리 표시자가 있다고 생각했지만 자리 표시 자 자체는 Tensor이므로 for 루프의 range 함수에서 사용할 수 없습니다. 내가 뭘 할 수 있는지 전혀 모르겠다. 어떤 제안? 미리 감사드립니다! :)

답변

1

TensorFlow는 그래프의 제어 흐름 구성을 사용하여 루프의 동적 풀기를 지원합니다.

  • 당신의 인코더 및 디코더 일치하는 경우 : 대신에 반복을 정의하기 위해 파이썬 for 루프를 사용하여, 당신은 당신이 파이썬 객체 또는 함수로 루프의 몸을 정의 할 수 있습니다 다음 인터페이스 중 하나를 사용할 수 있습니다 TensorFlow의 tf.nn.rnn_cell.RNNCell 인터페이스의 경우 tf.nn.dynamic_rnn()을 사용하여 다양한 타임 스텝 수의 RNN을 정의 할 수 있습니다. sequence_length 인수를 사용하면 일괄 처리의 각 시퀀스 길이를 tf.Tensor으로 지정할 수 있으며 TensorFlow는 셀을 적절한 횟수만큼 실행합니다.

  • 대신 루프 본문을 파이썬 함수로 표현하는 것이 더 쉬운 경우 tf.while_loop() 또는 tf.scan() 고차 함수를 사용하여 루프를 정의 할 수 있습니다.

+0

굉장합니다. 'tf.while_loop'을 시험해보고 어떻게되는지 알려줄 것이지만 정답과 같습니다. –

관련 문제