반응형
🎨 NHWC 형식에서 Mul-Add 브로드캐스팅
텐서 형태: [1, 56, 56, 96]
형식: NHWC (Batch, Height, Width, Channels)
Mul 가중치: [96] - 각 채널마다 하나의 값
Add 편향: [96] - 각 채널마다 하나의 값
형식: NHWC (Batch, Height, Width, Channels)
Mul 가중치: [96] - 각 채널마다 하나의 값
Add 편향: [96] - 각 채널마다 하나의 값
💡 핵심 개념:
NHWC 형식에서는 마지막 차원(96)이 채널입니다. 각 픽셀 위치 (h, w)에서 96개의 채널 값이 있고, 각 채널마다 독립적으로 곱셈과 덧셈이 적용됩니다.
NHWC 형식에서는 마지막 차원(96)이 채널입니다. 각 픽셀 위치 (h, w)에서 96개의 채널 값이 있고, 각 채널마다 독립적으로 곱셈과 덧셈이 적용됩니다.
📊 시각화 (단순화된 예제: 4×4×3)
입력 텐서
[4×4×3]
[4×4×3]
클릭하면 해당 픽셀의 채널 값을 볼 수 있습니다
×
Mul 가중치
[3]
[3]
+
Add 편향
[3]
[3]
=
출력 텐서
[4×4×3]
[4×4×3]
🎮 인터랙티브 계산기
계산 과정:
결과:
📝 실제 ONNX Conv 변환
# NHWC [1, 56, 56, 96] → Conv 변환
#
# 1단계: Transpose (NHWC → NCHW)
Transpose([1, 56, 56, 96], perm=[0, 3, 1, 2])
→ [1, 96, 56, 56]
# 2단계: Depthwise Conv
Conv(
input=[1, 96, 56, 56],
weight=[96, 1, 1, 1], # 각 채널당 1×1 커널
bias=[96],
groups=96 # Depthwise: 각 채널 독립 처리
)
→ [1, 96, 56, 56]
# 3단계: Transpose (NCHW → NHWC)
Transpose([1, 96, 56, 56], perm=[0, 2, 3, 1])
→ [1, 56, 56, 96]
🔍 왜 Transpose가 필요한가?
• ONNX Conv 연산은 항상 NCHW 형식을 기대합니다
• NHWC 데이터를 직접 Conv에 넣으면 채널을 잘못된 차원으로 해석합니다
• Transpose로 형식을 변환하면 정확한 계산이 보장됩니다
• 최종 출력도 원래 NHWC 형식으로 되돌려야 합니다
• ONNX Conv 연산은 항상 NCHW 형식을 기대합니다
• NHWC 데이터를 직접 Conv에 넣으면 채널을 잘못된 차원으로 해석합니다
• Transpose로 형식을 변환하면 정확한 계산이 보장됩니다
• 최종 출력도 원래 NHWC 형식으로 되돌려야 합니다
반응형