실습 | GAN 모델 만들기
from tensorflow.keras.datasets import mnist from tensorflow.keras.layers import Input, Dense, Reshape,Flatten, Dropout from tensorflow.keras.layers import BatchNormalization, Activation, LeakyReLU, UpSampling2D, Conv2D from tensorflow.keras.models import Sequential, Model import numpy as np import matplotlib.pyplot as plt # 생성자 모델을 만듭니다. = Sequential() .add(Dense(128*7*7, =100, =LeakyReLU(0.2))) .add(BatchNormalization()) .add(Reshape((7, 7, 128))) .add(UpSampling2D()) .add(Conv2D(64, =5, ='same')) .add(BatchNormalization()) .add(Activation(LeakyReLU(0.2))) .add(UpSampling2D()) .add(Conv2D(1, =5, ='same', ='tanh')) # 판별자 모델을 만듭니다. = Sequential() .add(Conv2D(64, =5, =2, =(28,28,1), ="same")) .add(Activation(LeakyReLU(0.2))) .add(Dropout(0.3)) .add(Conv2D(128, =5, =2, ="same")) .add(Activation(LeakyReLU(0.2))) .add(Dropout(0.3)) .add(Flatten()) .add(Dense(1, ='sigmoid')) .compile( ='binary_crossentropy', ='adam') .trainable = # 생성자와 판별자 모델을 연결시키는 gan 모델을 만듭니다. = Input( =(100,)) = ( ( )) = Model( , ) .compile( ='binary_crossentropy', ='adam') .summary() # 신경망을 실행시키는 함수를 만듭니다. gan_train( , , ): # MNIST 데이터 불러오기 # 앞서 불러온 MNIST를 다시 이용합니다. 테스트 과정은 필요 없고 # 이미지만 사용할 것이기 때문에 X_train만 호출합니다. ( , ), ( , ) = mnist.load_data() = .reshape( .shape[0], 28, 28, 1).astype('float32') # 127.5를 뺀 후 127.5로 나누어서 -1~1 사이의 값으로 바꿉니다. = ( - 127.5) / 127.5 = np.ones(( , 1)) = np.zeros(( , 1)) for in range( ): # 실제 데이터를 판별자에 입력하는 부분입니다. = np.random. (0, .shape[0], ) = [ ] = .train_on_batch( , ) # 가상 이미지를 판별자에 입력하는 부분입니다. = np.random. (0, 1, ( , 100)) = .predict( ) = .train_on_batch( , ) # 판별자와 생성자의 오차를 계산합니다. = 0.5 * np. ( , ) = .train_on_batch( , ) print('epoch:' % , ' d_loss:' % , ' g_loss:' % ) # 중간 과정을 이미지로 저장하는 부분입니다. 정해진 인터벌만큼 학습되면 # 그때 만든 이미지를 gan_images 폴더에 저장하라는 의미입니다. # 이 코드는 이 장의 주된 목표와는 관계가 없어서 소스 코드만 소개합니다. if % == 0: # r, c = 5, 5 = np.random. (0, 1, (25, 100)) = .predict( ) # Rescale images 0 - 1 = 0.5 * + 0.5 , = plt.subplots(5, 5) = 0 for in range(5): for in range(5): [ , ].imshow( [ , :, :, 0], ='gray') [ , ].axis('off') += 1 .savefig("gan_images/gan_mnist_.png" % ) # 2000번 반복되고(+1을 하는 것에 주의), # 배치 크기는 32, 200번마다 결과가 저장됩니다. gan_train(2001, 32, 200)