목차
행렬의 곱셈은 크게 성분 곱(Hadamard product), 내적(inner product) 그리고 외적(outer product)이 있다. 일반적인 행렬곱은 외적에 해당한다. 각각의 연산은 아래와 같이 A, B 행렬이 있을 때, 다음과 같이 계산될 수 있다.
위와 같은 행렬 곱 연산을 텐서플로우(tensorflow)로는 아래와 같이 나타낼 수 있다. 행렬의 곱 연산에 사용할 수 있는 함수는 크게 tf.matmul(), tf.multiply(), tf.tensordot() 세 개가 있다.
환경 정보
Tensorflow == 2.13.0rc1
import tensorflow as tf
위 코드로 모듈 임포트 후 실행함
1. Element-wise 곱 연산
성분 곱 연산 = Hadamard product 연산은 성분 간 곱셈을 수행하는 연산으로, 같은 dimension을 가지는 벡터 또는 행렬 간의 연산을 수행한다. tf.multiply()를 통해 성분 곱을 수행할 수 있다.
tf.multiply() 성분곱 연산 예시
A = [1, 0, 0]
B = [0, 1, 0]
tf.multiply(A, B)
<tf.Tensor: shape=(3,), dtype=int32, numpy=array([0, 0, 0], dtype=int32)>
2. 내적 연산(inner product)
아래 연산은 내적 연산으로 실질적으로는 ATB 연산이 수행된다. tensordot 함수는 axes를 꼭 입력해주어야 하며, 이 값이 1일 때만 내적 연산이 수행된다.
tf.tensordot(A, B, axes=1)
tf.tensordot() 내적 연산 예시
A = [1, 0, 0]
B = [0, 1, 0]
tf.tensordot(A, B, axes=1)
<tf.Tensor: shape=(), dtype=int32, numpy=0>
3. 외적 연산(outer product)
일반적인 행렬곱 연산에 해당하며, tensordot()의 axes를 0으로 주면 외적 연산을 수행한다.
tf.tensordot() 외적 연산 예시
A = [1, 0, 0]
B = [0, 1, 0]
tf.tensordot(A, B, 0)
<tf.Tensor: shape=(3, 3), dtype=int32, numpy=
array([[0, 1, 0],
[0, 0, 0],
[0, 0, 0]], dtype=int32)>
뿐만 아니라, A와 B를 행렬 형태로 표현해주면, tf.matmul() 연산자도 사용할 수 있다. 단 위와 같은 벡터 형태에서는 이 연산자를 사용할 수 없으니, 행렬 표현이 필수적이다.
tf.matmul() 외적 연산 예시
mat_A = [[1], [0], [0]]
mat_B = [[0, 1, 0]]
tf.matmul(mat_A, mat_B)
<tf.Tensor: shape=(3, 3), dtype=int32, numpy=
array([[0, 1, 0],
[0, 0, 0],
[0, 0, 0]], dtype=int32)>
끝!
반응형
'인공지능 > ML, DL' 카테고리의 다른 글
[PyTorch] CrossEntropyLoss가 음의 무한대로 갈 때 (1) | 2023.11.23 |
---|---|
[tensorflow] 텐서플로우 랜덤 시드 고정하기 (0) | 2023.06.15 |
[NLP] Sentence-transformer를 활용한 문장 임베딩 (0) | 2023.04.28 |
[ChatGPT] Python ChatGPT API 사용 방법 (한국어 예시) (0) | 2023.04.27 |
[tensorflow] 모델 로드 시 컴파일 warning 해결 (No training configuration found in the save file, so the model was *not* compiled.) (0) | 2022.12.19 |