728x90
반응형
In [13]:
from __future__ import print_function, division
from keras.datasets import mnist
from keras.layers import *
from keras.models import *
from keras.optimizers import *
import matplotlib.pyplot as plt
import sys
import numpy as np
import tensorflow as tf
In [59]:
class LSGAN():
def __init__(self):
self.img_rows = 28
self.img_cols = 28
self.channels = 1
self.img_shape = (self.img_rows,self.img_cols, self.channels)
self.latent_dim = 100
optimizer = Adam(0.0002,0.5)
# Build and Compile the discriminator
self.discriminator = self.build_discriminator()
# Loss = Mean Squared Error
self.discriminator.compile(loss='mse',
optimizer=optimizer,
metrics=['accuracy'])
# Build Generator
self.generator = self.build_generator()
# Make Noise
z = Input(shape=(self.latent_dim,))
img = self.generator(z)
# For the combined model only train the generator
self.discriminator.trainable = False
# valid takes generated imgs as input and determines validity
valid = self.discriminator(img)
# The Combined model ( G + D)
# Trains generator to fool discriminator
self.combined = Model(z,valid)
# Opitimize with MSE
self.combined.compile(loss='mse',optimizer=optimizer)
def build_generator(self):
model = Sequential()
model.add(Dense(256,input_dim=self.latent_dim))
model.add(ReLU())
model.add(BatchNormalization(momentum=0.8))
model.add(Dense(512))
model.add(ReLU())
model.add(BatchNormalization(momentum=0.8))
model.add(Dense(1024))
model.add(ReLU())
model.add(BatchNormalization(momentum=0.8))
model.add(Dense(np.prod(self.img_shape), activation='tanh')) #784
model.add(Reshape(self.img_shape))
model.summary()
noise = Input(shape=(self.latent_dim,))
img = model(noise)
return Model(noise,img)
def build_discriminator(self):
model = Sequential()
model.add(Flatten(input_shape=self.img_shape))
model.add(Dense(512))
model.add(LeakyReLU(0.2))
model.add(Dense(256))
model.add(LeakyReLU(0.2))
model.add(Dense(1)) # no Softmax
model.summary()
img = Input(shape=self.img_shape)
validity = model(img)
return Model(img,validity)
def train(self, epochs, batch_size=128,sample_interval=50):
# Load MNIST
(X_train,_),(_,_) = mnist.load_data()
# Rescale
X_train = (X_train.astype(np.float32) - 127.5) / 127.5
X_train = np.expand_dims(X_train,axis=3) # 다 1열로 펼치기
# Adversarial Ground-Truth ( real value )
real = np.ones((batch_size,1))
fake = np.zeros((batch_size,1))
for epoch in range(epochs):
"""Train Discriminator"""
# Select random batch of images
idx = np.random.randint(0, X_train.shape[0],batch_size) # 0 ~ X_train.shape[0]까지 batch_size 만큼
imgs = X_train[idx]
# Sample noise as generator input
noise = np.random.normal(0,1,(batch_size,self.latent_dim)) # batch_size 행 / latent_dim 열
# Generate a batch of new imgs
gen_imgs = self.generator.predict(noise)
# Train the Discriminator
d_loss_real = self.discriminator.train_on_batch(imgs,real)
d_loss_fake = self.discriminator.train_on_batch(gen_imgs,fake)
d_loss = 0.5 * np.add(d_loss_fake,d_loss_real)
"""Train Generator"""
g_loss = self.combined.train_on_batch(noise,real)
# Plot the progress
print("Epoch : {0} / D_Loss : {1}, ACC : {2:.2f} / G_Loss : {3}".format(epoch,d_loss[0],100*d_loss[1],g_loss))
# If at save interval => Save img samples
if epoch % sample_interval == 0:
self.sample_images(epoch)
def sample_images(self,epoch):
r,c = 5,5
noise = np.random.normal(0,1,(r*c,self.latent_dim))
gen_imgs = self.generator.predict(noise)
# Rescale
gen_imgs = gen_imgs * 0.5 + 0.5
fig, axs = plt.subplots(r,c)
cnt = 0
for i in range(r):
for j in range(c):
axs[i,j].imshow(gen_imgs[cnt,:,:,0],cmap='gray')
axs[i,j].axis('off')
cnt+=1
fig.savefig("images/mnist_%d.png" % epoch)
plt.close()
In [60]:
if __name__ == '__main__':
lsgan = LSGAN()
lsgan.train(epochs=30000,batch_size=64, sample_interval=200)
In [153]:
# 파일이름의 숫자 5자리로 만들어서 정렬하기
import re
path = os.getcwd()
filename = glob.glob(path + '/images/mnist_*.png')
for i in filename:
a = i.split('/')[-1]
leng = re.findall('\d+',a)[0]
leng = "0"*(5-len(leng))+leng
os.rename(i,leng+".png",path+'/images')
In [160]:
filename_new = glob.glob(path + '/images/*.png')
filename_new = sorted(filename_new)
filename_new[:5]
# 순서대로 정렬된 것을 볼 수 있다.
Out[160]:
In [162]:
generated_image_array = [imageio.imread(generated_image) for generated_image in filename_new]
imageio.mimsave('LSGAN_MNIST.gif', generated_image_array, fps=15)
< LSGAN으로 MNIST를 생성하는 과정 >
728x90
반응형