볼륨의 따른 컨볼루션
- 컨볼루션 연산을 RGB 이미지에서 수행한다면 widthheight3 크기의 데이터를 연산할 것임
- 필터도 마찬가지로 333 처럼 3차원 행렬이여야 함

def conv3d(data: np.ndarray, filters: np.ndarray, stride: int = 1) -> np.ndarray:
data_h, data_w, data_d = data.shape
filter_h, filter_w, filter_d = filters.shape
assert data_d == filter_d, "Data and filter depth must be the same"
output_h = ((data_h - filter_h) // stride) + 1
output_w = ((data_w - filter_w) // stride) + 1
output = np.zeros((output_h, output_w))
for i in range(output_h):
for j in range(output_w):
for k in range(filter_h):
for l in range(filter_w):
for m in range(filter_d):
output[i, j] += data[i * stride + k, j * stride + l, m] * filters[k, l, m]
return output
- 필터와 데이터의 depth 는 같아야한다.
- 3d 연산의 이점
- 특정 채널의 엣지만 검출하려면 해당 채널의 필터를 제외한 필터의 값을 0으로 만들면 된다.
- numpy 의 벡터화 기능을 사용할 수 있으므로 연산이 빨라진다.
여러개의 필터
- 수직, 수평, 45도, 70도의 엣지를 모두 검출하고 싶다면?
- 6x6x3 의 데이터를 수평 엣지 검출 필터 3x3x3 와 연산하면 4x4x1 의 결과가 나온다.
- 여러가지 종류의 필터로 연산을 하여 4x4 의 결과를 쌓으면 4x4xN 크기의 결과가 나온다.