1. 없던 데이터를 만들어낸다, 생성 모델링
- 지금까지 만들었던 모델은 판별 모델링(Discriminative Modeling)이라 부른다.
- 오늘 배울 것은 생성 모델링인데, 이는 말 그대로 없던 데이터를 생성해내는 것이 목표이다.
- 즉, 판별 모델과 생성 모델을 말하자면 아래와 같다.
1) 판별 모델 : 입력된 데이터셋을 특정 기준에 따라 분류하거나, 특정 값을 맞추는 모델
2) 생성 모델 : 학습한 데이터셋과 비슷하면서도 기존에는 없던 새로운 데이터셋을 생성하는 모델
2. Pix2Pix
- Pix2Pix는 간단한 이미지를 입력할 경우 실제 사진처럼 보이도록 바꿔줄 때 많이 사용되는 모델이다.
- 한 이미지를 다른 이미지로 픽셀 단위로 변환한다는 뜻의 Pixel to Pixel을 딴 Pix2Pix로 이름을 붙게 되었다.
3. CycleGAN
- Pix2Pix 이후 발전된 모델이다. 이름에서도 느껴지듯 이 모델은 한 이미지와 다른 이미지를 번갈아 가며 Cyclic하게 변환시킬 수 있다.
- 한 방향으로의 변환만 가능한 Pix2Pix와 달리 CycleGAN은 양방향으로의 이미지 변환이 가능하다. 즉, 실사 이미지를 그림으로 바꾸는 것과 그림을 실사 이미지로 바꾸는 것 두 가지가 모두 가능하다는 것이다.
- 또한, 그림과 사진의 쌍으로 이루어진 데이터셋이 필요했던 Pix2Pix와 달리, CycleGAN은 쌍이 필요 없다.
- 예를 들어 얼룩말을 말로 바꾼다고 했을 경우, 쌍을 이루지 않더라도 그냥 얼룩말이 있는 사진과 말이 있는 사진 각각의 데이터셋만 있다면 CycleGAN을 학습시킬 수 있다.
- 딥러닝에서 쌍으로 된 데이터(paired data)가 필요 없다는 것은 데이터를 구하기 훨씬 쉽고, 라벨을 붙이는 주석(annotation) 비용이 없다는 것을 뜻하니, 굉장한 장점이라 할 수 있겠다.
4. Neural Style Transfer
- Neural Style Transfer는 이미지의 스타일을 변환시키는 기법이다.
- 전체 이미지의 구성을 유지하고 싶은 Base Image와 입히고 싶은 스티알이 담긴 Style Image 두 장을 활용해 새로운 이미지를 만들어 내는 것이다.
- Neyral은 신경망, 즉 딥러닝 기술을 사용했다는 뜻을 가지고 있다.
5. 패션을 디자인하려면? 먼저 패션을 배워야지!
- 오늘은 MNIST의 데이터셋 중 Fashion을 사용할 것이다.
6. 코드로 살펴보기
- 패키지를 로딩하고, 데이터를 불러온다. 해당 데이터는 이미지 데이터이기에 0 ~ 255 사이의 값으로 이루어져있다.
- 데이터를 시각화 해보고, -1 ~ 1사이의 값으로 정규화를 시켜보았다.
- 마지막으로 from_tensor_slices()를 사용하여 텐서플로우의 텐서 자료형의 데이터셋으로 만들었다. (suffle()을 이용하여 섞어 주기도 함)
7. GAN 이해하기
- 가장 간단한 형태의 생성 모델 중 하나는 바로 GAN(Generative Adversarial Network)이다.
- GAN은 2014년에 처음 나온 네트워크로, 발표된 후 독특하면서도 직관적인 아이디어로 많은 인기를 얻었고 지금까지도 굉장히 많은 연구가 이루어지고 있는 모델이다.
- GAN에는 두 가지 네트워크가 있다.
1) 생성자(Generator) : 아무 의미 없는 랜덤 노이즈로부터 신경망에서의 연산을 통해 이미지 형상의 벡터를 생성해 낸다. 즉, 무에서 유를 창조하는 것과 같은 역할을 한다.
2) 판별자(Discriminator) : 기존에 있던 진짜 이미지와 생성자가 만들어낸 이미지를 입력받아 각 이미지가 Real인지, Fake인지에 대한 판단 정도를 실숫값으로 출력한다.
- GAN을 처음 발표했던 논문에서는 이 두 네크워크를 다음과 같이 말했다.
1) 생성자는 위조지폐를 만들어 내는 팀이고, 판별자는 위조 지폐범을 잡아내는 경찰이다.
2) 이 두팀 간의 경쟁이 둘 모두를 성장하게 된다. 궁극적인 목표는 진짜 지폐와 구분될 수 없는 위조지폐를 만들어 내는 것이다.
- GAN 중 특히 합성곱 층(Convolutional Layer)으로 이루어진 딥러닝 모델을 DCGAN(Deep Convolutional GAN)이라고 한다.
- DCGAN은 균등 분포에서 추출한 100개의 난수를 입력받아 이미지를 출력한다.
- 그 외에도 Variational Autoencoders(VAEs), Aoturegressive models(ex. Pixel RNN) 등의 기법이 있다.
8. 생성자 구현하기
- 오늘 구현해볼 모델은 위에서 언급했던 DCGAN이다.
- DCGAN은 GAN의 개념이 처음 소개된 1년 반 이후 발표된 논문으로서, 이전의 GAN을 더욱 발전시켜서 훨씬 그럴듯한 고화질 이미지 생성을 이루어낸 첫 번째 논문으로 평가받고 있다.
- 이후 발표된 많은 GAN 기반 이미지 생성모델들은 대부분 DCGAN모델을 발전시킨 형태라고 할 수 있으므로, 그 구조를 상세히 살펴보고 구현 연습을 하는건 매우 의미 있다고 생각한다.
- 모델 구현은 Keras Sequential API를 활용했다. 해당 모델 구현은 코드 실습으로 이루어졌다.
- 여기서 가장 중요한 레이어는 Conv2DTranspose 레이어이다. Conv2DTranspose 층은 일반적인 Conv2D와 반대로 이미지 사이즈를 넓혀주는 층이다.
- 또한, 레이어의 사이사이에 BatchNormalization 레이어를 사용하여 신경망의 가중치가 폭발하기 않도록 가중치 값을 정규화 시켰고, LeakyReLU를 사용했다.
- 마지막 활성함수는 tanh를 사용해서 위에서 -1 ~ 1 이내의 값으로 픽셀값을 정규화시켰던 데이터셋과 동일하게 했다.
- 생성자의 입력 벡터는 (batch_size, 100)으로 이루어진 노이즈 벡터를 받는다.
9. 판별자 구현하기
- 판별자는 앞서 말했듯 가짜 이미지와 진짜 이미지를 입력받으면 각 이미지 별로 "진짜라고 판단하는 정도"의 값을 출력한다.
- 그래서 입력은 이미지의 크기로 받고, 출력은 단 하나의 숫자(진짜라고 판단하는 정도)가 나올 것이다.
- 생성자와 마찬가지로 구현은 코드 실습으로 이루어졌다.
- 여기서는 Conv2DTranspose층을 사용해서 이미지를 키워나갔던 생성자와 반대로, 판별자는 Conv2D 층으로 이미지의 크기를 점점 줄여나갔다.
- 마지막에는 Flatten 층을 사용해 3차원 이미지를 1차원으로 쭉 펴서 벡터로 변환했다.
10. 손실함수와 최적화 함수
- 생성자와 판별자 네트워크를 구현했으니 학습을 시켜야 한다. 모델을 학습 시키기 위해서는 재료가 필요하다.
- 딥러닝 모델이 학습하기 위해서 꼭 필요한 두 가지는, 손실함수(loss function)와 최적화 함수(optimizer)이다.
- GAN은 손실함수로 교차 엔트로피(Cross Entropy)를 사용한다.
1) 교차 엔트로피는 분류 모델을 설계할 때 많이 사용했던 손실함수이다. 점점 가까워지기 원하는 두 값이 얼마나 큰 차이가 나는지를 정량적으로 계산할 때 많이 쓰인다.
2) 특히 판별자는 한 개의 이미지가 가짜인지 진짜인지 나타내는 2개 클래스 간 분류 문제를 풀어야 하므로, 이진 교차 엔트로피(binary cross entropy)를 사용할 것이다.
- 실습에서는 생성자와 판별자의 loss 값과 accuracy 값을 계산하는 함수를 만들었다.
- 오늘 최적화 함수로는 Adam 최적화 기법을 활용했다.
1) 중요한 하이퍼 파라미터인 "learning rate"는 0.0001로 설정했는데, 여러 가지 값으로 바꾸어 가며 학습을 해볼 필요가 있다.
2) 또한 중요한 점 한 가지는 생성자와 판별자는 따로따로 학습을 진행하는 개별 네트워크이기 때문에 optimizer를 따로 만들어 줘야한다.
11. 훈련과정 설계
- 여기서는 여러가지의 함수를 만들고, 최종적으로 훈련 함수를 만들었다.
- 하나의 미니배치 당 진행할 train_step 함수를 먼저 만들었다.
1) 여기서 @tf.function 데코레이터를 이용했다. 이 데코레이더가 사용된 함수에 입력된 입력은 Tensorflow의 graph 노드가 될 수 있는 타입으로 자동변환된다.
- 위의 함수에서 한 단계씩 학습할 train_step과 함께 일정 간격으로 학습 현황을 볼 수 있는 샘플을 생성하는 함수도 만들었다.
- 또한, loss와 accuracy 그래프를 시각화해 보아야 하므로 해당 함수도 만들었다.
- 마지막으로 정기적으로 모델을 저장하기 위한 checkpoint 함수도 만들었다.
12. 학습시키기
- 위에서 만든 함수들을 이용해 trian 함수를 만들었다.
- train 함수를 이용해서 모델을 학습시키고, 학습과정을 gif 파일로 만들어서 시각화도 해보았다.
13. 프로젝트 : CIFAR-10 이미지 생성하기
- 앞서 배운 내용을 바탕으로 CIFAR-10의 파일을 이용해서 모델을 만들어 본다.
- 프로젝트를 진행하면서 생성된 샘플 이미지, 학습 과정 그래프 등을 통해 이전 훈련 과정의 문제점을 분석해 본다.
- 그리고 모델구조 또는 학습 과정을 개선한 내역과 그 결과(샘플 이미지, 학습과정 그래프 포함)를 함께 제출한다.
'공부 > AIFFEL' 카테고리의 다른 글
Exploration 12 : 프로젝트 시각화(gif파일) - 번호는 과제파일의 번호와 일치함. (0) | 2021.02.25 |
---|---|
FUNDAMENTAL 23. 파이썬으로 이미지 파일 다루기 (0) | 2021.02.24 |
풀잎스쿨 - DeepML(CS231N) Lec. 09 (0) | 2021.02.22 |
FUNDAMENTAL 22. 딥러닝 레이어의 이해 (1) Linear, Convolution (0) | 2021.02.22 |
FUNDAMENTAL 21. SQL을 이용해 DB와 대화해보자 (0) | 2021.02.19 |