GAN 27

9. MSE 손실, BCE 손실

GAN을 훈련할 때, 제일 이상적인 상태는 판별기와 생성기가 균형을 이룬 상태이다. 이렇게 되면 판별기는 더는 생성된 데이터와 실제 데이터를 구별하지 못한다. 이 균형이 도달했을 때 판별기의 손실이 어떻게 되는지 확인해보자. MSE 손실 평균제곱오차 손실의 정의는 간단하다. 출력 노드에서 나온 값과 원하는 목푯값 사이의 차이를 계산하면 된다. 이 오차를 제곱한다면 값은 항상 양이다. 평균제곱오차는 이 제곱한 오차들의 평균이다. 판별기의 결과가 0.5인 이유는 데이터가 생성된 것인지, 진짜인지 양쪽 다 같은 크기로 잘 판단할 수 없다는 의미이다. 출력이 0.5이고 목표가 1이라면 오차는 0.5일 것이다. 반대로 목표가 0이면 오차는 -0.5이다. 두 오차 모두 제곱하면 결과는 0.25가 된다. 따라서 균형..

GAN/이론 2021.11.08

8. 조건부 GAN

앞에서 개발한 MNIST GAN은 굉장히 다양한 범위의 이미지들을 만들었다. 이 사실은 상당히 고무적인데, GAN 설계 시 부딪히는 지속적인 문제가 바로 다양성 없이 이미지를 생성하는 모드 붕괴이기 때문이다. GAN이 생성하는 어떻게든 이미지를 단일한 클래스로 고정한 채로 다양한 이미지를 생성할 수 있다고 하면 상당히 유용할 것이다. 조건부 GAN 구조 훈련된 GAN 생성기가 주어진 클래스에 해당하는 이미지를 생성하게 하려면, 일단 무슨 클래스를 목표로 하는지 생성기에 알려줘야 한다. 판별기는 클래스 레이블과 이미지 사이의 관계를 학습해야 한다. 판별기 이미지 픽셀 데이터와 클래스 레이블 정보를 동시에 받도록 판별기를 업데이트 해야 한다. 간단한 방법은 forward() 함수에서 이미지 텐서와 레이블 텐..

GAN/이론 2021.11.08

7. 합성곱 GAN (전치 합성곱)

이번에는 지금까지 만들어온 일명 CelebA GAN을 기반으로, 다음 두 가지 문제를 중심적으로 해결하는 모델을 만들어보겠다. 1. 이미지가 약간 불명확하다. 부드럽게 이어져 있어야 할 공간들이 고대비 픽셀로 채워져 있다. 2. 완전 연결 신경망은 꽤 많은 메모리를 사용한다. 어느 정도 큰 이미지를 대상으로 훈련한다면 GPU의 한계를 넘어서서 훈련이 어려울 수 있다. 판별기 네트워크 class Discriminator(nn.Module): def __init__(self): # initialise parent pytorch class super().__init__() # define neural network layers self.model = nn.Sequential( # expect input of ..

GAN/이론 2021.11.06

6. 얼굴 이미지(HDF5 데이터 형식, GPU 가속)

이번에는 GAN을 훈련해 사람의 얼굴을 생성해보겠다. CelebA 데이터셋 GAN 훈련에서 가장 큰 난관은 훈련하는 데에 피룡한 충분한 이미지를 확보하는 일이다. 사실 사람 이미지 10~100개만으로 GAN을 훈련할 수는 없다. 다행히도 굉장히 인기 있는 데이터셋인 CelebA 데이터셋을 이용할 수 있다. 계층적 데이터 형식 데이터를 특정 형식으로 바꾸면 좀 더 파일 접근일 용이하게 하고 반복에도 강하게 할 수 있다. 이 형식은 HDF5이다. HDF5에서 5는 버전을 가리키며 HDF는 계층적 데이터 형식(Hierarchical Data Format)을 뜻한다. 이 포맷은 용량이 매우 큰 데이터에 효과적으로 접근하기 위해 만들어진 성숙한 데이터 형식으로, 과학이나 공학 응용 분야에서 널리 쓰인다. HDF5..

GAN/이론 2021.11.06

5. 손으로 쓴 숫자 훈련(2)

