728x90
반응형
1. '@' 과 np.dot연산자
@ 연산자는 행렬 곱셈(Matrix Multiplication)을 수행하는 데 사용된다.
이는 numpy 배열 간의 행렬 곱셈을 간결하게 표현할 수 있는 연산자입니다.
차원, 2차원, 3차원 배열 등 모든 차원의 배열에서 요소별 곱셈을 수행할 수 있다.
import numpy as np
# 두 개의 2x2 행렬 생성
A = np.array([[1, 2],
[3, 4]])
B = np.array([[5, 6],
[7, 8]])
# 행렬 곱셈
C = A @ B
print("A @ B:")
print(C)
# 행렬 곱셈
D = np.dot(A, B)
print("np.dot(A, B):")
print(D)
# 결과
# A @ B:
# [[19 22]
# [43 50]]
# np.dot(A, B):
# [[19 22]
# [43 50]]
# [[1*5 + 2*7, 1*6 + 2*8]
# [3*5 + 4*7, 3*6+ 4*8]]
@와 np.dot는 동일한 기능을 제공하며, 두 배열 간의 행렬 곱셈을 수행한다.
2. (*)별연산
별 연산자 *는 Numpy에서요소별 곱셈으로 사용된다.
이는 두 배열의 같은 위치에 있는 요소들끼리 곱하는 연산이다.
import numpy as np
# 두 개의 2x2 배열 생성
A = np.array([[1, 2],
[3, 4]])
B = np.array([[5, 6],
[7, 8]])
# 요소별 곱셈
C = A * B
print("A * B (요소별 곱셈):")
print(C)
# A * B (요소별 곱셈):
# [[ 5 12]
# [21 32]]
3. '@' 과 'np.dot' 의 3차원 배열에서 차이점
1. np.dot
- 1차원 배열: 벡터의 내적을 계산합니다.
- 2차원 배열: 행렬 곱셈을 수행합니다. (@ 동일)
- 3차원 배열: 마지막 두 축에 대해 행렬 곱셈을 수행합니다.
import numpy as np
# 두 개의 3차원 배열 생성
A = np.array([[[1, 2],
[3, 4]],
[[5, 6],
[7, 8]]])
B = np.array([[[1, 2],
[3, 4]],
[[5, 6],
[7, 8]]])
# np.dot 사용
C_dot = np.dot(A, B)
print("np.dot(A, B).shape:", C_dot.shape)
print("np.dot(A, B):")
print(C_dot)
결과
np.dot(A, B).shape: (2, 2, 2, 2)
np.dot(A, B):
[[[[ 7 10]
[15 22]]
[[15 22]
[31 46]]]
[[[31 46]
[55 80]]
[[55 80]
[91 130]]]]
2. @
- 1차원 배열: 벡터의 내적을 계산합니다.
- 2차원 배열: 행렬 곱셈을 수행합니다. (np.dot 동일)
- 3차원 배열: 두 배열 간의 행렬 곱셈을 수행할 때, @ 연산자는 np.matmul와 유사하게 동작합니다. np.matmul은 두 배열의 마지막 두 축에 대해 행렬 곱셈을 수행하며, 배치 차원(앞의 축들)을 유지합니다.
import numpy as np
# 두 개의 3차원 배열 생성
A = np.array([[[1, 2],
[3, 4]],
[[5, 6],
[7, 8]]])
B = np.array([[[1, 2],
[3, 4]],
[[5, 6],
[7, 8]]])
# @ 사용
C_at = A @ B
print("A @ B.shape:", C_at.shape)
print("A @ B:")
print(C_at)
결과
A @ B.shape: (2, 2, 2)
A @ B:
[[[ 7 10]
[ 15 22]]
[[ 31 46]
[ 55 80]]]
딥러닝에서의 활용
- 배치 처리:
- 딥러닝에서는 데이터를 배치 단위로 처리하는 경우가 많습니다. 예를 들어, 신경망의 가중치와 입력 데이터를 배치 차원에서 곱해야 할 때 @ 연산자를 사용할 수 있습니다. @ 연산자는 배치 차원을 유지하며 마지막 두 축 간의 행렬 곱셈을 수행하므로, 딥러닝의 행렬 연산과 잘 맞아떨어집니다.
- 다차원 연산:
- 딥러닝에서는 3차원 이상의 배열을 사용하여 여러 배치와 채널을 동시에 처리할 수 있습니다. @ 연산자는 이러한 다차원 배열 간의 행렬 곱셈을 간결하게 처리할 수 있습니다. 예를 들어, CNN(Convolutional Neural Networks)에서 필터와 활성화 맵의 곱셈을 수행할 때 유용합니다.
- 호환성:
- np.dot은 더 오래된 numpy 버전에서도 사용할 수 있지만, 최신 버전의 numpy에서는 @ 연산자를 사용하는 것이 더 권장됩니다. @는 가독성이 좋고 직관적인 연산자로, 코드의 명확성을 높여줍니다.
- 최적화:
- 특히 GPU와 같은 하드웨어 가속을 사용할 때, @ 연산자는 최적화된 연산을 제공하여 효율성을 높이는 데 도움이 됩니다. np.matmul과 @는 GPU 가속을 지원하는 연산으로, 대규모 데이터 처리 시 성능이 향상됩니다.
- np.dot의 장점 :
- np.dot은 마지막 두 축에 대한 연산 외에도 여러 배열의 차원 간의 내적 연산을 지원합니다.
- 호환성: 오래된 numpy 코드에서 여전히 사용되고 있으며, np.dot은 특정 연산에 대해 세부적인 제어가 필요한 경우 유용할 수 있다.
728x90
반응형
'AI Naver boost camp > [Week 02] ML LifeCycle' 카테고리의 다른 글
LSTM(Long Short-Term Memory Networks) (0) | 2024.08.18 |
---|---|
RNN - 순환신경망 이란?? (1) | 2024.08.18 |
활성화함수 (Activation funtion) (0) | 2024.08.16 |
2-layer MLP (Multi Layer Perceptron) (0) | 2024.08.16 |
경사하강법 - Gradient Desent (0) | 2024.08.13 |
댓글