728x90
반응형

pix2pix같은 이전의 스타일 트랜스퍼는 훈련 세트의 각 이미지가 소스(source)와 타깃(target) 도메인에 모두 존재해야 한다.

 

 

CycleGAN 정의

gan = CycleGAN(
    input_dim = (128, 128, 3)
    ,learning_rate = 0.0002
    , buffer_max_length = 50
    , lambda_validation = 1
    , lambda_reconstr = 10
    , lambda_id = 2
    , generator_type = 'unet'
    , gen_n_filters = 32
    , disc_n_filters = 32
    )
  • 일반적으로 CycleGAN 생성자는 U-Net 또는 ResNet(residual network) 두 형태 중 하나를 선택한다.
  • pix2pix 논문에서 저자들은 U-Net 구조를 사용했지만 CycleGAN에서는 ResNet 구조로 바꾸었다.

 

 

 

생성자(U-Net)

  • VAE와 비슷한 방식인 U-Net은 다운샘플링과 업샘플링으로 구성된다.
  • 다운샘플링은 입력이미지를 공간 방향으로 압축하지만, 채널 방향으로는 확장한다.
  • 업샘플링은 공간 방향으로 표현을 확장시키는 반면 채널의 수는 감소시킨다.
  • VAE와는 달리 U-Net 네트워크의 다운샘플링과 업샘플링 사이에는 크기가 동일한 층끼리 연결된 스킵 연결(skip connection)이 있다.
  • VAE는 선형적으로 데이터가 입력에서부터 출력까지 층을 차례대로 거쳐 네트워크를 통과한다.
  • U-Net은 스킵 연결이 있기 때문에 네트워크에 있는 지름길로 뒤쪽 층에 정보를 전달한다.
  • 네트워크의 다운샘플링에 각 층 모델은 점점 이미지가 무엇인지를 감지하지만 어디에 있는지 위치 정보는 잃는다.
  • U-Net의 꼭짓점에 있는 특성 맵은 이미지가 무엇인지 이해할 수 있지만 어디에 있는지는 알지 못할 것이다.

 

Concatenate 층

  • 스킵 연결을 만들기 위한 새로운 층
  • 단순히 특정 축을 따라서 여러 층을 합친다.
  • U-Net에서는 Concatenate 층을 사용해 업샘플링 층과 동일한 크기의 출력을 내는 다운샘플링 쪽의 층을 연결한다.

 

InstanceNormalization 층

  • CycleGAN의 생성자는 BatchNormalization 층 대신 InstanceNormalization 층을 사용한다.
  • InstanceNormalization 층은 배치 단위가 아니라 개별 샘플을 각각 정규화한다.
  • BatchNormalization 층과 달리 이동 평균을 위해 훈련 과정에서 계산하는 mu와 sigma 파라미터가 필요하지 않다.
  • InstanceNormalization 층에는 스케일(gamma)이나 이동(beta) 파라미터를 사용하지 않기 때문에 학습되는 가중치가 없다.

 

U-Net 생성자

 def build_generator_unet(self):

        def downsample(layer_input, filters, f_size=4):
            d = Conv2D(filters, kernel_size=f_size, strides=2, padding='same')(layer_input)
            d = InstanceNormalization(axis = -1, center = False, scale = False)(d)
            d = Activation('relu')(d)
            
            return d

        def upsample(layer_input, skip_input, filters, f_size=4, dropout_rate=0):
            u = UpSampling2D(size=2)(layer_input)
            u = Conv2D(filters, kernel_size=f_size, strides=1, padding='same')(u)
            u = InstanceNormalization(axis = -1, center = False, scale = False)(u)
            u = Activation('relu')(u)
            if dropout_rate:
                u = Dropout(dropout_rate)(u)

            u = Concatenate()([u, skip_input])
            return u

        # Image input
        img = Input(shape=self.img_shape)

        # Downsampling
        d1 = downsample(img, self.gen_n_filters) 
        d2 = downsample(d1, self.gen_n_filters*2)
        d3 = downsample(d2, self.gen_n_filters*4)
        d4 = downsample(d3, self.gen_n_filters*8)

        # Upsampling
        u1 = upsample(d4, d3, self.gen_n_filters*4)
        u2 = upsample(u1, d2, self.gen_n_filters*2)
        u3 = upsample(u2, d1, self.gen_n_filters)

        u4 = UpSampling2D(size=2)(u3)
        output_img = Conv2D(self.channels, kernel_size=4, strides=1, padding='same', activation='tanh')(u4)

        return Model(img, output_img)
  • 생성자는 두 부분으로 나뉜다. 먼저 스트라이드 2인 Conv2D 층으로 이미지를 다운샘플링한다.
  • 그다음 텐서를 업샘플링하여 원본 이미지와 같은 크기로 복원한다. 업샘플링 부분은 U-Net 구조를 구성하기 위해 Concatenate 층을 포함한다.

 

 

판별자

 

판별자 만들기

    def build_discriminator(self):

        def conv4(layer_input,filters, stride = 2, norm=True):
            y = Conv2D(filters, kernel_size=(4,4), strides=stride, padding='same', kernel_initializer = self.weight_init)(layer_input)
            
            if norm:
                y = InstanceNormalization(axis = -1, center = False, scale = False)(y)

            y = LeakyReLU(0.2)(y)
           
            return y

        img = Input(shape=self.img_shape)

        y = conv4(img, self.disc_n_filters, stride = 2, norm = False)
        y = conv4(y, self.disc_n_filters*2, stride = 2)
        y = conv4(y, self.disc_n_filters*4, stride = 2)
        y = conv4(y, self.disc_n_filters*8, stride = 1)

        output = Conv2D(1, kernel_size=4, strides=1, padding='same',kernel_initializer = self.weight_init)(y)

        return Model(img, output)
  • CycleGAN의 판별자는 연속된 합성곱 신경망이다. (첫 번째 층을 제외하고) 모두 샘플 정규화를 사용한다.
  • 마지막 합성곱 층은 하나의 필터를 사용하고 활성화 함수는 적용하지 않는다.

 

 

 

 

 

 

http://www.yes24.com/Product/Goods/81538614?OzSrank=1

 

미술관에 GAN 딥러닝 실전 프로젝트 - YES24

창조에 다가서는 GAN의 4가지 생성 프로젝트 이 책은 케라스를 사용한 딥러닝 기초부터 AI 분야 최신 알고리즘까지 설명한다. 기계 스스로 그림을 그리고, 글을 쓰고, 음악을 작곡하고, 게임을 하

www.yes24.com

 

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기