본문 바로가기
ML & DL/Deep Learning with PyTorch

[PyTorch] 사전 훈련된 신경망

by Glory_Choi 2023. 2. 20.
반응형

https://product.kyobobook.co.kr/detail/S000061353646

 

파이토치 딥러닝 마스터 | 엘리 스티븐스 - 교보문고

파이토치 딥러닝 마스터 | 파이토치 핵심 개발진이 직접 집필한 책으로, 최고 실무자가 바로 옆에 앉아서 딥러닝의 기초부터 실제 프로젝트 활용까지, 모델 성능 평가와 개선 방안을 차근차근

product.kyobobook.co.kr

이 글은 파이토치 딥러닝 마스터를 정리한 내용입니다.

 

이미지를 인식하는 사전 훈련된 신경망

이미지 인식을 위해 사전 훈련된 신경망 가져오기

사전 훈련된 모델은 torchvison.models에 있고, from torchvision import models를 import 한 후 dir(models)를 통해 모델들을 확인할 수 있다. 

  • 알렉스넷(AlexNet)
  • 레즈넷(resnet)
  • 인셉션(Inception)

알렉스넷(AlexNet)

알렉스넷(AlexNet)은 오늘날 기준에서 최신 모델과 비교하면 소규모 신경망이라고 할 수 있다. 상대적으로 작지만, 실제 동작하는 신경망을 가볍게 살펴보고 새 이미지를 사전 훈련된 모델에 넣어보기에는 최적이다.

알렉스넷의 구조는 위와 같다. 먼저 각 블럭이 여러 개의 곱셈과 덧셈으로 이뤄져 있고 각각을 하나의 필터로 생각할 수 있다. 한 개 혹은 그 이상의 이미지를 입력으로 받고 다른 형태의 이미지로 변환하여 출력하는 함수다. 중간 단계의 데이터 변환부가 각 예제와 기대값을 사용한 훈련을 통해 만들어진다.

입력 이미지가 왼쪽에서 들어오고 다섯 층의 필터를 줄줄이 거쳐가며 각 단계에서 변환된 이미지가 출력된다. 이미지들은 그림의 박스 아래에 적힌 숫자 크기로 줄어든다. 마지막 필터 다음에는 4096개의 1차원 벡터가 있고 최종으로 1000개의 확률값이 출력되는데 값 하나가 한 클래스에 해당한다.

 

알렉스넷 아키텍처에 입력 이미지를 넣어 실행하려면 먼저 다음과 같이 AlexNet 클래스로 인스턴스를 만든다.

여기서 alexnet은 알렉스 넷 아키텍체를 실행하는 객채로, 지금 당장은 이 아키텍처의 세부 사항을 이해할 필요가 없다.

 

레즈넷(resnet)

resnet101을 사용해서 계층 수가 101개인 컨볼루션 신경망을 만들어볼 것이다.

레즈넷 신경망의 인스턴스를 한번 만들어보자. 함수에 인자를 넣어 1000개의 카테고리로 구분한 120만 개의 이미지 데이터셋인 이미지넷(ImageNet)으로 훈련시킨 resnet101의 가중치를 내려받자.

레즈넷을 사용해보겠다.

우선 예제코드에 맞게 이미지를 변환하기 위해 torchvision의 transforms를 사용한다.

파이썬 이미지 조작 모듈인 필로우(Pillow)를 사용하기 위해 import한다.

 

Image.open("경로") 경로는 보통 정대경로로 지정한다.

이미지를 출력 해보면 골든 리트리버 한마리가 나온다. 이제 transforms를 통해 전처리 파이프라인을 통과 시키자.

이렇게 만들어진 텐서를 리셰이프하고 잘라낸 후 정규화해서 신경망에 넣을 수 있도록 준비한다.

딥러닝 사이클에서 훈련된 모델에 새로운 데이터를 넣어 결과를 보는 과정을 추론 inference이라고 한다. 추론을 수행하려면 신경망을 eval 모드로 설정해야 한다.

eval 모드로 설정이 완료 되었으니 추론을 해본다.

4450만 개에 이르는 파라미터가 관련된 엄청난 연산이 방금 실행되어 1000개의 스코어를 만들어냈고 점수 하나 하나는 이미지넷 클래스에 각각 대응된다.

이제 점수가 가장 높은 클래스의 레이블만 찾으면 된다.

예측한 순서대로 레이블 리스트를 만들기 위해서는, 출력과 동일한 순서로 나열된 레이블 텍스트 파일을 읽어놓은 후 점수가 높은 출력의 인덱스부터 동일한 인덱스에 있는 레이블을 리스트에 추가하면 된다.

최대값이 들어 있는 부분의 인덱스를 출력하면 golden retriever를 예측한 것을 볼  수 있다.

두번째, 세 번째 등의 결과도 무엇인지 확인하려면

sort 함수를 통해 정렬을 한 후 값과 인덱스를 보여준다.

 

가짜 이미지를 만드는 사전 훈련된 모델

GAN 게임

두 개의 신경망에서 하나는 화가 역할, 다른 하나는 미술사가 역할을 하여 최고의 화가와 최고의 위작 감별사가 되기 위해 서로 경쟁한다.

