GAN


学習内容


GAN


特定の画像を模して生成された生成器と、生成された画像が元の画像であるか否かを判別する識別器とからなる.generatorは、自分が生成した画像を識別するために、画像生成を学習し、ソース画像をよりよく識別できるように学習する構成である.
訓練の過程で、ジェネレータは次第に真実の画像をよりよく生成し、Descriptorは次第に真偽をよりよく区別する.このプロセスは、設計者が偽画像の実際の画像を区別しなくなったときに、バランス状態に達する.

Deep Convolutional GAN(DCGAN)


generator
def make_generator_model():
    model = tf.keras.Sequential()
    model.add(layers.Dense(7*7*256, use_bias=False, input_shape=(100,)))
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())

    model.add(layers.Reshape((7, 7, 256)))
    assert model.output_shape == (None, 7, 7, 256) # 주목: 배치사이즈로 None이 주어집니다.

    model.add(layers.Conv2DTranspose(128, (5, 5), strides=(1, 1), padding='same', use_bias=False))
    assert model.output_shape == (None, 7, 7, 128)
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())

    model.add(layers.Conv2DTranspose(64, (5, 5), strides=(2, 2), padding='same', use_bias=False))
    assert model.output_shape == (None, 14, 14, 64)
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())

    model.add(layers.Conv2DTranspose(1, (5, 5), strides=(2, 2), padding='same', use_bias=False, activation='tanh'))
    assert model.output_shape == (None, 28, 28, 1)

    return model
未学習ジェネレータによる画像生成
generator = make_generator_model()

noise = tf.random.normal([1, 100])
generated_image = generator(noise, training=False)

plt.imshow(generated_image[0, :, :, 0], cmap='gray')
discriminator
def make_discriminator_model():
    model = tf.keras.Sequential()
    model.add(layers.Conv2D(64, (5, 5), strides=(2, 2), padding='same',
                                     input_shape=[28, 28, 1]))
    model.add(layers.LeakyReLU())
    model.add(layers.Dropout(0.3))

    model.add(layers.Conv2D(128, (5, 5), strides=(2, 2), padding='same'))
    model.add(layers.LeakyReLU())
    model.add(layers.Dropout(0.3))

    model.add(layers.Flatten())
    model.add(layers.Dense(1))

    return model
未学習の判別器を用いて生成した画像を判別する
モデルは真画像出力正値(正値)、偽画像出力負値(負値)
discriminator = make_discriminator_model()
decision = discriminator(generated_image)
print (decision)

Reference


https://sensibilityit.tistory.com/506