이 챕터의 목적은 PGGAN을 이용하여 256x256 해상도의 강아지, 고양이 생성모델을 만드는 것입니다.
먼저 프로젝트를 구현해보기 전에 PGGAN에 대한 이해가 필요합니다.
PGGAN에 대한 이해가 부족하신 분은 아래 링크를 참고하세요.
(https://simplepro.tistory.com/44)
모델 구조는 다음 링크를 참고하였습니다.
(https://github.com/aladdinpersson/Machine-Learning-Collection/tree/master/ML/Pytorch/GANs/ProGAN)
이 글에서는 모델 구조만 설계합니다.
먼저 논문에서 사용한 모델 구조를 봐보도록 하겠습니다.
Generator 구조를 보면 n_channels가 512, 512, 512, 512, 256, 128, 64, 32, 16 순으로 변하는 것을 볼 수 있습니다.
이 프로젝트에서는 128, 128, 128, 128, 64, 32, 16 순으로 사용할 것입니다.
먼저 Equalized Learning Rate 기법을 적용시켜야 합니다. 위의 WSConv2d가 Equalized Learning Rate 기법을 적용한 Conv Layer 입니다. conv.weight은 표준정규분포로 초기화하고, bias는 0으로 초기화합니다. 그리고 forward 해줄 때마다 스케일을 낮추어줍니다.
그 다음으로는 PixelNorm 층을 구현해야합니다. 채널별로 제곱평균을 구하고 sqrt를 씌어줍니다. (epsilon은 x / 0이 되지 않도록 방지합니다)
KNN 알고리즘을 이용하여 UpSampling을 할 수 있도록 합니다.
더 쉽게 모델을 설계할 수 있도록 블록형태로 묶어줍니다.
step은 각 층의 index를 의미하기도 합니다. step=0이면 resolution은 4x4이고, 그에 해당하는 층을 가리키게 됩니다.
이제는 생성자를 설계합니다.
처음 블록만 다르고 나머지는 모두 같은 형태의 블록입니다.
처음에는 (z_dim, 1, 1) shape으로 인풋데이터가 들어오므로 ConvTranspose2d를 이용하여 4x4 resolution으로 만들어줍니다.
prog_blocks[i]의 output shape은 (channel_list[i], 4*2^(i), 4*2^(i))입니다.
torgb_layers[i]은 resolution은 유지한채로 채널만 channel_list[i] -> 3으로 변환합니다.
fade_in 메소드는 생성된 이미지와 업샘플링된 이미지를 fade in한 결과를 반환합니다.
이제 forward 메소드를 살펴봅시다. 처음에 (z_dim, 1, 1) shape인 input을 4x4 resolution으로 변환합니다.
만약 steps가 0이라면 바로 torgb_layers를 통해 결과를 반환합니다. (4x4 resolution에서는 fade in을 할 수 없습니다.)
그리고 prog_blocks를 하나하나 forward하며 마지막 블록까지 forward합니다.
마지막 prog_blocks의 scaled값의 채널은 끝에서
두번째 블록의 output shape의 채널과 같을 것입니다. 그렇기 때문에 torgb_layers의 끝에서 두번째 블록을 이용하여 rgb로 변환해주어야 하는 것입니다.
반복문을 다 반복한 후의 out값은 그대로 torgb_layers의 마지막 블록을 이용하여 rgb로 변환합니다.
그 후에 fade_in을 하고 그 결과를 반환합니다.
이렇게 생성자 설계는 끝입니다.
다음은 판별자 블록입니다.
생성자와 크게 다를 것이 없기 때문에 설명을 넘어가도록 하겠습니다.
Minibatch Standard Deviation 기법을 적용하기 위한 레이어입니다.
minibatch의 표준편차를 구하고 그 표준편차의 평균을 구합니다. (이는 scalar 형태입니다.)
repeat을 이용하여 각 배치의 마지막 채널에 추가할 수 있도록 합니다.
마지막 채널에 추가하여 반환합니다.
판별자의 구조는 생성자 구조의 대칭 형태입니다.
판별자도 생성자와 같이 fade in 레이어가 존재합니다.
초기에 인풋을 fromrgb_layers를 이용하여 특정 채널로 변경해줍니다.
생성자와 같이 steps가 0이라면 fade in을 적용할 수 없기 때문에 바로 반환해줍니다.
하지만 판별자는 생성자의 대칭구조이기 때문에, 생성자는 마지막에 fade in 적용하는 반면에 판별자는 초기에 첫번째 블록만 forward 시키고 바로 fade in을 적용합니다.
input을 avgpool을 이용하여 downscaled한 후에 fromrgb_layers의 첫번째 블록을 이용하여 prog_blocks의 첫번째 블록을 통과한 output의 shape과 동일하게 맞춰줍니다.
그림으로 보면 위와 같습니다.
fade in을 진행해준 후에 나머지 블록들에 forward를 합니다.
모든 블록에 forward된 결과값을 반환합니다.
이렇게 모델 구조 설계는 끝이 납니다.
다음 글에서는 데이터셋을 알맞게 전처리해보겠습니다.
models.py 코드 - https://github.com/SimplePro/PGGAN/blob/main/models.py
'인공지능 > 실습' 카테고리의 다른 글
PGGAN을 이용한 강아지, 고양이 생성모델 만들기 (2) (0) | 2022.02.28 |
---|---|
PGGAN을 이용한 강아지, 고양이 생성 모델 만들기 (1) (0) | 2022.02.28 |