더북(TheBook)

코드 13-23 모델 훈련을 위한 파이프라인 정의

generator = create_generator()
discriminator = create_discriminator()

@tf.function
def train_step(images):
    noise = tf.random.normal([BATCH_SIZE, noise_dim])

    with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape: ------ ①
        generated_images = generator(noise, training=True)
        real_output = discriminator(images, training=True) ------ 실제 이미지를 사용하여 판별자 훈련 후 판별 값 반환
        fake_output = discriminator(generated_images, training=True) ------ 모조 이미지를 사용하여 판별자 훈련 후 판별 값 반환
        gen_loss = G_loss(fake_output) ------ 생성자에 대한 오차 계산
        disc_loss = D_loss(real_output, fake_output) ------ 판별자에 대한 오차 계산
        gradients_of_generator = gen_tape.gradient(gen_loss, generator.trainable_variables) ------ GradientTape()를 사용하여 생성자의 기울기 계산
        gradients_of_discriminator = disc_tape.gradient(disc_loss, discriminator.  
                                     trainable_variables)------ GradientTape()를 사용하여 판별자의 기울기 계산
        G_optimizer.apply_gradients(zip(gradients_of_generator,
                                    generator.trainable_variables)) ------ 기울기를 생산자 옵티마이저에 적용
        D_optimizer.apply_gradients(zip(gradients_of_discriminator,
                                    discriminator.trainable_variables)) ------ 기울기를 판별자 옵티마이저에 적용

① 텐서플로에서는 GradientTape를 사용해서 주어진 입력에 대한 연산의 미분 값을 자동으로 계산할 수 있습니다. tf.GradientTape는 실행된 모든 연산을 테이프(tape)에 기록하고, 후진 자동 미분(reverse mode differentiation)을 사용하여 기록된 연산의 기울기를 계산합니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.