GAN은 생성적 적대 신경망(Generative Adversarial Network)의 약자로 용어의 순서대로 가짜 작품이 만들어지고, 서로 더 뛰어나기 위해 경쟁하는 신경망이라는 의미이다.

우리 시나리오에서 화가 역할을 하는 것이 생성자(generator) 신경망으로, 임의의 입력에 대해 사실 같은 이미지를 만들어내는 작업을 수행한다. 식별자(discriminator) 신경망은 도덕성을 갖추지 않은 미술 작품 감별사가 되어 생성자가 조작한 이미지인지 실제 이미지인지 말해주는 역할이다.

대부분의 딥러닝 아키텍처와 비교할 때 이례적인 두 개의 신경망을 사용한 이 디자인은 GAN 게임에서, 믿을 수 없는 높은 수준의 결과를 만들어 낸다.

생성자의 궁극적인 목표는 진짜와 가짜 이미지를 구분하지 못하게 식별자를 속이는 것이다. 맨 처음, 식별자는 진짜 그림과 가짜 그림을 쉽게 구분할 수 있다. 훈련 과정이 진행됨에 따라 식별자로부터 얻은 정보로 생성자는 점점 개선된다. 훈련이 끝날 즈음이면 생성자는 그럴싸한 가짜 이미지를 만들며, 식별자는 더 이상 진짜와 가짜는 구별할 수 없다.

두 신경망은 각각 상대의 출력값을 기준으로 신경망을 훈련시켜 각 신경망의 파라미터를 최적화한다.

이 기술은 생성자로 하여금 노이즈 값과 속성등의 조건 시그널만으로 진짜 같은 이미지를 만들어낸다. 잘 훈련된 생성자는 심지어 사람이 보기에도 진짜 같은 이미지를 생성하는 그럴듯한 모델을 학습해낸다.

 

사이클GAN

GAN 개념을 더 흥미롭게 발전시킨 것으로 사이클GAN(CycleGAN)이 있다. 사이클GAN은 훈련셋에서 매칭된 쌍을 제공하지 않아도 한 도메인에 대한 이미지를 다른 도메인으로 바꿔준다. 밀 사진을 얼룩말로 바꾸거나 혹은 반대로 바꾸는 작업에 대한 사이클GAN 워크플로를 나타낸다. 두 개의 개별 생성자 신경망이 있고 마판가지로 두 개의 식별자 신경망도 있다.

첫 번째 생성자는 다른 이미지 분포 값을 가진 그림에서 시작하여 목표에 해당하는 얼룩말 이미지의 분포 값과 일치하는 이미지를 만들도록 학습한다. 그래서 말 사진으로부터 만들어진 이미지가 진짜 얼룩말 사진인지 아닌지를 식별자가 구별하지 못하게 한다. 동시에 만들어진 가짜 얼룩말 사진이 다른 생성자로 전달되어 맞은편의 식별자가 판별하도록 보내는 사이클이 있다. 이렇게 사이클을 만듦으로써 훈련 과정에서 문제가 되었던 GAN의 안정화 이슈를 해결할 수 있다.

각도가 동읽한 말과 얼룩말 사진이 필요하지 않다는 점이 상당히 재미있다. 서로 관련 없는 말과 얼룩말 이미지 모음만으로 충분히 생성자가 학습을 시작할 수 있으며, 이는 지도 학습 설정을 뛰어넘는다. 뿐만 아니라 생성자는 뭘 어떻게 해야 하는지 얼려주지 않아도 사진속 사물의 모습을 어떻게 바꿔야 하는지 배운다. 어떤 게 갈기인지 다리인지 알려주는 시그널이 없어도 동물의 구조에 맞춰 변환 작업을 진행한다.

 

말을 얼룩말로 바꾸는 신경망

사이클GAN 신경망은 이미지넷 데이터셋에 있는 말과 얼룩말 이미지로 훈련된 상태다. 신경망은 이미지의 다른 부분은 최대한 건드리지 않으면서 말 사진을 얼룩말로 바꾸도록 학습한다. 말을 얼룩말로 바꾸는 도구는 인류가 수천년 동안 숨죽여 기다려 왔으며, 이런 변환 작업은 학습에 관여하지 않고서도 복잡한 실세계 프로세스를 모델링하는 사이클GAN의 능력을 보여준다. 물론 GAN 아키텍처가 아직은 제한적이지만, 가까운 미래에는 사람이 영상의 진위 여부를 판별하기 어려워질지도 모른다.

 

장면을 설명하는 사전 훈련된 신경망

마지막으로 살펴 볼 사전 훈련된 신경망은 자연어 모델이다. 자연어와 관련된 모델을 직접 체험하기 위해 뤼티엔 루오가 만든 이미지 캡션 모델을 사용할 것이다. 안드레이 카르파티가 설계한 뉴럴토크2 모델의 구현체로 보면 된다.

모델에게 사진을 보여주면 해당 장면을 설명하는 영어 자막을 만들어 낸다.

캡션 모델은 크게 반으로 나뉜 신경망이 연결되어 있다. 첫 번째는 장면을 숫자로 표현하는 법을 학습하는 신경망으로서, 두 번째 신경망의 입력으로 사용한다. 두 번째 순환 신경망으로 숫자로 기술된 정보로 연관된 문장을 만드는 역할을 한다. 두 모델은 모두 이미지-자막 쌍으로 훈련된다.

반응형