파이토치 딥러닝 마스터_2장

코넬·2023년 3월 19일
0

ComputerVision_Pytorch

목록 보기
2/10
post-thumbnail

사전 훈련된 신경망

2장에서는...

  • 사전 훈련된 이미지 인식 모델 돌려보기
  • GAN 과 사이클 GAN 을 소개
  • 이미지에서 텍스트 설명을 만들어낼 수 있는 자막 모델
  • 토치 허브에 모델 공유
    를 알아보자 !

우선, 사전 훈련된 인기있는 3가지 모델을 다뤄보자. 그 세가지는

  • 이미지를 이해하고 레이블을 달아주는 모델
  • 진짜 이미지로부터 새로운 이미지를 만들어내는 모델
  • 이미지의 내용을 문법에 맞게 영어 문장으로 설명하는 모델

이 세가지 모델을 대상으로 파이토치로 읽어 실행하는 방법까지 수행해보도록 하면, 이번 장에서 얻어갈 것은 끝 !

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

이번 신경망을 학습할 때 사용할 이미지셋은 이미지 넷(imageNet) 데이터셋 이며, 이는 스탠포드 대학에서 관리하는 14000만개의 이미지 세트이다. 모든 데이터는 대규모 영어 어휘 데이터셋인 워드넷(WordNet) 데이터셋 으로서 계층 관계를 지니는 명사로 레이블되어있다.

이미지넷에서 가져온 이미지들은 입력 이미지로 전처리 되며, 다차원 배열 클래스인 torch.Tensor 의 인스턴스로 변환된다. 높이와 너비를 가진 RGB 이미지이므로 3차원 텐서 로 구성되는데, 3차원 텐서의 특징처럼 삼색 차원, 높이, 크기의 공간으로 이루어진 이미지 차원으로 구성되어있다.

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

입력 데이터의 특징을 확인해 보았으니, 이제 훈련된 신경망을 가져와보자 !
torchvision 프로젝트를 통해서 컴퓨터 비전용 고성능 아키텍쳐를 가져올 수 있다. 이 파트에서는 ResNet과 AlexNet을 가져와서 진행한다.

AlexNet

알렉스넷은 혁신적인 초기 이미지 인식 신경망 중 하나이며, 오늘 날 기준에서 보면 소규모 신경망이지만, 그 당시에는 역사상 기록적인 15.4% 밖의 오차율을 보였던 모델이였다.

다음은 알렉스넷의 구조도이다. 최종적으로 1000개의 확률값이 출력되고, 값 하나 당 하나의 클래스에 해당된다.

ResNet

레즈넷 신경망은 잔차 신경망(residual network) 으로, 가장 두드러지는 특징은 3X3 convolution으로 고정한 채 진행하였다는 점이다. 덕분에 overfitting되는 점 없이 이미지가 깔끔하게 복원되는 것을 결과를 통해 확인할 수 있다.

from torchvision import transforms
preprocess = transforms.Compose([
        transforms.Resize(256),
        transforms.CenterCrop(224),
        transforms.ToTensor(),
        transforms.Normalize(
            mean=[0.485, 0.456, 0.406],
            std=[0.229, 0.224, 0.225]
        )])

사이즈 조정 - 중심으로부터 크롭 - 다차원 배열 텐서 형태로 전환 - RGB 정규화 를 진행하는 형태로 코드를 넣어준다.
이 후

renet.eval()

를 진행하면 추론을 수행한다. (훈련된 모델에 새로운 데이터를 넣어 결과를 만들어낸다.) eval 모드가 설정되었으니, 추론을 실행해보면

