alexnet structure

PyTorch AlexNet 모델 구조 분석하기

딥러닝을 공부하다 보면 CNN(Convolutional Neural Network)의 역사를 바꾼 모델인 AlexNet을 반드시 만나게 된다. AlexNet은 2012년 ImageNet 대회에서 압도적인 성능을 기록하며 우승을 차지했고, 당시 침체되어 있던 인공지능 연구에 새로운 전환점을 만들었다. 특히 AlexNet의 성공은 전 세계적으로 딥러닝 열풍을 촉발시키며 오늘날의 인공지능 붐(AI Boom)을 이끈 결정적인 계기로 평가받는다.

이번 글에서는 PyTorch에서 제공하는 AlexNet 모델을 직접 불러와 구조를 살펴보고, 각 계층이 어떤 역할을 수행하는지 알아보겠다.


AlexNet 불러오기

PyTorch에서는 torchvision 라이브러리를 통해 AlexNet을 쉽게 사용할 수 있다.

import torchvision.models as models

model = models.alexnet()

print(model)

실행하면 다음과 같은 구조를 확인할 수 있다.

alexnet
alexnet
AlexNet(
  (features): ...
  (avgpool): AdaptiveAvgPool2d(output_size=(6, 6))
  (classifier): ...
)

많은 교재에서는 Features와 Classifier만 소개하지만, 실제 PyTorch 구현에서는 중간에 avgpool 계층이 존재한다.


AlexNet 전체 구조

PyTorch 기준 AlexNet의 데이터 흐름은 다음과 같다.

입력 이미지
      ↓
Features
      ↓
AdaptiveAvgPool2d
      ↓
Flatten
      ↓
Classifier
      ↓
출력

이를 조금 더 자세히 표현하면 다음과 같다.

Input (224×224×3)
        ↓
Conv11×11, 64
        ↓
ReLU
        ↓
MaxPool
        ↓
Conv5×5, 192
        ↓
ReLU
        ↓
MaxPool
        ↓
Conv3×3, 384
        ↓
ReLU
        ↓
Conv3×3, 256
        ↓
ReLU
        ↓
Conv3×3, 256
        ↓
ReLU
        ↓
MaxPool
        ↓
AdaptiveAvgPool(6×6)
        ↓
Flatten
        ↓
FC 4096
        ↓
FC 4096
        ↓
FC 1000
        ↓
Output

Features 계층 분석

AlexNet의 특징 추출 부분은 다음과 같이 구성된다.

model.features

출력:

model_features
model_features
Conv2d(3, 64, kernel_size=11, stride=4)
ReLU
MaxPool2d

Conv2d(64, 192, kernel_size=5)
ReLU
MaxPool2d

Conv2d(192, 384, kernel_size=3)
ReLU

Conv2d(384, 256, kernel_size=3)
ReLU

Conv2d(256, 256, kernel_size=3)
ReLU

MaxPool2d

첫 번째 합성곱 계층

Conv2d(
    3,
    64,
    kernel_size=11,
    stride=4,
    padding=2
)

입력 이미지의 크기는 다음과 같다.

224 × 224 × 3

첫 번째 합성곱을 통과하면

55 × 55 × 64

크기의 특징맵이 생성된다.

AlexNet은 최신 CNN과 달리 처음부터 큰 11×11 필터를 사용한다는 특징이 있다.

224×224×3 이미지가 어떻게 55×55×64가 될까?

AlexNet의 첫 번째 합성곱 계층은 다음과 같이 정의되어 있다.

Conv2d(
    in_channels=3,
    out_channels=64,
    kernel_size=11,
    stride=4,
    padding=2
)

입력 이미지의 크기는 다음과 같다.

224 × 224 × 3

그렇다면 왜 출력 크기가

55 × 55 × 64

가 되는 것일까?

CNN의 출력 크기는 다음 공식으로 계산할 수 있다.

Output=Input+2PKS+1Output = \left\lfloor \frac{Input + 2P – K}{S} \right\rfloor + 1

여기서

  • Input : 입력 크기
  • K : 커널 크기(Kernel Size)
  • P : 패딩(Padding)
  • S : 스트라이드(Stride)

를 의미한다.

AlexNet의 첫 번째 합성곱 계층 값을 대입해보자.

Output=224+2×2114+1Output = \left\lfloor \frac{224 + 2 \times 2 – 11}{4} \right\rfloor + 1
Output=2174+1Output = \left\lfloor \frac{217}{4} \right\rfloor + 1
Output=55Output = 55

