Cifar10 용 DCGAN 모델을 노출하는 with keras

개요


  • 시간이 없기 때문에, GAN의 구조 등은 우선 할애
  • generator 및 discriminator 설정 작성
  • 된장은 generator와 discriminator 모두 활성화 함수에 LeakyReLu를 사용한다
  • 전체 학습 프로세스의 소스 코드는 github에 업로드 예정입니다 (준비 중입니다. 죄송합니다)

  • 모델 파라미터들



    Generator



    generator
    def _build_generator(self) -> Model:
        start_pix_x = 4
        start_pix_y = 4
        kernel_ini = RandomNormal(mean=0.0, stddev=0.02)
    
        inputs = Input(shape=self.noise_shape)
        x = Dense(
            units=256*start_pix_x*start_pix_y,
            kernel_initializer=kernel_ini,
            bias_initializer='zeros')(inputs)
        x = LeakyReLU(alpha=0.2)(x)
        x = Reshape((start_pix_x, start_pix_y, 256))(x)
        x = Conv2DTranspose(
            filters=128,
            kernel_size=4,
            strides=2,
            padding='same',
            kernel_initializer=kernel_ini,
            bias_initializer='zeros')(x)
        x = LeakyReLU(alpha=0.2)(x)
        # x = BatchNormalization(axis=3)(x)
        x = Conv2DTranspose(
            filters=128,
            kernel_size=4,
            strides=2,
            padding='same',
            kernel_initializer=kernel_ini,
            bias_initializer='zeros')(x)
        x = LeakyReLU(alpha=0.2)(x)
        # x = BatchNormalization(axis=3)(x)
        x = Conv2DTranspose(
            filters=128,
            kernel_size=4,
            strides=2,
            padding='same',
            kernel_initializer=kernel_ini,
            bias_initializer='zeros')(x)
        x = LeakyReLU(alpha=0.2)(x)
        x = Conv2D(
            filters=3,
            kernel_size=3,
            padding='same',
            kernel_initializer=kernel_ini,
            bias_initializer='zeros')(x)
    
        y = Activation('tanh')(x)
    
        model = Model(inputs, y)
        if self.verbose:
            model.summary()
    
        return model
    

    Discriminator



    discriminator
    def _build_discriminator(self) -> Model:
        kernel_ini = RandomNormal(mean=0.0, stddev=0.02)
        inputs = Input(shape=self.shape)
        x = GaussianNoise(stddev=0.05)(inputs)  # prevent d from overfitting.
        x = Conv2D(
            filters=64,
            kernel_size=3,
            padding='SAME',
            kernel_initializer=kernel_ini,
            bias_initializer='zeros')(x)
        x = LeakyReLU(alpha=0.2)(x)
        # x = Dropout(0.5)(x)
        x = Conv2D(
            filters=128,
            kernel_size=3,
            strides=2,
            padding='SAME',
            kernel_initializer=kernel_ini,
            bias_initializer='zeros')(x)
        x = LeakyReLU(alpha=0.2)(x)
        # x = Dropout(0.5)(x)
        # x = BatchNormalization(axis=3)(x)
        x = Conv2D(
            filters=128,
            kernel_size=3,
            strides=2,
            padding='SAME',
            kernel_initializer=kernel_ini,
            bias_initializer='zeros')(x)
        x = LeakyReLU(alpha=0.2)(x)
        # x = Dropout(0.5)(x)
        # x = BatchNormalization(axis=3)(x)
        x = Conv2D(
            filters=256,
            kernel_size=3,
            strides=2,
            padding='SAME',
            kernel_initializer=kernel_ini,
            bias_initializer='zeros')(x)
        x = LeakyReLU(alpha=0.2)(x)
    
        x = Flatten()(x)
        features = Dropout(0.4)(x)
    
        validity = Dense(1, activation='sigmoid')(features)
    
        model4d = Model(inputs, validity)
        model4g = Model(inputs, validity)
        if self.verbose:
            model4d.summary()
    
        return model4d, model4g
    

    출력 결과



    출력 결과의 행은 클래스에 대응하고 있습니다.
    DCGAN은 단지 이미지를 생성할 뿐입니다만, 원의 이미지로 구축한 학습 모델에 생성 화상을 입력해 예측된 라벨에 의해 라벨링 해, 예측 클래스마다 화상을 출력시키고 있습니다.
    generator에 LeakyReLU를 넣는 것으로, 물체의 대상이 보다 제대로 생성할 수 있는 느낌이 있는 느낌이 듭니다.


    결론



    돌관으로 했으므로, 자세한 후일 제대로 쓰고 싶습니다.

    좋은 웹페이지 즐겨찾기