티스토리 뷰

주로 이미지 분류 작업에 활용되는 CNN(Convolutional Neural Network)의 모델을 정의하는 파이썬 코드에 대해 알아보고자 한다.

 

[예시 코드]

model = models.Sequential([
    layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(64, (3, 3), activation='relu'),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(64, (3, 3), activation='relu'),
    layers.Flatten(),
    layers.Dense(64, activation='relu'),
    layers.Dense(10, activation='softmax')
])

 

[모델 구조의 주요 구성 요소]

  1. models.Sequential:
    • Sequential API를 사용하여 층(layer)을 순차적으로 쌓는 구조.
    • 각 층은 순서대로 입력 데이터를 처리하며, 이전 층의 출력을 다음 층의 입력으로 사용.
  2. layers.Conv2D:
    • 2D 컨볼루션 층으로, 입력 데이터에 커널(필터)을 적용하여 특징 맵(feature map)을 생성.
    • 이미지의 패턴(엣지, 텍스처 등)을 추출.
    • 주요 파라미터:
      • filters: 필터의 수 (출력 채널 수).
      • kernel_size: 필터 크기. 여기서는 3×33 \times 3 크기의 필터 사용.
      • activation: 활성화 함수로, ReLU(Rectified Linear Unit)를 사용해 비선형성을 부여.
      • input_shape: 입력 데이터의 크기. CIFAR-10 이미지는 32×32×332 \times 32 \times 3 (너비, 높이, 채널 수).
  3. layers.MaxPooling2D:
    • 최대 풀링 층으로, 특징 맵의 크기를 줄이고 계산량을 감소시키며, 중요한 특징을 강조.
    • 주요 파라미터:
      • pool_size: 풀링 영역 크기. 여기서는 2×22 \times 2 사용.
    • 특징 맵의 크기가 1/21/2로 줄어듦.
  4. layers.Flatten:
    • 다차원 데이터를 1차원 벡터로 변환.
    • 컨볼루션 층과 Fully Connected 층 사이의 연결을 위해 필요.
  5. layers.Dense:
    • 완전 연결(fully connected) 층으로, Flatten된 데이터를 입력받아 특정 크기의 출력을 생성.
    • 주요 파라미터:
      • units: 출력 뉴런의 수.
      • activation: 활성화 함수.
        • ReLU: 은닉층에서 사용.
        • Softmax: 출력층에서 사용하여 각 클래스에 대한 확률 분포를 생성.

 

[계층별 동작 및 출력 크기]

* 입력 데이터는 CIFAR-10의 이미지 크기인 32(가로)x32(세로)x3(채널)로 가정함.

layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3))

1. 첫 번째 Conv2D 층

  • 입력 크기: 32×32×332 \times 32 \times 3
  • 필터: 32개 (3×33 \times 3 크기)
  • 출력 크기: 30×30×3230 \times 30 \times 32 (패딩 없이 진행)

 

layers.MaxPooling2D((2, 2))

2. 첫 번째 MaxPooling2D 층

 

  • 입력 크기: 30×30×3230 \times 30 \times 32
  • 풀링 크기: 2×22 \times 2
  • 출력 크기: 15×15×3215 \times 15 \times 32

 

 

layers.Conv2D(64, (3, 3), activation='relu')

3. 두 번째 Conv2D 층

 

  • 입력 크기: 15×15×3215 \times 15 \times 32
  • 필터: 64개 (3×33 \times 3 크기)
  • 출력 크기: 13×13×6413 \times 13 \times 64

 

 

layers.MaxPooling2D((2, 2))

4. 두 번째 MaxPooling2D 층

 

  • 입력 크기: 13×13×6413 \times 13 \times 64
  • 풀링 크기: 2×22 \times 2
  • 출력 크기: 6×6×646 \times 6 \times 64

 

 

layers.Conv2D(64, (3, 3), activation='relu')

5. 세 번째 Conv2D 층

 

  • 입력 크기: 6×6×646 \times 6 \times 64
  • 필터: 64개 (3×33 \times 3 크기)
  • 출력 크기: 4×4×644 \times 4 \times 64

 

 

layers.Flatten()

6. Flatten 층

 

  • 입력 크기: 4×4×644 \times 4 \times 64
  • 출력 크기: 10241024 (4 x 4 x 64 = 1024)

 

 

layers.Dense(64, activation='relu')

7. 첫 번째 Dense 층

 

  • 입력 크기: 10241024
  • 출력 크기: 6464

 

 

layers.Dense(10, activation='softmax')

8. 출력(Dense) 층

 

  • 입력 크기: 6464
  • 출력 크기: 1010 (CIFAR-10 클래스 수)

 

 

 

[모델의 전체 학습 과정]

  1. 특징 추출:
    • Conv2D와 MaxPooling2D를 통해 입력 데이터에서 중요한 특징(엣지, 패턴 등)을 추출.
    • 단계적으로 저수준 특징에서 고수준 특징으로 학습.
  2. 분류:
    • Flatten 층으로 데이터를 1차원으로 변환.
    • Dense 층에서 클래스별 확률 값을 계산.

 

[활성화 함수]

  • ReLU:
    • 비선형성을 부여하여 모델이 복잡한 패턴을 학습 가능.
  • Softmax:
    • 출력층에서 사용하며, 각 클래스에 대한 확률 분포를 반환.

 

활성화 함수들
Softmax 함수식

반응형