본문 바로가기

University/Vehicle Intelligence Foundation

[CNN] ResNet18

소개

 ResNet18은 18개 층으로 이루어진 ResNet을 의미합니다

 ResNet은 2015년도 ILSVRC(ImageNet Large Sclae Visual Recognition Challenge)에서 우승한 CNN 네크워크입니다.

 ResNet 연구팀은 이전 VGGNet이 밝힌 Layer가 깊어질수록 성능이 좋아지는 사실을 심층적으로 연구한 결과 Layer가 너무 깊어져도 성능이 떨어지는 현상을 확인합니다. Layer가 깊어질수록 미분을 점점 많이 하기 때문에, Layer의 미분값이 작아져 weight의 영향이 작아지는 Gradient Vanishing이 발생하여 Training Data로 학습이 되지 않는 문제가 발생합니다.

 그래서 ResNet은 Skip Connection을 이용한 Residual Learning을 통해 Gradient Vanishing 문제를 해결합니다.

 ResNet의 논문 이름은 "Deep Residual Learning for Image Recognition"으로, 논문제목의 Residual을 따서 ResNet이라고 부릅니다.

 

특징

ResNet 구조

 ResNet은 아래에 설명할 Identity Block과 Convolution Block을 적용한 네트워크가 Layer가 깊어질수록 성능이 좋아지는지 확인하기 위해 여러 구조로 나누어 비교합니다.

Plain Network와 ResNet Layer 비교

 결과적으로, Identity Block과 Convolution Block을 적용하지 않은 순수한 네트워크는 Layer가 깊어질수록 성능이 떨어지지만, ResNet은 성능이 높아짐을 확인할 수 있습니다.

Identity Block

Identity Block (Residual Block은 Identity Block과 Convolution Block을 통칭합니다)

  • 기존의 신경망은 입력값 x를 타겟값 y로 매핑하는 함수 H(x)를 얻는 것을 목적으로 합니다. 따라서 H(x) - y를 최소화 하는 방향으로 학습을 진행합니다.
  • 이때, 타겟값 y값을 입력값 x로 mapping을 하기 때문에 H(x) - x를 최소화하는 방향으로 학습이 진행되며, 이를 잔차(Residual)라고 합니다.
  • H(x)가 x가 되도록 Residual Learning으로 학습해도 Gradient Vanishing 문제는 해결이 되지 않습니다.
  • 그래서 ResNet은 최소 Gradient로 1은 갖도록 하기 위해, 미분값 1을 갖는 입력값 x를 더해서 Gradient Vanishing 문제를 해결합니다.
  • 입력값을 출력값에 더해주기 위해서 지름길(Shortcut)을 추가합니다.
  • 주의할 점으로 Shorcut은 활성화 함수 이전에 시행됩니다.

Convolution Block

Convolution Block

  • Convolution Block은 입력값 x를 1 x 1 필터 커널로 Convolution 해주고 F(x)에 더하는 방식입니다.

Adaptive Pooling

  • Adaptive Pooling은 일반적인 Pooling과 다르게 outsize를 설정한다는 차이점이 있습니다.
  • outsize를 설정하면 알아서 Input Feature Map에 맞춰줍니다.

 

구조

ResNet18 구조

Input Image

  • 224 x 224 x 3 이미지를 입력으로 받습니다.

Block A(Convolution Layer)

 

  • 64개의 7 x 7 x 3 필터 커널로 입력 이미지를 Convolution 해줍니다. 보폭(stride)을 2로 설정하고 Zero Padding을 3으로 설정해주면 Output으로 112 x 112 x 64 Feature Map을 얻게됩니다.
  • 그 후 Batch Normalization이 시행되면, 112 x 112 x 64 Feature Map이 유지됩니다.
  • 활성화 함수로 ReLU 함수를 사용합니다.
  • 그리고 3 x 3 Max Pooling을 보폭(stride) 2로 설정하고 Zero Padding을 1로 설정하면 56 x 56 x 64의 Feature Map이 나옵니다.

 

Block B(Convolution Layer)

 

  • Block B는 Identity Block 2개로 이루어져 있습니다.
  • 64개의 3 x 3 x 64 필터 커널로 이전 단계 Feature Map을 Convolution 해줍니다. 보폭(stride)과 Zero Padding 모두 1로 설정해주면 Output으로 56 x 56 x 64 Feature Map을 얻게됩니다.
  • Batch Normalization을 시행하고 활성화 함수로 ReLU 함수를 사용합니다.
  • 그리고 다시 64개의 3 x 3 x 64 필터 커널로 이전 단계 Feature Map을 Convolution 해줍니다. 보폭(stride)과 Zero Padding 모두 1로 설정해주면 Output으로 56 x 56 x 64 Feature Map을 얻게됩니다.
  • Batch Normalization을 시행하고 1번째 Convolution 이전 Feature Map을 더합니다.
  • Identity Block이 2개이므로 위의 사항들을 1번 더 시행합니다.

