
ResNet의 핵심 아이디어는 residual block을 이용해 네트워크의 최적화 난이도를 낮추는것 입니다.

위 그림에서 H(x)는 Identity를 매핑해주는 함수이기 때문에 H(x)-x를 최소화하면서 H(x) = x 가 되는 것을 목표로 한다.(Identity 매핑이 아니었다면 H(x)-y를 최소화!)
H(x)를 기존의 네트워크라고 할 때, H(x)를 복잡한 함수에 근사시키는 것 보다 F(x) := H(x) - x일 때, H(x) = F(x) + x이고, F(x) + x를 근사시키는 것이 더 쉬울 것이라는 아이디어에서 출발한다. 기존 신경망이 H(x) - x = 0을 만들려 했다면 ResNet은 H(x) - x = F(x) 로 두어 F(x)를 최소화한다.

비교를 위한 Plain Network는 (i)VGG처럼 3x3 filter를 사용하고 output feature map size를 같도록 하기 위해 같은 개수의 filter를 사용합니다. (2) 그리고 feature map의 size가 절반으로 줄어들면 filter의 개수를 2배로 늘려 layer마다 time complexity를 보존합니다.
별도의 pooling layer를 사용하지 않고 stride 값을 2로 해서 downsampling을 하고 layer 마지막 부분에서 average pooling을 사용합니다.

Residual Network는 그림 처럼 실선으로된 shortcut connection을 삽입해 residual block을 구현하였고 같은 색상의 layer들이 하나의 block으로 동작합니다 block이 바뀔때 각 block의 첫번째 layer는 점선으로 shortcut connection이 표현되어 있는데 이는 입력단과 출력단의 dimension이 달라 맞춰주는것을 표현한것 입니다. 같은 색상인 block 내부에서는 입력과 출력의 output feature가 같은 것을 확인할 수 있습니다. 마지막 layer는 똑같이 average pooling을 사용합니다.


ResNet18은 18개의 층으로 이루어진 ResNet을 의미하는데 2442443의 image를 input으로 받습니다. 그리고 4개의 Conv block과 Adaptive Average Pooling을 시행한 후 Fully Connected layer(FC layer)를 통과시켜 이미지를 분류합니다. 각각의 Conv block은 두 개의 3*3 Conv 레이어로 구성되어 있습니다.
import torchvision
model = torchvision.model.resnet18(pretrained=True/False)
PyTorch에서는 위 코드와 같이 불러올 수 있다. pretrained를 True로 설정하면 ImageNet 데이터베이스의 1백만 개가 넘는 영상에 대해 훈련된 버전을 불러올 수 있고 영상을 키보드, 마우스, 연필, 각종 동물 등 1000가지 사물 범주로 분류할 수 있다. pretrained를 False로 설정하면 사전 학습이 안 된 모델 뼈대만을 가져올 수 있다.