특성 맵

AI
gemma-4-31b
작성자
익명
작성일
2026.08.05
조회수
None
버전
v1

📋 문서 버전

이 문서는 3개의 버전이 있습니다. 현재 버전 1을 보고 있습니다.

특성 맵 (Feature Map)

1. 개요

특성 맵(Feature Map)이란 합성곱 신경망(CNN, Convolutional Neural Network)에서 입력 데이터에 필터를 적용하여 특정 시각적 특징(특성)이 활성화된 위치와 강도를 나타낸 텐서(Tensor) 형태의 데이터를 의미한다.

CNN의 핵심은 이미지의 공간적 구조를 유지하면서 유의미한 패턴을 추출하는 것인데, 이때 필터(Filter)가 이미지 전체를 훑으며 연산을 수행한 결과물이 바로 특성 맵이다. 일반적으로 하나의 층에서는 여러 개의 필터를 사용하므로, 특성 맵은 단일 행렬이 아니라 각 필터가 추출한 서로 다른 특징들이 쌓인 채널의 집합 형태로 생성된다. 이를 통해 모델은 원본 픽셀 값 대신 '에지(Edge)', '질감(Texture)', '형태(Shape)'와 같은 고차원적인 정보에 집중할 수 있게 된다.

2. 생성 원리 및 작동 방식

특성 맵은 입력 데이터와 커널(Kernel, 필터) 간의 합성곱 연산(Convolution)을 통해 생성된다. 커널은 작은 크기의 가중치 행렬로, 입력 데이터 위를 일정 간격으로 이동하며 요소별 곱셈 후 합산(Element-wise multiplication and sum)을 수행한다.

2.1 채널(Channel)과 다중 필터

입력 데이터가 RGB 이미지라면 3개의 채널을 가진다. CNN에서는 여러 개의 필터를 동시에 사용하여 각 필터마다 서로 다른 특성을 추출하며, 그 결과로 생성된 여러 개의 특성 맵이 쌓여 다채널 특성 맵을 형성한다. 이때 사용된 필터의 개수가 곧 출력 특성 맵의 채널 수가 된다.

[차원 변화 예시] * 입력: $32 \times 32 \times 3$ (가로 $\times$ 세로 $\times$ RGB 채널) * 필터: $3 \times 3 \times 3$ 크기의 필터 16개 사용 * 출력: $30 \times 30 \times 16$ (가로 $\times$ 세로 $\times$ 16개의 특성 맵 채널)

2.2 주요 변수

  • 스트라이드(Stride): 필터가 한 번에 이동하는 칸 수이다. 스트라이드가 커질수록 출력 특성 맵의 크기는 작아진다.
  • 패딩(Padding): 입력 데이터의 외곽에 특정 값(주로 0)을 채워 넣는 기법이다. 이는 출력 크기가 급격히 줄어드는 것을 방지하고, 이미지 가장자리의 정보 손실을 줄이기 위해 사용된다.

2.3 특성 맵 크기 계산 공식

입력 데이터의 크기를 $W$, 필터의 크기를 $F$, 패딩을 $P$, 스트라이드를 $S$라고 할 때, 출력 특성 맵의 크기 $O$는 다음과 같이 계산된다. 실제 프레임워크에서는 소수점 발생 시 내림 연산을 수행한다.

$$O = \lfloor \frac{W - F + 2P}{S} \rfloor + 1$$

[표 1] 설정값에 따른 출력 크기 변화 예시

입력 크기 ($W$) 필터 크기 ($F$) 패딩 ($P$) 스트라이드 ($S$) 계산 과정 출력 크기 ($O$)
32 $\times$ 32 3 $\times$ 3 0 1 $\lfloor(32-3+0)/1\rfloor + 1$ 30 $\times$ 30
32 $\times$ 32 3 $\times$ 3 1 1 $\lfloor(32-3+2)/1\rfloor + 1$ 32 $\times$ 32
32 $\times$ 32 3 $\times$ 3 1 2 $\lfloor(32-3+2)/2\rfloor + 1$ 16 $\times$ 16

3. 수용장 (Receptive Field)

수용장(Receptive Field)이란 출력 특성 맵의 한 픽셀이 입력 이미지의 어느 정도 영역을 참조하고 있는지를 나타내는 개념이다.

  • 국소적 수용장: 초기 층의 특성 맵 픽셀은 입력 이미지의 아주 작은 영역(예: $3 \times 3$)만을 반영한다.
  • 수용장의 확장: 층이 깊어질수록(Layer가 쌓일수록), 이전 층의 특성 맵을 다시 합성곱 연산하므로, 최종 층의 한 픽셀은 입력 이미지의 매우 넓은 영역을 포괄하게 된다. 이는 모델이 이미지의 국소적인 특징뿐만 아니라 전체적인 구조와 맥락을 파악할 수 있게 하는 핵심 원리이다.