Block C(Convolution Layer)

  • Block C는 Convolution Block, Identity Block 1개씩 이루어져 있습니다.
  • 128개의 3 x 3 x 64 필터 커널로 이전 단계 Feature Map을 Convolution 해줍니다. 보폭(stride)과 Zero Padding 모두 1로 설정해주면 Output으로 28 x 28 x 128 Feature Map을 얻게됩니다.
  • Batch Normalization을 시행하고 활성화 함수로 ReLU 함수를 사용합니다.
  • 그리고 다시 128개의 3 x 3 x 128 필터 커널로 이전 단계 Feature Map을 Convolution 해줍니다. 보폭(stride)과 Zero Padding 모두 1로 설정해주면 Output으로 28 x 28 x 128 Feature Map을 얻게됩니다.
  • Convolution Block이므로 Batch Normalization을 시행하고 1번째 Convolution 이전 Feature Map을 1 x 1 x 64 필터 커널로 Convolution 해주어 더합니다.
  • 다음 Block이 Identity Block이므로 1 x 1 x 128 Convolution 없이 위의 사항들을 1번 더 시행합니다. (단, 필터 커널은 Feature Map에 맞게 수정됩니다.)

Block D(Convolution Layer)

  • Block D도 C와 마찬가지로 Convolution Block, Identity Block 1개씩 이루어져 있습니다.
  • 256개의 3 x 3 x 128 필터 커널로 이전 단계 Feature Map을 Convolution 해줍니다. 보폭(stride)과 Zero Padding 모두 1로 설정해주면 Output으로 14 x 14 x 256 Feature Map을 얻게됩니다.
  • Batch Normalization을 시행하고 활성화 함수로 ReLU 함수를 사용합니다.
  • 그리고 다시 256개의 3 x 3 x 256 필터 커널로 이전 단계 Feature Map을 Convolution 해줍니다. 보폭(stride)과 Zero Padding 모두 1로 설정해주면 Output으로 14 x 14 x 256 Feature Map을 얻게됩니다.
  • Convolution Block이므로 Batch Normalization을 시행하고 1번째 Convolution 이전 Feature Map을 1 x 1 x 128 필터 커널로 Convolution 해주어 더합니다.
  • 다음 Block이 Identity Block이므로 1 x 1 x 256 Convolution 없이 위의 사항들을 1번 더 시행합니다. (단, 필터 커널은 Feature Map에 맞게 수정됩니다.)

Block E(Convolution Layer)

  • Block E도 C와 마찬가지로 Convolution Block, Identity Block 1개씩 이루어져 있습니다.
  • 512개의 3 x 3 x 256 필터 커널로 이전 단계 Feature Map을 Convolution 해줍니다. 보폭(stride)과 Zero Padding 모두 1로 설정해주면 Output으로 7 x 7 x 512 Feature Map을 얻게됩니다.
  • Batch Normalization을 시행하고 활성화 함수로 ReLU 함수를 사용합니다.
  • 그리고 다시 512개의 3 x 3 x 512 필터 커널로 이전 단계 Feature Map을 Convolution 해줍니다. 보폭(stride)과 Zero Padding 모두 1로 설정해주면 Output으로 7 x 7 x 512 Feature Map을 얻게됩니다.
  • Convolution Block이므로 Batch Normalization을 시행하고 1번째 Convolution 이전 Feature Map을 1 x 1 x 256 필터 커널로 Convolution 해주어 더합니다.
  • 다음 Block이 Identity Block이므로 1 x 1 x 512 Convolution 없이 위의 사항들을 1번 더 시행합니다. (단, 필터 커널은 Feature Map에 맞게 수정됩니다.)

Final Layer(Fully Connected Layer)

  • 이전 단계 Feature Map을 Adaptive Average Pooling을 시행합니다.
  • 7 x 7 x 512 Feature Map을 1000개의 뉴런과 Fully Connected 시켜줍니다.
  • 1000개 뉴런 출력값에 Softmax 함수를 적용하여 1000개 클래스 각각에 속할 확률을 나타냅니다.

 

 

 

출처

 [1] ResNet: https://bskyvision.com/644

 [2] ResNet: https://ganghee-lee.tistory.com/41

 [3] ResNet18 사진: https://www.researchgate.net/figure/ResNet-with-18-layers-depicted-in-five-blocks_fig4_333787753

'University > Vehicle Intelligence Foundation' 카테고리의 다른 글

[CNN] GoogLeNet  (1) 2021.04.20
[CNN] VGG16  (0) 2021.04.19
[CNN] AlexNet  (0) 2021.04.18
[실습] YOLO - Object Detection  (0) 2021.04.07
[Perception Open Source] Point Cloud Library  (0) 2021.04.06