[๊ฐ๋จ ์ค๋ช ] ๊ธฐ๋ณธ์ ์ธ CNN ์ํคํ ์ฒ ์ค๋ช | VGGNet, ResNet, Densenet
- VGGNet - Very Deep Convolutional Networks for Large-Scale Image Recognition / arXiv 2014
- ResNet - Deep Residual Learning for Image Recognition / CVPR 2016
- Densenet - Densely Connected Convolutional Networks / CVPR 2017
VGGNet
VGGNet์ AlexNet๋ณด๋ค network์ layer๊ฐ 2๋ฐฐ์ด์ ๊น์ด์ง๋ฉฐ ๋์ฑ ๋ณต์กํ task๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. Network layer ๊ฐ ๊น์ด์ง๊ณ ์ฑ๋ฅ์ด ํฅ์๋ ์ ์์๋ ์ด์ ๋ VGGNet๋ถํฐ convolutional filter๋ฅผ 3x3 size๋ฅผ ์ฌ์ฉํ์ฌ ๋คํธ์ํฌ๋ฅผ ๊น๊ฒ ์๊ธฐ ์์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
ํฐ ์ฌ์ด์ฆ์ conv. filter๋ฅผ ํ๋ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ์์ ์ฌ์ด์ฆ์ filter๋ฅผ ์ฌ๋ฌ๊ฐ ์ฌ์ฉํ๋ฉด activation function์ ๋ ๋ง์ด ์ฌ์ฉํ ์ ์์ด์, ๋คํธ์ํฌ์ non-linearity(๋น์ ํ์ฑ)๋ ์ฆ๊ฐ์ํค๊ณ , parameter ์๋ ๊ฐ์์์ผ์ฃผ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด์ ๋คํธ์ํฌ์ ๋นํด ์ฑ๋ฅ์ด ์ฆ๊ฐํ๊ธด ํ์ง๋ง, ๋ง์ง๋ง conv. layer์ output feature map์ flatten ์ํจ ํ FC layer์ ๋ฃ์ด์ฃผ๋ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์, FC layer parameter ์๊ฐ ๋๋ฌด ๋ง๊ณ intput image ์ฌ์ด์ฆ๊ฐ ๊ณ ์ ๋์ด์ผํ๋ค๋ ๊ฒ์ด ๋งค์ฐ ํฐ ๋จ์ ์ด๊ณ , GAP๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ input ์ด๋ฏธ์ง์ ๊ฐ ํฝ์ ๋ค์ spatial order์ ๋ฏผ๊ฐ์ ์ง ์ ์๋ ๋คํธ์ํฌ ์ ๋๋ค.
Network์ nonlinearity๋ conv filter ๋ค์ ์ฐ๊ฒฐ๋๋ non-linear function(e.g. ReLU, Sigmoid,...)์ด ๋ง์์ง ์๋ก ์ฆ๊ฐํ๋ฉฐ, nonlinearity๊ฐ ์ฆ๊ฐํ ์๋ก ๋์ฑ ์ฌ์ธํ๊ฒ decision boundary ๋ฅผ ์ ํ ์ ์์ผ๋ฏ๋ก task๊ฐ ๋ณต์กํด์ง ์๋ก non-linearity๊ฐ ์ค์ํฉ๋๋ค.
* 2022๋ ๊ธฐ์ค์ผ๋ก VGGNet์ผ๋ก backbone์ผ๋ก evaluation์ ํ๋ ์ฐ๊ตฌ๋ ๊ฑฐ์ ์์ต๋๋ค.
ResNet
VGGNet์ด layer๋ฅผ ๊น๊ฒ ๋ง๋ค๋ฉด์ ์ฑ๋ฅ์ ์ฆ๊ฐ์์ผฐ์ง๋ง, layer๊ฐ ๋ ๋ง์ด ๊น์ด์ง ๋๋ ์ฑ๋ฅ ์ฆ๊ฐ๊ฐ ๋ฏธ๋ฏธํฉ๋๋ค. ์ด๋ ์ด๋๊น์ง ์ฌ์ฉ๋๋ deep neural network์ layer๊ฐ ๊น์ด์ง๋ฉด gradient vanishing/exploding ๋ฑ์ ์ด์ ๋ก training์ด ์ ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ ๊ทธ๋ฆผ์ ์ผ์ชฝ ํ๋ฅผ ๋ณด๋ฉด plain-34 ๊ฐ ๋ ๊น์ network์์๋ ๋ถ๊ตฌํ๊ณ ์คํ๋ ค test error ๊ฐ ๋์ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
ResNet์ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ ๊ทธ๋ฆผ์ ๊ฐ์ residual learning(skip connection์ผ๋ก ๊ตฌํ)์ ์ฌ์ฉํฉ๋๋ค. Residual learning์ ์ฐ๋ฆฌ๋ง๋ก๋ '์์ฐจ ํ์ต' ์ผ๋ก ์ด๋ค ๊ฐ์ ์ฐจ์ด(์์ฐจ)๋ฅผ ํ์ตํ๋ค๋ ์๋ฏธ์ ๋๋ค. ๊ธฐ์กด์ ๋คํธ์ํฌ์์ F(x) = H(x)๋ฅผ ํ์ตํ ๋(F๋ ํ์ฌ layer์ embedding function์ ๋๋ค), residual learning์ผ๋ก F(x) = H(x) - x (์์ฐจ)๋ฅผ ํ์ตํ๋ ค ํ๋ ๊ฒ์ ๋๋ค. ์ด๋ฌํ residual learning์ ์ํด์ H(x) = F(x) + x ๊ฐ ๋์ด์ผ ํ๋ฏ๋ก skip connection(shortcut)์ผ๋ก weight layer ์ด์ ์ ์ ๋ ฅ(x)์ weight layer๋ฅผ ํต๊ณผํ F(x)๋ฅผ ๋ํด์ค๋๋ค.
์ด๋ network๋ฅผ training ํ ๋ optimalํ H(x)๋ฅผ ์ฐพ๋ ๊ฒ์์ optimalํ F(x)=H(x)-x(์ถ๋ ฅ๊ณผ ์ ๋ ฅ์ ์ฐจ) ๋ฅผ ์ฐพ๋ ๋ฐฉํฅ์ผ๋ก ํ์ตํ๊ฒ ๋ณ๊ฒฝ๋ ๊ฒ์ด๋ฉฐ, ์ด๋ฌํ residual mapping์ด gradient vanishing/exploding์ ๋ง์์ฃผ๊ณ ๊ธฐ์กด์ CNN๋ณด๋ค optimize๊ฐ ์ ๋์ด์ network์ layer๊ฐ ๊น์ด์ง๋๋ผ๋ ํ์ต์ด ์ ๋๊ฒ ํฉ๋๋ค.
์กฐ๊ธ ๋ ์ดํด๋ณด๋ฉด, F(x)=H(x)-x๋ฅผ ์ต์ํํ๋ฉด 0=H(x)-x๊ฐ ๋๊ณ (idealํ ์ํฉ) H(x)=x๊ฐ ๋๋ฏ๋ก, H(x)๋ฅผ x๋ก mappingํ๋ ๊ฒ์ด ํ์ต์ ๋ชฉํ๊ฐ ๋ฉ๋๋ค. ์ด๋ค ๊ฐ์ผ๋ก ์ต์ ํํด์ผํ ์ง ๋ชจ๋ฅด๋ H(x) ๊ฐ H(x)=x ๋ผ๋ ์ต์ ํ์ ๋ชฉํ๊ฐ์ด ์ ๊ณต๋๊ธฐ ๋๋ฌธ์ identity mapping์ธ F(x)๊ฐ ํ์ต์ด ๋ ์ฌ์์ง๋๋ค.
๋ํ, ๊ณฑ์ ์ฐ์ฐ์์ ๋ง์ ์ฐ์ฐ์ผ๋ก ๋ณํ๋๋๋ฐ, ์๋์ (1), (2)๋ residual unit์ ์์์ผ๋ก ๋ํ๋ธ ๊ฒ์ ๋๋ค.
F = residual function
f = activation function
h = identity mapping function(3x3 conv)
activation function f๋ฅผ identity mapping์ด๋ผ๊ณ ์๊ฐํ๋ฉด x_(l+1)=y_l ์ด๋ฏ๋ก (3)๋ฒ์์ด ์ฑ๋ฆฝ๋๊ณ ์ด๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๋์ ํ๋ฉด (4)๋ฒ ์์์ด ๋ง๋ค์ด ์ง๋๋ค.
L์ ์ ์ฒด layer์ ์ธ๋ฑ์ค์ด๊ณ , l์ layer ํ๋ํ๋๋ฅผ ๋ํ๋ ๋๋ค. (4)๋ฒ ์์ ๋ณด๋ฉด residual unit์ ์ฌ์ฉํ๋ฉด forward ์์ ์ ์ฒด ๋คํธ์ํฌ ์ฐ์ฐ์ residual function์ธ F๋ค์ ํฉ์ผ๋ก ํํํ ์ ์๊ณ , ์๋ณ์ ๋ฏธ๋ถํ๋ฉด (5)๋ฒ ์์ด ๋ฉ๋๋ค. ๊ดํธ ์์ ์ฐ๋ณ์ด ๋ฐฐ์น๋ง๋ค ํญ์ -1์ด ๋๋ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์๊ธฐ ๋๋ฌธ์ vanishing์ด ๋ฐ์ํ ํ๋ฅ ์ด ๋งค์ฐ ์ ์ด์ง๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก, residual learning์ ์ฌ์ฉํ๋ฉด shortcut์ ํตํด ๋คํธ์ํฌ ์ฐ์ฐ์ด ๊ณฑ์ ์ด ์๋ ๋ง์ ๋ค๋ก ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ์ ๋ณด์ ์ ๋ฌ์ด ์ฝ๊ณ weight ์ด ์ฐ์๋ ๊ณฑ์ ๋ค๋ก ์ ๋ฌ๋๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ vanishing์ด ๋ฐ์ํ์ง ์์ต๋๋ค. ๋๋ฌธ์ residual learning์ ์ฌ์ฉํ๋ฉด ๋คํธ์ํฌ๊ฐ ๊น์ด์ ๋ํ ํ๊ณ๋ฅผ ๋ฒ์ด๋ ์ ์์ต๋๋ค.
๋ํ, ResNet-50 ์ด์์ ๋ชจ๋ธ์์๋ parameter ์๊ฐ ์ ์ ๋ง์์ง๋ฉด์, bottleneck ๊ตฌ์กฐ๋ฅผ ์ฐจ์ฉํ์ฌ bottleneck residual block ์ ์ค์ฒฉํ์ฌ ์ฌ์ฉํฉ๋๋ค.
*Bottleneck residual : "1x1 conv(์ฑ๋ ๊ฐ์) → 3x3 conv → 1x1 conv(์ฑ๋ ์ฆ๊ฐ)" ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉฐ ์ฑ๋์ ์ค์ธ ์ํ์์ conv. ์ฐ์ฐ์ ํ๊ณ ๋ค์ ์ฑ๋ ์๋ฅผ ์๋๋๋ก ๋ฐ๊ฟ์ short cut ์ฐ์ฐ์ ์ํ
์ ๊ทธ๋ฆผ์ฒ๋ผ plain network์ ๋จ์ํ skip connection ์ ์ถ๊ฐํด์ค ๊ฒ์ด residual learning ๋ฐฉ์์ด๋ฉฐ, residual learning ๋ฐฉ์์ ์ ์ฉํ๋ฉด layer๊ฐ ๊น์ด์ง์๋ก ์ฑ๋ฅ์ด ์ข์์ง๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ ํ๋ ResNet18 ~ ResNet152 architecture์ด๋ฉฐ input ์ด๋ฏธ์ง ์ฌ์ด์ฆ๊ฐ 224x224 ์ผ๋ ๊ฐ layer output์ spatial size์ channel size ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. ๊ฐ ์ฌ์ด์ฆ๋ณ network๋ pytorch์์ ImageNet์ผ๋ก pre-train ๋ ๋ชจ๋ธ์ ์ ๊ณตํ๊ณ ์์ด์ ์ฌ๋ฌ task์ ํ์ฉํ ์ ์์ต๋๋ค.
ResNet์ ๊ฑฐ์ ๋๋ถ๋ถ์ vision task(e.g. classification, segmentation, depth estimation, 3D vision, etc,...)์์ backbone network๋ก ํ์ฉ๋๊ณ ์์ผ๋ฏ๋ก, ๊ตฌ์กฐ๋ฅผ ๋ฉด๋ฐํ ์ดํดํด๋ณด๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด๋ฏธ vanilla resnet ๋ณด๋ค ๋ ์ข์ ์ฑ๋ฅ์ ๋ด๋ network์ learning method ๋ค์ด ๋ง์ด ์์ง๋ง, ๋๋ถ๋ถ์ ๋ถ์ผ์์ ์๋ก์ด method์ ์ฑ๋ฅ ๋น๊ต๋ฅผ ์ํด ๋์ผํ ์กฐ๊ฑด(๋์ผ dataset, ๋์ผ backbone ๋๋ ์ ์ฌํ parameter ์/๊ณ์ฐ๋์ network)์์ evalutation์ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์๋ฅผ ๋ค์ด, object detection๊ณผ segmentation์ ์ฌ์ฉ๋๋ ์์ FPN(Feature Pyramid Network) ๊ตฌ์กฐ์์ ์ข์ธก encoder output์ด ์ฐ์ธก decoder input์ผ๋ก ์ฐ๊ฒฐ๋๋๋ฐ, encoder์ ๊ฐ output์ resnet์ ๊ฐ residual block(conv2_x, conv3_x, conv4_x, conv5_x)์ output ์ ๋๋ค.
์ด๋ ๋ฏ backbone net์ผ๋ก resnet์ด ๋ง์ด ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์, ํน์ ์ฐ๊ตฌ๋ถ์ผ์์ ์๋ก์ด network๋ฅผ ์ ์ํ๋ ค ํ ๋, resnet์์ ๋ฐ์ ์ํค๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
@ Pytorch ์ฝ๋ ์์
- pytorch ์์ ์ ๊ณต๋๋ ImageNet pre-train๋ resnet์ ๋ถ๋ฌ์์, forward ํจ์์์ ๊ฐ residual block์ output์ ๋ฐ๋ก ์ ์ฅํ์ฌ ์ฌ๋ฌ vision task์ ํ์ฉํ ์ ์์ต๋๋ค.
class Resnet_application(nn.Module):
def __init__(self,nclass):
super(Resnet_application, self).__init__()
self.resnet = models.resnet50(pretrained=True)
self.resnet.fc = nn.Linear(2048,nclass)
self.avgpool = nn.AdaptiveAvgPool2d((1, 1))
def forward(self, x):
conv_out = []
x = self.resnet.conv1(x)
x = self.resnet.bn1(x)
x = self.resnet.relu(x)
x = self.resnet.maxpool(x)
x = self.resnet.layer1(x); conv_out.append(x);
x = self.resnet.layer2(x); conv_out.append(x);
x = self.resnet.layer3(x); conv_out.append(x);
x = self.resnet.layer4(x); conv_out.append(x);
x = self.avgpool(x)
x = x.reshape(x.size(0),x.size(1))
x = self.resnet.fc(x); conv_out.append(x);
return conv_out
if __name__ == "__main__":
model = Resnet_application(100).cuda()
x = torch.rand((1,3,224,224)).cuda()
y = model(x)
print(y[0].shape,y[1].shape,y[2].shape,y[3].shape,y[4].shape)
torch.Size([1, 256, 56, 56]) torch.Size([1, 512, 28, 28]) torch.Size([1, 1024, 14, 14]) torch.Size([1, 2048, 7, 7]) torch.Size([1, 100])
DenseNet
Densenet์ ๋ชจ๋ layer์ feature map์ concatenation ํ๋ Dense Block์ผ๋ก ๊ตฌ์ฑ๋ deep neual network ์ ๋๋ค. Resnet๊ณผ ๋น๊ตํ๋ฉด, resnet์ skip connection์์ elemenet-wise ๋ง์ ์ ์ด์ฉํ๊ณ densenet ์ channel ์ถ์ผ๋ก concat ํ๋ ๋ฐฉ์์ ์ด์ฉํฉ๋๋ค.
๋ค๋ง, ์ฑ๋์ ๊ณ์ concat ํ๋ฉด ์ฑ๋ ์๊ฐ ๋๋ฌด ๋ง์์ง๊ธฐ ๋๋ฌธ์, ๊ฐ layer feature map์ ์ฑ๋ ๊ฐ์๋ฅผ ์์ ์์ growth rate(k)๋ก ์ฌ์ฉํฉ๋๋ค. Figure 1์์ k=4(hyper param.) ์ธ ๊ฒฝ์ฐ์ด๋ฉฐ, ๊ทธ๋ฆผ ๊ธฐ์ค์ผ๋ก 6 channel feature input์ด dense block 4๊ฐ๋ฅผ ํต๊ณผํ๋ฉด 6 + 4 + 4 + 4 + 4 =22 ๊ฐ์ channel์ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
Bottleneck์ ๊ฒฝ์ฐ, resnet์ "1x1 conv → 3x3 conv → 1x1 conv" ์ ๊ตฌ์กฐ์ด์ง๋ง, densenet์์๋ "1x1 conv → 3x3 conv" ๋ง ์ฌ์ฉํฉ๋๋ค. ๋ค๋ง 1x1 conv ๋ก ์ฑ๋ ๊ฐ์๋ฅผ 4*k ๊ฐ๋ก ์ค์ด๊ณ 3x3 conv๋ก ๋ค์ k๊ฐ์ ์ฑ๋๋ก ์ค์ด๋ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค.
Dense Block ์ฌ์ด ์ฌ์ด์๋ Transition layer๊ฐ ์กด์ฌํ๋๋ฐ, ์ด๋ "1x1 conv + average pooling"์ ์ํํ์ฌ feature map์ spatial size์ chanel ์๋ฅผ ์ค์ด๋ ์ญํ ์ ํฉ๋๋ค. ์ด ๋ 1x1 conv ๋ก channel ์๋ฅผ ์ค์ด๋ ๋น์จ์ theta=0.5 ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Densenet์ ์ ์ฒด์ ์ธ ๊ตฌ์กฐ๋ ์์ ๊ฐ์ผ๋ฉฐ, Dense Block + Transition layer ์ ๋ฐ๋ณต์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
์ ๋ฆฌํ๋ฉด, Densenet์ channel ์ถ concatenation ๋ฐฉ์์ผ๋ก skip connection์ ํ๋ dense block ๋ฅผ ๊น๊ฒ ์์ network๋ก ๋๋จธ์ง ๊ตฌ์กฐ๋ feature map ์ด ๋๋ฌด ์ปค์ง์ง ์๋๋ก(ํจ์จ์ ์ธ ์ฐ์ฐ์ ์ํด) ์กฐ์ ํด์ฃผ๋ ์ญํ ์ ํฉ๋๋ค.
resnet, densenet ์ ์ฌ๋ฌ vision task ์ฐ๊ตฌ์์ backbone network๋ก ๋ง์ด ์ฌ์ฉ๋๊ณ , ํด๋น ๋ ผ๋ฌธ๋ค์ image feature์ ๋ํ ์ดํด๋๋ฅผ ๋์ฌ์ฃผ๋ ์ข์ ๋ ผ๋ฌธ์ด๊ธฐ์ ๊ผญ ์ฝ์ด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค !