3. Dev/모델 구현

Pytorch로 GAN 구현하기(+ mnist 데이터)

Honestree 2023. 1. 27. 00:49

1. 수정사항

모델 적절성 판단을 위해 MNIST 데이터셋 추가
https://github.com/Hyunmok-Park/PePe_GAN/pull/1
모델 레이어 일부 수정
https://github.com/Hyunmok-Park/PePe_GAN/pull/2

2. MNIST 적용

2.1 MNIST 데이터셋 추가

모델의 적절성을 판단하기 위해 MNIST 데이터셋을 사용해서 성능을 확인했다. 기존 데이터 로더 코드에 torchvision.dsets.MNIST를 추가하였고, 간단한 정규화만 적용해서 우선 결과를 확인했다.

if dataset == 'mnist':
    transform = transforms.Compose([
        transforms.ToTensor(),
        transforms.Normalize(0.5, 0.5)
    ])
    dataset = dsets.MNIST(root=f'{data_path}/MNIST_data/',
                          train=True,
                          transform=transform,
                          download=True)

기존과 동일한 모델을 사용하여 학습한 결과, 어느 정도 숫자가 생성되었지만 분명하지 않은 데이터가 대부분이었다. 그래서 모델 자체가 한계가 존재한다고 판단했고 일부 수정과정을 거쳤다.

2.2 성능개선

성능 개선을 위해 수정한 사항은 크게 2가지였다. 첫번째는 생성자, 판별자에 레이어를 추가 및 변경하였다. 기존에는 2-layer ReLU를 사용했지만 4-layer LeakyReLU(0.2)를 사용했으며 생성자, 판별자의 특성에 맞게 점진적으로 유닛수를 증가/감소하도록 조절했다. 두번째 수정사항은 데이터 전처리(정규화)이다. 기존에는 mean / val = 0 / 1로 전처리했지만 이럴 경우 텐서의 값이 0 ~ 1사이의 값이 나왔다. 생성자의 마지막 레이어에 tanh를 사용하는데 이럴 경우 서로 조화를 이루지 못한다. 그래서 더 찾아본 결과 mean / val = 0.5 / 0.5 로 조절해야 하는 것을 확인했다. 이 부분에 대해서는 torchvision.transforms 의 기능을 더 찾아봐야 할 것 같다. 위의 수정사항을 적용하고 파라미터 튜닝을 거친 결과, 기존보다 훨씬 명확한 이미지를 얻을 수 있었다.

 

3. PePeGAN

3.1 학습 데이터 추가

성능 개선을 위해 학습 데이터를 기존 36개에서 846개로 대폭 증가시켰다. 일부 겹치거나 비슷한 이미지도 있었지만 현재로서는 이게 최선이었다. 크롬 브라우저의 Image Downloader 라는 플러그인을 사용하면 쉽게 대량의 이미지를 얻을 수 있다. 수차례의 하이퍼 파라미터 튜닝을 거친 결과 아래의 결과를 얻을 수 있었다. 여전히 불만족스러운 결과지만 눈과 입이 나타났다는 큰 소득이 있었다. 구글링을 해본 결과, GAN으로 생성한 이미지가 원본 이미지들보다 다소 어둡게 나오는 경우가 많이 있는 것 같다. 아마 이 부분까지 해결하려면 학습 데이터도 더 세밀하게 수집하고 모델도 다른 장치를 추가해야 할 것 같다.

눈, 입이 나타났다...!
epoch이 증가하면서 조금씩 달라지는 모습

4. 마치며

대략 2주의 기간동안 vanilla GAN 구조로 데이터 수집, 학습, 최적화까지 직접 진행해보았다. 비록 결과가 완벽하지는 않지만 생성모델에 입문할 수 있는 좋은 기회였다. 최적화를 진행하며 생성된 이미지를 보면서 일차적으로 생성된 이미지를 다시 입력으로 사용할 수 있지 않을까라는 생각했는데 이게 결국 diffusion이 아닐까라는 생각이 들었다. GAN을 여러번 중첩하면서 거기에 마코브 특성을 결합한게 현재의 diffusion과 유사한 개념이 아닐까... 다른 프로젝트를 위해 PePeGAN은 한동안 보류할 예정이지만 완벽하게 선명한 페페를 얻을때까지 다른 생성모델들도 자세히 공부하면서 진행하도록 하겠다.