1

나는 tensorflow를 사용하여 반복적 인 신경망을 만들려고합니다. 내 코드는 다음과 같습니다.Tensorflow RNN 입력 크기

import tensorflow as tf 

rnn_cell = tf.nn.rnn_cell.GRUCell(3) 

inputs = [tf.constant([[0, 1]], dtype=tf.float32), tf.constant([[2, 3]], dtype=tf.float32)] 

outputs, end = tf.nn.rnn(rnn_cell, inputs, dtype=tf.float32) 

이제 모든 것이 잘 돌아갑니다. 그러나 실제로 어떤 일이 일어나고 있는지 혼란 스럽습니다. 출력 크기는 항상 배치 크기 x rnn 셀의 숨겨진 상태의 크기입니다 - 어떻게 입력 크기와 완전히 독립적 일 수 있습니까?

이해가 정확하다면, 입력은 각 단계에서 rnn의 숨겨진 상태로 연결되고 (다른 연산들 중에서) 가중치 행렬이 곱해진다. 이것은 입력 행렬이 선언되기 전에 rnn_cell이 작성되기 때문에 가중치 행렬의 크기가 입력 크기에 의존해야한다는 것을 의미합니다!

답변

0

tensorflow의 GRU 구현에 대한 질문으로 answer을 본 후, 나는 무슨 일이 일어 났는지 깨달았습니다. 내 직감과는 달리 GRUCell 생성자는 가중치 또는 바이어스 변수를 전혀 생성하지 않습니다. 대신 자체 가변 범위를 만든 다음 실제로 호출 될 때 필요에 따라 변수를 인스턴스화합니다. Tensorflow의 변수 범위 지정 메커니즘은 변수가 한 번만 생성되고 GRU에 대한 이후 호출에서 공유되도록합니다.

나는 그들이 내가 알 수있는 한 문서화되지 않은 다소 혼란스러운 구현을하기로 결정한 이유가 확실하지 않습니다. 필자에게 파이썬의 객체 레벨 변수 범위 지정을 사용하여 추가적인 암시 적 범위 지정 메커니즘에 의존하기보다는 GRUCell 자체 내에서 텐서 흐름 변수를 캡슐화하는 것이 더 적합합니다.