따라서 가로 크기는 55가 된다.

세로 역시 동일한 계산을 수행하므로 55가 된다.

마지막으로 출력 채널 수는 Conv2d의 out_channels=64 값에 의해 결정된다.

즉,

입력
224 × 224 × 3

      ↓

Conv2D
(K=11, S=4, P=2)

      ↓

출력
55 × 55 × 64

가 된다.

처음에는 단순히 숫자만 바뀌는 것처럼 보이지만, 실제로는 커널 크기, 스트라이드, 패딩이 모두 영향을 주어 출력 크기가 결정된다.

CNN을 이해할 때 가장 중요한 개념 중 하나가 바로 이 출력 크기 계산이다.


Max Pooling

MaxPool2d(kernel_size=3, stride=2)

Pooling 계층은 특징을 유지하면서 이미지 크기를 줄이는 역할을 수행한다.

예를 들어

55 × 55

크기의 특징맵이

27 × 27

정도로 축소된다.

이를 통해 연산량을 크게 줄일 수 있다.


3×3 합성곱 계층

AlexNet 후반부에서는 3×3 필터를 반복적으로 사용한다.

Conv2d(192,384,3)
Conv2d(384,256,3)
Conv2d(256,256,3)

이 단계에서는 이미지의 윤곽선, 모서리, 패턴, 질감 등의 고수준 특징을 학습하게 된다.


AvgPool 계층은 왜 존재할까?

PyTorch의 AlexNet을 출력해보면 다음 계층을 볼 수 있다.

(avgpool): AdaptiveAvgPool2d(output_size=(6,6))

많은 사람들이 이 부분을 보고 의문을 갖는다.

“논문에는 없는데 왜 있을까?”

이 계층의 역할은 출력 크기를 항상 6×6으로 맞추는 것이다.

예를 들어 Features를 통과한 결과가

256 × H × W

라고 하자.

입력 이미지 크기에 따라 H와 W는 달라질 수 있다.

그러나

AdaptiveAvgPool2d((6,6))

를 적용하면 항상

256 × 6 × 6

크기로 변환된다.

이 덕분에 뒤에 있는 완전연결계층은 항상 동일한 입력을 받을 수 있다.


Flatten

AvgPool 이후의 출력은

256 × 6 × 6

이다.

이를 일렬로 펼치면

256 × 6 × 6
=
9216

개의 값이 된다.

PyTorch 내부에서는 다음과 같은 작업이 수행된다.

torch.flatten(x, 1)

Classifier 계층 분석

AlexNet의 분류기는 다음과 같다.

model.classifier

출력:

Dropout
Linear(9216 → 4096)

ReLU

Dropout
Linear(4096 → 4096)

ReLU

Linear(4096 → 1000)

Dropout

Dropout(p=0.5)

학습 중 일부 뉴런을 무작위로 비활성화한다.

이를 통해 과적합(Overfitting)을 방지할 수 있다.


첫 번째 Fully Connected Layer

Linear(9216, 4096)

Flatten 결과인 9216개의 특징을 4096개의 특징으로 압축한다.


두 번째 Fully Connected Layer

Linear(4096, 4096)

더 복잡한 특징 조합을 학습한다.


최종 출력층

Linear(4096, 1000)

ImageNet 데이터셋의 1000개 클래스를 분류하기 위한 계층이다.


AlexNet의 의의

AlexNet은 단순히 오래된 CNN 모델이 아니다.

이 모델은 다음과 같은 기술을 대중화했다.

  • ReLU 활성화 함수
  • Dropout
  • GPU 기반 딥러닝 학습
  • 대규모 CNN 구조

오늘날의 ResNet, EfficientNet, Vision Transformer 역시 AlexNet이 만든 기반 위에서 발전해왔다.


마무리

PyTorch의 AlexNet은 크게 Features, AdaptiveAvgPool, Classifier 세 부분으로 구성된다.

특히 최신 torchvision 구현에서는 AdaptiveAvgPool 계층이 추가되어 다양한 입력 크기에 대응할 수 있도록 설계되어 있다.

AlexNet의 구조를 이해하면 이후에 VGG, GoogLeNet, ResNet과 같은 더 복잡한 CNN 모델을 학습할 때도 훨씬 수월하게 접근할 수 있다.

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다