4. 계층별 특성 추출의 특성

CNN은 층이 깊어짐에 따라 추출하는 특성의 추상화 수준이 단계적으로 높아지는 계층적 구조를 가진다.

4.1 얕은 층 (Low-level Features)

네트워크의 앞부분에 위치한 층에서는 매우 단순한 기하학적 특성을 추출한다. * 추출 대상: 수직/수평 선, 대각선, 단순한 색상 대비, 점 등. * 특징: 입력 이미지의 세부적인 픽셀 변화에 민감하게 반응한다.

4.2 깊은 층 (High-level Features)

네트워크의 뒷부분으로 갈수록 앞서 추출된 단순 특성들이 조합되어 복잡한 개념을 형성한다. * 추출 대상: 원형, 격자무늬 $\rightarrow$ 눈, 코, 입 $\rightarrow$ 얼굴 전체, 자동차 바퀴 $\rightarrow$ 자동차 전체. * 특징: 구체적인 픽셀 값보다는 객체의 의미론적(Semantic) 형태와 구조에 집중한다.

[계층적 특성 추출 흐름도]

graph LR
    A[입력 이미지] --> B[Layer 1: 에지/선]
    B --> C[Layer 2: 단순 도형/질감]
    C --> D[Layer 3: 객체 부분/부품]
    D --> E[Layer 4: 완전한 객체/의미]
    style A fill:#f9f,stroke:#333
    style E fill:#bbf,stroke:#333

5. 특성 맵의 활용 및 확장

5.1 시각화와 해석

특성 맵은 일반적으로 활성화 함수(Activation Function), 특히 ReLU(Rectified Linear Unit)를 거친다. ReLU는 0보다 작은 값을 0으로 처리하여, 특정 특성이 '존재하는지(활성화)' 아니면 '존재하지 않는지(비활성화)'를 명확히 구분한다.

이를 이미지 형태로 시각화하면 모델의 판단 근거를 분석할 수 있다. 예를 들어, 강아지 사진을 입력했을 때 특정 필터의 특성 맵에서 강아지의 귀나 꼬리 부분이 밝게 빛난다면, 해당 필터가 그 부위의 특성을 성공적으로 학습했음을 의미한다. 이는 모델의 블랙박스 특성을 완화하는 설명 가능한 AI(XAI)의 기초적인 분석 방법이 된다.

5.2 풀링(Pooling)

특성 맵의 공간적 크기를 줄이기 위해 풀링 층(Pooling Layer)을 사용한다. 대표적으로 Max Pooling은 특정 영역에서 최대값만을 선택하여 다운샘플링(Downsampling)을 수행한다. 이를 통해 다음과 같은 효과를 얻을 수 있다. * 계산 효율성: 특성 맵의 해상도를 낮추어 연산량과 메모리 사용량을 줄인다. * 불변성(Invariance) 확보: 특성이 이미지 내에서 약간 이동하더라도 최대값은 유지되므로, 위치 변화에 강건한 특징 추출이 가능하다. * 과적합 방지: 세부적인 픽셀 정보보다는 핵심적인 특성만을 남겨 일반화 성능을 높인다.

5.3 코드 예제 (PyTorch)

다음은 PyTorch를 사용하여 특정 합성곱 층의 특성 맵을 추출하는 간단한 예시 코드이다.

import torch
import torch.nn as nn

# 간단한 CNN 모델 정의
class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1)
        self.relu = nn.ReLU()

    def forward(self, x):
        # 특성 맵을 반환하기 위해 중간 단계 저장
        x = self.conv1(x)
        x = self.relu(x)
        return x

# 입력 데이터 생성 (Batch=1, Channel=3, H=32, W=32)
input_tensor = torch.randn(1, 3, 32, 32)
model = SimpleCNN()

# 특성 맵 추출
with torch.no_grad():
    feature_maps = model(input_tensor)

print(f"특성 맵의 형태: {feature_maps.shape}") 
# 출력: torch.Size([1, 16, 32, 32]) -> 16개의 채널(특성 맵) 생성

AI 생성 콘텐츠 안내

이 문서는 AI 모델(gemma-4-31b)에 의해 생성된 콘텐츠입니다.

주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.

이 AI 생성 콘텐츠가 도움이 되었나요?