ndarray와 scalar를 연산시킬때,
scalar를 상대 ndarray와 같은 shape이면서 해당 scalar의 값을 가진 ndarray로 변경시키고나서
이 scalar로부터 만들어진 ndarray와 상대 ndarray를 동작시키는 방식으로 elementwise연산이 수행되는 기능.
주의할 것은 scalar 를 확장시키는 것이 기본이라는 점임.
PyTorch나 TensorFlow의 텐서도 같은 방식으로 broadcasting이 수행된다.
이를 정리하면 다음과 같은 Rule에 따른다고 생각할 수 있음.
Rules of Broadcasting
Rule 1
두 ndarray의 차원의 수(number of dimensions)가 같지 않을 경우,
적은 ndarray의 shape가 leading side쪽(shape에서 왼쪽)으로 1로 padding됨 (shape가 padding되는 것 주의)
- A의 shape가 (3,4,1) 이고,
B의 shape가 (1,2)이면,
B가 2차원(ndim=2)이므로 3차원(ndim=3)으로 늘어나고,
leading side(왼쪽)로 1로 padding된 shape가 됨. - 즉, B는 (1,2)에서 (1,1,2)이 됨.
Rule 2
shape에서 대응되는 값들이 일치하지않을 경우,
ndarray 각각에서 shape가 1인 차원이 상대방의 해당하는 차원의 shape로 변경됨.
- A의 shape가 (3,4,1) 이고,
B의 shape가 (1,1,2)이면,
A의 첫번째 차원의 shape수인 3에 맞춰 B의 첫번째 차원의 shape도 3이 됨. - 두번째 차원(두번째 축)의 경우,
A의 4에 맞춰 B도 4로 늘어남. - 세번째 차원의 경우 B의 2에 맞춰 A의 1이 2로 늘어남 (stretched)
Rule 3
Rule2를 적용하려고 할 때, shape가 일치하지 않으면서 어느 한 쪽 ndarray가 1이 아닌 경우엔 broadcasting이 실패함.
예제
import numpy as np
import tensorflow as tf
import torch
# ------------------
a = np.ones((3,4,1))
b = np.ones((1,2))
c = a+b
print(c.shape) # (3,4,2)
# -------------------
a_torch = torch.ones((3,4,1))
b_torch = torch.ones((2))
c_torch = a_torch + b_torch
print(c_torch.shape) # (3,4,2)
# -------------------
a_tf = tf.ones((3,4,1))
b_tf = tf.ones((2))
c_tf = a_tf + b_tf
print(c_tf.shape) # (3,4,2)
numpy, tensorflow, pytorch 모두 같은 방식으로 동작한다.
이후로는 numpy 중심으로 예제를 작성함.
import numpy as np
a = np.ones((2, 3))
b = np.arange(3)
a+b
# 2 x 3
import numpy as np
a = np.arange(3).reshape((3, 1))
b = np.arange(3)
a+b
# 3 x 3
import numpy as np
a = np.ones((3, 2))
b = np.arange(3)
a+b
# Value Error
'Programming > DIP' 카테고리의 다른 글
[DIP] OpenCV : Region of Interest (ROI) : Callback으로 구현. (0) | 2022.10.03 |
---|---|
[DIP] opencv : Region of Interest (ROI) : cv2.selectROI (0) | 2022.10.03 |
[DIP] Signal to Noise : Amplitude, Power, and Differential SNR (0) | 2022.09.26 |
[DIP] Line pairs per millimeters and Bar phantom (0) | 2022.09.26 |
[DIP] Full Width at Half Maximum (FWHM) (1) | 2022.09.26 |