out = resnet(batch_t)
out
tensor([[-3.4803e+00, -1.6618e+00, -2.4515e+00, -3.2662e+00, -3.2466e+00,
         -1.3611e+00, -2.0465e+00, -2.5112e+00, -1.3043e+00, -2.8900e+00,
         -1.6862e+00, -1.3055e+00, -2.6129e+00, -2.9645e+00, -2.4300e+00,
         -2.8143e+00, -3.3019e+00, -7.9404e-01, -6.5183e-01, -1.2308e+00,
         -3.0193e+00, -3.9457e+00, -2.2675e+00, -1.0811e+00, -1.0232e+00,
         -1.0442e+00, -3.0918e+00, -2.4613e+00, -2.1964e+00, -3.2354e+00,
         -3.3013e+00, -1.8553e+00, -2.0921e+00, -2.1327e+00, -1.9102e+00,
         -3.2403e+00, -1.1396e+00, -1.0925e+00, -1.2186e+00, -9.3332e-01,
         -4.5093e-01, -1.5489e+00,  1.4161e+00,  1.0871e-01, -1.8442e+00,
         -1.4806e+00,  9.6227e-01, -9.9456e-01, -3.0060e+00, -2.7384e+00,
         -2.5798e+00, -2.0666e+00, -1.8022e+00, -1.9328e+00, -1.7726e+00,
         -1.3041e+00, -4.5848e-01, -2.0537e+00, -3.2804e+00, -5.0451e-01,
         -3.8174e-01, -1.1147e+00, -7.3998e-01, -1.4299e+00, -1.4883e+00,
         -2.1073e+00, -1.7373e+00, -4.0412e-01, -1.9374e+00, -1.4862e+00,
         -1.2102e+00, -1.3223e+00, -1.0832e+00,  7.9207e-02, -4.1344e-01,
         -2.7477e-01, -8.5399e-01,  6.0365e-01, -8.9196e-01,  1.4761e+00,
         -2.6427e+00, -3.6478e+00, -2.7066e-01, -1.2360e-01, -2.2445e+00,
         -2.3425e+00, -1.4430e+00,  2.5264e-01, -1.0588e+00, -2.8812e+00,
         -2.5145e+00, -2.2579e+00,  4.1647e-01, -1.3463e+00, -1.6449e-02,
         -2.8798e+00, -5.5658e-01, -1.3859e+00, -2.9352e+00, -1.8880e+00,
         -4.2244e+00, -2.9742e+00, -2.0298e+00, -2.3869e+00, -2.7324e+00,
         ....
         
          7.4987e-01,  3.8842e-02, -1.7622e+00,  1.9534e+00,  4.5175e-01,
          1.2086e+00,  7.3219e-01, -1.0001e+00,  1.2820e-01, -3.7380e-01,
          9.6213e-02,  3.2060e+00,  6.5023e-01, -1.1252e-01,  8.9641e-01,
         -5.2855e-02, -1.1584e+00,  1.4922e-01,  3.7309e-01,  8.7084e-01,
         -1.9354e+00,  1.0733e-01, -1.5175e+00, -1.8582e+00, -3.8437e+00,
          1.8629e-01, -2.9438e+00,  5.4171e-01, -7.8057e-01, -2.6016e+00,
         -4.4594e+00,  5.5604e-01, -1.3140e+00, -3.8407e+00, -7.5988e-01,
         -5.7457e-01, -2.5448e+00,  2.3831e+00,  6.1368e-01,  4.8296e-01,
          2.8674e+00, -3.7442e+00,  1.5085e+00, -3.2500e+00, -2.4894e+00,
         -3.3541e-01,  1.2856e-01, -1.1355e+00,  3.3969e+00,  4.4584e+00]],
       grad_fn=<AddmmBackward>)

4450만개의 파라미터가 연산되어 1000개의 스코어를 만들어 냈고 점수는 각각 클래스에 대응된다. 여기서 높은 클래스의 레이블만 ㅊ자아내면된다.

_, index = torch.max(out, 1)

파이토치의 max 함수를 사용하여 텐서에서의 최댓값과 이 최댓값이 들어 있는 부분의 인덱스를 출력한다.

percentage = torch.nn.functional.softmax(out, dim=1)[0] * 100
labels[index[0]], percentage[index[0]].item()

인덱스가 단순한 파이썬 숫자가 아닌 1개 요소를 가진 1차원 텐서이며, labels 리스트의 인덱스로 사용하기를 원하는 실제 정수 값을 얻기 위해 index[0]을 사용한다. softmax를 사용하여 출력값을 정규화까지 진행해주면 정확도 확률이 출력된다.

('golden retriever', 96.29334259033203)

추가적으로, 첫번째 결과 뿐만아니라 다음 결과까지도 출력가능한다. sort함수를 통해서 오름차순, 내림차순 정의까지 가능하다.

_, indices = torch.sort(out, descending=True)
[(labels[idx], percentage[idx].item()) for idx in indices[0][:5]]

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

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

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

GAN의 과정을 간단히 진행하면, 생성자 신경망이 실제 그림과 유사하도록 베끼는 그림을 만들기 시작한다. 식별자 신경망이 이 그림이 실제 그림인지, 조작한 이미지인지를 판단해준다. 훈련 과정이 진행됨에 따라서 식별자로부터 얻은 정보로 생성자는 점점 개선되고, 훈련이 끝날 즈음이면 생성자는 그럴싸한 가짜 이미지를 만들며, 식별자는 더 이상 진짜와 가짜를 구분할 수 없게된다.. (신기하지?)

여기서 중요한 점은, 식별자나 생성자의 승리라는 명확한 판단은 없으나, 두 신경망 각각에서 상대의 출력값을 기준으로 신경망을 훈련시켜 각 신경망의 파라미터를 최적화한다는 점이다.

사이클 GAN , 들어봤니?

GAN의 개념을 발전시킨 것이 Cycle GAN 이다. 사이클 GAN은 훈련셋에서 매칭된 쌍을 제공하지 않아도 한 도메인에 대한 이미지를 다른 도메인으로 바꿔준다.

서로 순환 구조가 가능하기 때문에 사이클 GAN이라고 부르며, 첫 번째 생성자는 다른 이미지 분포 값을 가진 그림에서 시작하여 목표에 해당하는 얼룩말 이미지의 분포 값과 일치하는 이미지를 만들도록 학습한다. 식별자는 여기서 이미 목표값이 얼룩말이기 때문에, 만들어진 그림이 진짜인지 가짜인지 구분하지 못하게 된다 !

동시에 만들어진 가짜 얼룩말 사진이 다른 생성자로 전달되어 맞은편의 식별자가 판별하도록 보내면, 이게 진짜 말인지 가짜 말인지 판별하기 어렵게 되는것이 한 사이클이된다. 이렇게 사이클을 만듦으로써 훈련 과정에서 문제가 된 GAN의 안정화 이슈를 해결할 수 있다.

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

이 신경망의 경우, 순환 신경망(recurrent network) 를 사용하게 되는데, 이는 숫자로 기술된 정보로 연관된 문장을 만드는 역할을 한다. 두 모델은 모두 이미지- 자막 쌍으로 훈련된다. 순환 신경망을 사용함으로써 단어를 연속적으로 나열하여 문장을 만들듯 앞에서 만들어진 단어가 다음 단어에 영향을 주게 된다.

뉴럴 토크2

뉴럴토크(NeuralTalk) 는 신경망을 이용한 영상 분석 프로그램이다. 카메라를 통해 보이는 걸 인간의 두뇌 구조를 컴퓨터로 흉내 내는 걸 목표로 하는 신경망을 통해 인식, 곧바로 텍스트로 변환해서 설명해주는 것이다.


이렇게 총 3가지의 신경망 모델들을 맛보고, 원리를 확인할 수 있는 시간을 가져봤다. 앞으로의 파이토치 학습을 통해 지금까지 봤던 모델들을 더 세밀하게 뜯어볼 것이니 다음 챕터로 바로 넘어가보도록하자 !!

출처 : 파이토치 딥러닝 마스터

profile
어서오세요.

0개의 댓글