모드 붕괴 모드 붕괴(model collapse)현상은 GAN을 훈련할 때 자주 맞닥뜨리는 현상이다. 모드 붕괴가 일어나면 생성기는 오직 하나만 만들게 되거나, 선택지의 극히 일부만 만들게 된다. 모드 붕괴가 왜 발생하는지에 대한 하나의 그럴듯한 이론은, 생성기가 판별기보다 더 앞서간 후에 항상 실제에 가깝게 결과가 나오는 '꿀 지점'을 발견하여 그 이미지를 계속 만들어내게 된다는 것이다. 이 현상을 완화하는 방법을 빠르게 생각해보면, 판별기를 생성기보다 좀 더 자주 훈련시키는 것이다. 하지만 사실 훈련의 양보다는 질이 더 중요하다. GAN 훈련 성능 향상하기 1. 이진 교차 엔트로피 BCELoss() 를 이용해 평균제곱오차 MSELoss() 손실함수를 대체하는 방법이다. 이는 MSELoss() 보다 훨..

GAN/이론 2021.11.03

4. 손으로 쓴 숫자 훈련 (1)

전체적인 구조는 위와 같다. 생성기의 역할은 동일한 크기의 이미지를 만드는 것이다. import torch import torch.nn as nn from torch.utils.data import Dataset import pandas, numpy, random import matplotlib.pyplot as plt 데이터셋 클래스 csv 파일에서 MNIST 데이터를 불러와 본격적으로 사용하기 위해 파이토치의 torch.utils.data.Dataset 클래스를 사용한다. 이 클래스는 데이터를 텐서로 묶고 각 레코드마다 정답 레이블, 0부터 1사이의 값으로재조정된 이미지 픽셀 값, 원핫 인코딩이 된 텐서를 반환한다. class MnistDataset(Dataset): def __init__(self,..

GAN/이론 2021.11.03

3. 단순한 1010 패턴

이미지를 생성하는 것보다 간단한 작업으로 먼저 '1010 패턴' 형식의 값을 생성하는 GAN을 구현해보자. import torch import torch.nn as nn import numpy as np import pandas import matplotlib.pyplot as plt 실제 데이터 소스 실제 데이터에 대하여 1010패턴을 반환하는 함수는 다음과 같이 만들 수 있다. def generate_real(): real_data=torch.FloatTensor([1,0,1,0]) return real_data 실제 세계의 데이터는 정확히 딱 떨어지는 값일 확률이 거의 없기 때문에, 약간의 임의성을 추가하여 이 함수를 조금 더 실제 상황과 가깝게 만들어보자. import random def gene..

GAN/이론 2021.10.31

2. GAN 개념

이미지 생성하기 기본적으로 신경망은 정보를 감소하고 정제하고 축약하는 데에 사용된다. MNIST 분류기가 좋은 예이다. 784개 값을 입력으로 받아서 10개의 출력으로 변환하는 것이니, 처음보다 정보량이 감소했다. 이 네트워크를 그러면 반대로 뒤집으면, 이는 값을 감소시키는 행위가 아니라 좀 더 사이즈가 큰 데이터로 변환하는 것이나 마찬가지일 것이다. 이 경우, 레이블을 주면 신경망을 통해 이미지가 생성되는 것이다. 이 백쿼리를 통해서 만들어진 이미지는 다음과 같은 특성을 가졌다. 1. 같은 원핫 인코딩 벡터면 같은 결과를 출력한다. 2. 그 레이블을 나타내는 모든 훈련 데이터의 뭔가 평균적인 이미지가 나온다. 적대적 훈련 2014년 이언 굿펠로는 뭔가 다른 종류의 네트워크 구조를 발표했다. 진짜 고양이..

GAN/이론 2021.10.31

1. CUDA 기초

GPU에는 정말 많은 연산 코어들이 존재한다. 천 개 이상의 코어가 오늘날에는 일반적이다. 엔비디아는 GPU 시장의 리더 역할을 하고 있는 기업이다. 강력한 하드웨어 가속 기능을 갖춘, 머신러닝 연구에 표준적인 소프트위어 툴을 제공한다. 이 소프트웨어 프레임워크를 CUDA라고 부른다. GPU에서 텐서를 만들고 싶으면 타입을 torch.cuda.FloatTensor로 변경한다. x.device를 통해서 어떤 장치에 텐서가 올라가 있는지도 확인할 수 있다. 결과를 보면 CUDA에 올바르게 올려져 있는 것을 확인할 수 있다. 마지막으로, 노트북 처음에 CUDA를 사용하게끔 선언하고 이를 확인하는 코드를 살펴보겠다. 이 코드는 파이토치의 device에 대한 표준적인 코드 처리이다. GPU를 기본값으로 설정하고,..

GAN/이론 2021.10.31