파이토치 torchvision 이미지 딥러닝 모델 알아보기

2021. 2. 17. 05:01

이미지 딥러닝 모델이 필요하여, 파이토치로 이것저것 테스트를 해 보고 있다. 처음에는 파이토치로 네트워크를 다 구성하여 학습시킬 생각을 하였지만, 파이토치 관련 라이브러리 중 하나인 torchvision을 이용하면 이미 알려진 유명한 모델을 가져다 사용할 수 있다는 것을 알게 되었다. 오늘은 파이토치 torchvision의 딥러닝 모델에 대해서 알아보도록 하겠다.

 

 

torchvision 이미지 딥러닝 모델




파이토치에는 이미지 분류에 사용할 수 있는 12개의 딥러닝 알고리즘이 들어 있다. pretrain된 모델을 이용할 수도 있고, 네트워크 구조만 가져와서 새로운 데이터에 학습시키는 것도 가능하다.

하나씩 내용을 알아보면 아래와 같다.

1. AlexNet

2012년에 이미지넷 대회(ILSVRC)에서 우승한 모델이다. GPU의 메모리가 부족하여, 2개로 나누어 연산을 수행하고 중간중간 결과를 합치는 것이 특징이다. 그 외에도 여러가지 테크닉을 더해 성능을 높혔다고 한다.
알렉스넷에 대한 자세한 설명을 아래 링크를 참조하기 바란다.

( 참조: www.datamaker.io/posts/34/  )

import torchvision.models as models

alexnet = models.alexnet()
alexnet = models.alexnet(pretrained=True)

 

 

2. VGG

2014년에 이미지넷에서 2위를 한 모델이다. 논문 저자의 소속인 Visual Geometry Group에서 이름을 따왔다고 한다. 3x3 Convolution filter를 깊게 쌓는다는 것이 특징이며, 앞의 모델보다 많은 레이어를 사용한다. 
VGG Net의 자세한 설명은 아래 링크를 참조하기 바란다.

( 참조: medium.com/@msmapark2/vgg16-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-very-deep-convolutional-networks-for-large-scale-image-recognition-6f748235242a )

import torchvision.models as models
vgg16 = models.vgg16()
vgg16 = models.vgg16(pretrained=True)

 

11, 13, 16, 19개의 Layer를 가진 모델을 사용해 볼 수 있다.

 

 

3. ResNet

이미지 분류 관련해서 가장 유명한 딥러닝 모델이 아닐까 싶다. 이미지넷 대회에서 2015년에 우승한 모델이다. Residual Network의 약자로, 직역하면 잔차 네트워크(?)로 부를 수 있겠다. 딥러닝 모델은 네트워크를 여러 개 쌓을수록 가중치가 사라지는 Gradient vanishing 문제가 발생한다. 따라서, 레이어를 여러 개 쌓을수록 성능이 떨어지거나 개선되지 않는 문제가 밸생한다.
이를 해결하기 위한 방법으로 제안된 것이 ResNet으로 레이어를 통과한 잔차만 학습하기 때문에, Gradient Vanishing문제가 해결된다. 잔차를 학습시키는 방법은 레이어의 입력을 출력에 더하는 것으로, 더 깊은 네트워크를 설계할 수 있다. 이 블록을 Residual 블록이라고 부르고, 이를 여러개 쌓아서 네트워크를 구성한다.
ResNet-18, Resnet-50 같이 뒤에 붙는 숫자는 Layer의 갯수를 의미한다.

import torchvision.models as models
resnet18 = models.resnet18()
resnet18 = models.resnet18(pretrained=True)

 

18외에도 34, 50, 101, 152개의 Layer를 가진 모델을 사용해 볼 수 있다.

 

torchvision의 모델을 사용할 때는 아래 2가지 사항을 주의해야 한다. 일부 모델은 배치 정규화와 같이 학습 및 평가 동작이 다른 모듈을 사용한다. 이 모드를 사용 사이를 전환하려면, model.train()또는 model.eval()를 사용해야 한다.필자는 ResNet을 사용해보았는데 train모드와 eval모드의 예측값이 다르다.

 

책을 보면 학습할 때는 train모드, 추론할 때는 eval모들 사용한다고 한다. eval모드를 사용하면, Dropout한 노드를 모두 사용하고 정규화도 하지 않은 값으로 출력된다. 그래서 학습데이터셋에 적용하면, 다른 스코어값이 나온다. 그래도 스코어의 순서는 동일하기 때문에 예측하는데는 문제가 없다. 오히려 train모드를 사용하면, 학습할 때와 동일한 셋이 들어오지 않으면 예측값이 달라져 문제가 된다. 동일한 데이터라도 배치크기가 다르거나 순서가 달라져도, 값이 바뀌고 클래스간의 스코어 순위도 달라진다.

 

또한, 사전 훈련된 모델을 불러와서 사용할 때는 정해진 입력 이미지를 넣어야 한다. 즉, H와 W가 최소 224 개가 될 것으로 예상되는 3 채널 RGB 이미지의 미니 배치 (3 x H x W)가 필요하다고 한다. 그리고, [0, 1]의 범위에 오도록 정규화가 필요하다. 자세한 내용은 torchvision의 models 페이지를 참조하기 바란다.
( 참조: pytorch.org/vision/0.8/models.html )

 

 

위 외에도 torchvision에서 사용할 수 있는 이미지 딥러닝 모델은 여러가지가 있다. 다른 모델들도 나중에 정리해보도록 하겠다.

댓글()