본문 바로가기
파이썬

파이썬 Tensorflow-배치 데이터가있는 입력 행렬의 matmul

by º기록 2020. 11. 2.
반응형

input_x 로 표시되는 일부 데이터가 있습니다. 크기를 알 수없는 텐서 (배치로 입력해야 함)이며 각 항목의 크기는 n 입니다. input_x tf.nn.embedding_lookup 을 거치므로 embed 는 이제 [?, n, m] 차원을 갖습니다. m 은 임베딩 크기이고 ? 는 알 수없는 배치 크기를 나타냅니다.

여기에 설명되어 있습니다.

input_x = tf.placeholder(tf.int32, [None, n], name="input_x") 
embed = tf.nn.embedding_lookup(W, input_x)

이제 입력 데이터 (이제 차원을 포함하여 확장 됨)의 각 샘플에 행렬 변수 U 를 곱하려고하는데 어떻게해야할지 모르겠습니다.

처음에는 tf.matmul 을 사용해 보았지만 모양이 일치하지 않아 오류가 발생합니다. 그런 다음 U 의 차원을 확장하고 batch_matmul 을 적용하여 다음을 시도했습니다 ( tf.nn.math_ops 의 함수도 시도했습니다. 결과는 동일했습니다) :

U = tf.Variable( ... )    
U1 = tf.expand_dims(U,0)
h=tf.batch_matmul(embed, U1)

이것은 초기 컴파일을 통과하지만 실제 데이터가 적용되면 다음 오류가 발생합니다.

In [0] .dim (0) 및 In [1] .dim (0)은 동일해야합니다. [64,58,128] 대 [1,128,128]

왜 이런 일이 발생하는지 알고 있습니다. U 의 차원을 복제했으며 이제는 1 이지만 미니 배치 크기 인 64 는 그렇지 않습니다. t 적합.

텐서-행렬 입력에 대한 행렬 곱셈을 올바르게 수행하려면 어떻게해야합니까 (알 수없는 배치 크기의 경우)?

 

해결 방법

 



h = tf.scan(lambda a, x: tf.matmul(x, U), embed)

반면에 효율성이 중요한 경우 embed 를 2D 텐서로 재구성하여 다음과 같이 단일 matmul 으로 곱셈을 수행 할 수 있도록하는 것이 좋습니다.

embed = tf.reshape(embed, [-1, m])
h = tf.matmul(embed, U)
h = tf.reshape(h, [-1, n, c])

여기서 c U 의 열 수입니다. 마지막 재구성은 h 가 원본 x_input embed 와 마찬가지로 0 차원이 배치에 해당하는 3D 텐서인지 확인합니다. < / p>

 

참조 페이지 https://stackoverflow.com/questions/38235555

 

 

반응형

댓글