인공지능을 좋아하는 곧미남

ResNet (Residual Net) 본문

Computer Vision .w Deeplearning/Classification

ResNet (Residual Net)

곧미남 2022. 1. 17. 16:55

오늘은 pytorch에서 제공하는 torchvision.models.resnet50 기준으로 ResNet의 구현내용을 알아보겠습니다.

 

오늘의 내용은 아래 목차와 같습니다.

 

< INDEX >

1. ResNet Contribution

 

2. ResNet Layer 구성

 

3. 구현 코드 설명


1. ResNet Contribution

우선, ResNet은 Input Image를 Deep한 Layer 구성을 통해 Feature를 찾는 역할을 합니다. 

 

하지만 Layer 구성이 깊어지면 깊어질수록 좋지 않은 결과를 얻게 되었습니다. 이런 내용이 발생하는 이유는 학습 신경망에서 Back Propagation을 할때 weight에 활성화 함수의 편미분을 구해 그 값을 곱해주는 연산과정이 있습니다. 이때 첫 번째 layer로 갈수록 weight 값이 0에 가까워 지는 현상이 발생합니다. 이게 Gradient Vanishing 현상입니다. 따라서, 이러한 기울기 손실을 막기 위해 고안된 것이 ResNet입니다.

 

이러한 문제점을 개선하기 위해 "Residual Learning"이 고안되었습니다.

 

"Residual Learning"의 메커니즘을 살펴보면, 평범한 Layer는 결과적으로 H(x) = x를 출력으로 합니다. 하지만 Residual Learning은 출력 값에 x를 더해 H(x) = F(x) + x로 출력을 정의하게 됩니다. 그래서 F(x) = 0으로 되도록 학습하면 H(x) = x가 될 것입니다. 이때 x에 대해 미분을 하여 기울기를 구하면, H(x) 값이 1이 되어 기울기 소실을 방지합니다.

Residual Learning Layer

이러한 방법을 통해 깊은 layer 구성이더라도 모든 layer에 대한 영향을 학습할 수 있는 신경망이 구축되는 겁니다.

2. ResNet Layer 구성

ResNet은 아래의 사진과 같이 layer 수만큼 구성을 별도로 했습니다.

총 conv1, conv2, conv3, conv4, conv5, average pool, 1000-d FC, softmax layer로 구성이 됩니다.

 

제일 상단의 layer name에서 확인할 수 있듯이 18-layer, 34-layer, 50-layer, 101-layer, 152-layer로 많은 종류의 layer수를 설정하여 구현한 것을 확인할 수 있습니다.

3. 구현 코드 설명

저는 pytorch에서 제공하는 "torchvision.models.resnet" 소스코드를 이용하여 디버그하여 구현 분석해보았습니다.

 

구현한 코드는 저의 github에서 확인할 수 있습니다.

*url: https://github.com/sangheonEN/Vision_Transformer/blob/main/ConvLSTM/backbone/resnet.py

 

그리고 구현 코드 중에 이런 순서로 layer 구성된게 있을텐데,

 

conv 연산 -> batch normalization -> activation function 

 

이건 휴리스틱하게 실험적으로 알아낸 방법이라고 전해집니다. 혹시 왜 이렇게 구성하는지 아시는분 있으시면 댓글 좀 부탁드립니다!

 

읽어주셔서 감사합니다.

 

 

Comments