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
'파이썬' 카테고리의 다른 글
파이썬 Java 코드를 어떻게 효율적으로 파이썬으로 번역 할 수 있습니까? (0) | 2020.11.02 |
---|---|
파이썬 PySpark에서 폭발 (0) | 2020.11.02 |
파이썬 클래스 메서드의 목적은 무엇입니까? (0) | 2020.11.02 |
파이썬 Python에서 문자열의 개별 문자를 반복하는 방법 (0) | 2020.11.02 |
파이썬 PyQt 프로그램을 종료 / 종료하는 적절한 방법 (0) | 2020.11.02 |
댓글