ResNet 만들기(stem, body, header)

2023. 9. 18. 22:15ResNet

♣ 기본적인 neural network architecture의 구조

stem

  • 입력 데이터를 처리하는 초기 부분
  • 입력 데이터에 대한 크기 조정, 정규화 및 초기 특성 추출과 같은 기본 작업 담당
  • CNN에서 stem은 일반적으로 network의 처음 몇 개의 레이어를 포함
  • 합성곱 및 pooling layer와 같은 layer를 포함
  • 입력 데이터를 준비하고 이를 본문(body)로 전달

 

  • self.conv1: 이 부분은 2D 합성곱 레이어로, 입력 이미지의 채널 수가 3(RGB 이미지)이며, 64개의 출력 채널을 생성함.
  • kernel_size는 커널(필터) 크기를 나타내며, stride가 2이므로 공간적 차원(가로 및 세로)을 절반으로 줄임
  •  padding은 입력과 출력의 공간적 차원을 동일하게 유지하기 위해 설정된 값

 

  • self.pool1: 합성곱 레이어를 통과한 후, maxpooling 레이어를 사용하여 공간적 차원을 줄임
  • maxpooling은 공간적 차원을 감소시키는 데 사용되며, 3은 커널 크기를 나타내고, 2는 스트라이드를 나타내며, padding은 출력 차원을 조절하는 데 도움을 줌

 

body

  • feature extraction(특성 추출)과 representation learning(표현 학습)을 담당하는 중심 부분
  • 여러 layer, block 또는 stage로 구성되어 입력 데이터를 점진적으로 고수준 특성으로 변환
  • body는 대부분의 계산과 특성 학습이 수행되는 부분임
  • CNN에서 body에는 일반적으로 여러 stage가 포함되며, 각 stage에는 convolutional, normalization, activation layer(합성곱, 정규화, 활성화 레이어)들이 포함됨
  • architecutre에 따라 stage의 깊이와 복잡성이 다를 수 있음

 

ResNet에서의 body는 두 가지 다른 종류의 stage들로 이루어짐

  • Residual Block(잔여 블록)
  1. ResNet의 기본 구성 블록
  2. 일반적으로 두 개의 convolution layer로 구성되는데, 각 layer에는 배치 정규화와 ReLU 활성화 함수가 이어짐
  3. 잔여 블록의 주요 아이디어는 skip connection이나 shortcut connection을 이용하여 input을 블록의 output에 추가하는 것. 이 skip connection이 훈련 중에 나타나는 vanishing gradient 문제를 극복하는 데 도움을 줌
  4. 잔여 블록은 더 얕은 ResNet architecture에서 사용되며 확장 계수가 1임. 이는 출력 채널 수가 입력 채널 수와 동일함을 의미함

위의 2번 설명에 해당하는 layer(conv-BatchNorm-ReLU)

 

Residual Block(위에서 정의한 BnConv layer 활용)

 

  • Bottleneck Block(병목 블록)
  1. 더 깊은 ResNet 변형(ResNet50, ResNet 101 등)에서 소개됨
  2. 더 복잡한 특성을 캡쳐하기 위해 network를 더 깊게 만들어야 할 때 사용
  3. 세 개의 convolutional layer로 구성: 1x1 convolution, 작은 수의 필터를 사용하는 3x3 convolution, 다시 원하느 수의 필터로 채널 수를 확장하는 1x1 convolution
  4. 병목 블록은 계산 효율성을 높이면서 network를 더 깊게 만들기 위해 설계됨
  5. 확장 계수가 4로 설정되어 있어서 출력 채널 수가 입력 채널 수의 네 배임
  6. 잔여 블록과 마찬가지로 입력을 출력에 추가하기 위해 skip connection 사용

Bottleneck Block

 

 

위의 block을 사용해서 stem과 body를 결합한 architecture 만들기

 

  1. self.layers는 ResNret의 시작 부분인 stem layer를 정의함. 7x7 크기의 컨볼루션 레이어, 배치 정규화, ReLU 활성화 함수 및 3x3 크기의 Max Pooling 레이어로 구성
  2. block과 num_blocks 설정 - block 변수에는 ResBlock 또는 ResBottleNeckBlock이 할당됨. 이는 원하는 블록 유형을 지정하는 데 사용됨 

        - num_blocks 리스트는 각 stage에서 사용할 블록 수를 지정. 위의 resnet18 예시에서의 [2, 2, 2, 2] 처럼

 

    3. 각 stage 생성

        - make_stage 함수는 stage를 생성하는 역할

        - 각 stage는 block을 사용하여 num_blocks만큼 중첩된 형태로 구성됨

        - stage 간의 채널 수와 stride는 변화할 수 있음

 

 

header

  • 최종 출력이나 예측을 생성하는 network의 마지막 부분
  • 일반적으로 하나 이상의 fully connected layer 또는 convolutional layer로 이뤄짐. 각 layer 에는 global pooling와 활성화 함수가 뒤따름
  • body에서 추출된 고수준 특성을 원하는 출력 형식으로 변화 ex) 이미지 분류에서 head는 클래스 확률을 생성
  • body에서 학습한 특성을 기반으로 최종 결정이나 예측을 수행

 

stem, body, head를 결합한 architecture 만들기

 

  1. self.gap: nn.AdaptiveAvgPool2d는 PyTorch에서 사용되는 적응형 평균 풀링 layer. 이 layer는 전역 평균 풀링을 수행하며 이는 feature map의 모든 공간 차원(높이와 너비)에 걸쳐 평균값을 계산
  2. 이 행에서는 (1, 1) 출력 크기로 전역 평균 풀링을 수행하기 위해 AdaptiveAvgPool2d((1, 1))를 사용함. 이로써 특성 맵의 공간 차원이 1x1로 줄어듦

 

  3. self.fc : nn.Linear는 완전 연결(선형) 레이어. 주로 신경망의 최종 분류 레이어로 사용됨

  4. 이 선형 layer는 전역 평균 풀링에서 추출한 특성을 클래서 점수로 매핑하는 역할

 

(self.gap)는 특성 맵의 공간 차원을 고정 크기로 줄이는 데 사용되며, 선형 레이어(self.fc)는 이러한 특성을 기반으로 실제 분류를 수행함. num_classes는 분류 작업에서의 출력 뉴런 수를 결정하며, 각 클래스에 해당함.

 

 

♣ 참고

 

https://bo-10000.tistory.com/133

 

[PyTorch Implementation] ResNet-B, ResNet-C, ResNet-D, ResNet Tweaks

Bag of Tricks for Image Classification with Convolutional Neural Networks (He et al., CVPR 2019)에서 소개된 ResNet의 변형 모델들(tweaks)에 대한 PyTorch 코드이다. 논문에서는 두 개의 유명한 변형 모델인 ResNet-B, C를 소개

bo-10000.tistory.com

https://aistudy9314.tistory.com/58

 

[Pytorch] ResNet을 만들어보자!

Pytorch를 이용해서 분류문제에서 사용하는 여러가지 backbone 논문을 구현하는 시간을 가지려고 한다. 네트워크에 대한 논문 리뷰는 따로 하지 않고 구현을 하면서 간단한 설명만 할 예정이다. $\tri

aistudy9314.tistory.com