반응형
from IPython.display import Image
목표
Numpy dot 메소드에서 np.dot()
함수를 사용하여 행렬 곱 연산을 했습니다. 그러나 3, 4차원의 배열에서 np.dot()
을 사용하여 연산을 하면 의도치 않은 결과가 도출될 수 있습니다. 고차원 배열에서 Numpy의 np.dot()
와 np.matmul()
메소드를 살펴보고 둘의 차이점에 대해 알아봅시다.
np.dot()와 np.matmul()의 차이
2 x 2 x 2 모양을 가진 3차원 두 배열을 생성하고 np.dot()
과 np.matmul()
를 사용하여 연산해보겠습니다.
import numpy as np
A = np.array([
[[3, 1],
[3, 3]],
[[1, 1],
[3, 2]]])
B = np.array([
[[3, 3],
[3, 3]],
[[1, 3],
[2, 1]]])
print(np.dot(A, B))
[[[[12 12]
[ 5 10]]
[[18 18]
[ 9 12]]]
[[[ 6 6]
[ 3 4]]
[[15 15]
[ 7 11]]]]
print(np.matmul(A, B))
[[[12 12]
[18 18]]
[[ 3 4]
[ 7 11]]]
np.dot() 연산 과정
- np.dot()은 각 A의 행 벡터와 B의 열 벡터끼리 모두 내적 연산을 합니다.
예를 들어, A의 첫 번째 행렬 [[3 1] [3 3]]에서 행 벡터 [3 1]은 B의 첫 번째 행렬과 두 번째 행렬에 있는 모든 열 벡터 [3 3], [3 3], [1 2], [3 1]와 내적 연산을 하여 2차원 배열 [[12 12] [5 10]]을 도출합니다.
np.matmul() 연산 과정
- np.matmul()은 뒤에서 2개의 차원에 해당하는 배열끼리 행렬 곱 연산을 합니다. 예를 들어, A의 첫 번째 행렬 [[3 1] [3 3]]과 B의 첫 번째 행렬[[3 3] [3 3]]끼리 연산하여 2차원 배열 [[12 12] [18 18]]을 도출합니다.
위처럼 np.dot()
과 np.matmul()
는 다르게 연산합니다. A와 B가 2 x 2 x 2 배열로 주어졌을 때 위 연산에 따라 np.dot()
은 2 x 2 x 2 x 2 배열(4차원)로, np.matmul()
은 2 x 2 x 2 배열(3차원)로 계산되는 것을 확인하실 수 있습니다.
이제 오른쪽 코드의 주석을 참고하여 빈칸을 채우고 np.dot()와 np.matmul()의 차이를 확인해봅시다.
예제 코드
import numpy as np
a = np.random.randn(3, 16, 64)
b = np.random.randn(3, 64, 8)
# np.dot(a, b)를 빈칸에 넣어주세요.
dot_result = np.dot(a,b)
# np.matmul(a, b)를 빈칸에 넣어주세요.
matmul_result = np.matmul(a,b)
print(dot_result.shape)
print(matmul_result.shape)
(3, 16, 3, 8)
(3, 16, 8)
'AI_Bootcamp' 카테고리의 다른 글
3주차 Day14 Numpy 실습 IV (0) | 2022.01.20 |
---|---|
Numpy 심화 실습 chap2 bool 인덱싱 (0) | 2022.01.19 |
3주차 Day13 Numpy 실습 III (0) | 2022.01.19 |
AWS를 활용한 인공지능 모델 배포 chap1 (1) | 2022.01.18 |
3주차 Day12 Numpy 실습 II (0) | 2022.01.18 |