코드 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)을 사용하여 기록된 연산의 기울기를 계산합니다.