관리 메뉴

ComputerVision Jack

[골빈해커 Chapter9정리] 본문

DeepLearning/골빈해커 - Tensor Lib

[골빈해커 Chapter9정리]

JackYoon 2020. 1. 20. 13:34
반응형

[개념 정리]

09_딥러닝의 미래GAN.ipynb
0.02MB

Gan(Generative Adversarial Netwrok)

오토 인코더와 같이 결과물을 생성하는 모델, 서로 대립하는 두 신경망을 경쟁시켜 결과물 생성

 

구분자(Discriminator)

실제 이미지를 구분자에게 이미지가 진짜임을 판단하게 한다.

생성자(Generator)

생성자를 통하여 노이즈로 부터 임의의 이미지를 만들고 구분자를 통해 진짜 이미지인지 판단하게 한다.

 

생성자는 구분자를 속여 진짜처럼 보이게 하고, 구분자는 생성자 이미지를 최대한 가짜라고 구분하기.

경쟁을 통해 생성자는 실제 이미지와 비슷하게 이미지를 생성한다.

 

mnist를 이용하여 원하는 숫자에 해당하는 이미지 모델을 gan으로 구현

[코드정리]

total_epoch = 100

batch_size = 100

learning_rate = 0.0002

n_hidden = 256

n_input = 28 * 28

n_noise = 128

#Hyper parameter 설정 noise경우 생성자의 입력 값으로 사용할 노이즈의 크기

 

X = tf.placeholder(tf.float32, [None, n_input])

Z = tf.placeholder(tf.float32, [None, n_noise])

#gan도 비지도 학습이기 떄문에 y값이 필요가 없다. x는 실제 이미지의 입력을 뜻하고,

z는 노이즈를 추가한 가짜 이미지이다.

 

G_W1 = tf.Variable(tf.random_normal([n_noise, n_hidden], stddev = 0.01))

G_b1 = tf.Variable(tf.zeros([n_hidden]))

G_W2 = tf.Variable(tf.random_normal([n_hidden, n_input], stddev = 0.01))

G_b2 = tf.Variable(tf.zeros([n_input]))

#생성자 신경망에 사용할 변수 설정.

 

D_W1 = tf.Variable(tf.random_normal([n_input, n_hidden], stddev = 0.01))

D_b1 = tf.Variable(tf.zeros([n_hidden]))

D_W2 = tf.Variable(tf.random_normal([n_hidden, 1], stddev = 0.01))

D_b2 = tf.Variable(tf.zeros([1]))

#구분자 신경망에 사용할 변수 설정

 

[생성자 신경망]

def generator(noise_z):

  hidden = tf.nn.relu(tf.matmul(noise_z, G_W1) + G_b1)

  output = tf.nn.sigmoid(tf.matmul(hidden, G_W2) + G_b2)

  return output

[구분자 신경망]

def discriminator(inputs):

  hidden = tf.nn.relu(tf.matmul(inputs, D_W1) + D_b1)

  output = tf.nn.sigmoid(tf.matmul(hidden, D_W2) + D_b2)

  return output

 

G = generator(Z)

D_gene = discriminator(G)

D_real = discriminator(X)

#가짜 이미지를 제작하여 생성자에 넣어주고, 진짜 이미지는 구분자에 넣는다.

 

[손실함수 설정]

손실 함수 2개가 필요하다.

생성자 이미지를 가짜라고 판단하는 손실값, 진짜라고 판단하는 손실값.

loss_D = tf.reduce_mean(tf.log(D_real) + tf.log(1 - D_gene))

#진짜 이미지라고 생각하는 손실 값.

D_real은 1에 가까워지고 D_gene는 0에 가까워야한다.

 

loss_G = tf.reduce_mean(tf.log(D_gene))

#가짜 이미지라고 생각하는 손실 값.

D_gene을 1로 만들기만 하면된다.

 

train_D = tf.train.AdamOptimizer(learning_rate).minimize(-loss_D, var_list = D_var_list)

train_G = tf.train.AdamOptimizer(learning_rate).minimize(-loss_G, var_list = G_var_list)

#두가지 신경망 Adam경사하강법 적용

 

for epoch in range(total_epoch):

  for i in range(total_batch):

    batch_xs, batch_ys = mnist.train.next_batch(batch_size)

    noise = get_noise(batch_size, n_noise)

    _, loss_val_D = sess.run([train_D, loss_D], feed_dict = {X: batch_xs, Z: noise})

    _, loss_val_G = sess.run([train_G, loss_G], feed_dict = {Z: noise})

 

  print('Epoch : ', '%04d' % epoch,

        '\nD loss : {:.4}'.format(loss_val_D),

        '\nG loss : {:.4}'.format(loss_val_G))

#학습 적용한다.

gen

학습이 진행 될 수록, 원래의 노이즈가 적힌 생성자가 실제의 데이터 처럼 모양이 변해가는 것을 느낄 수 있다.

반응형

'DeepLearning > 골빈해커 - Tensor Lib' 카테고리의 다른 글

[골빈해커 Chapter11정리]  (0) 2020.01.23
[골빈해커 Chapter10정리]  (0) 2020.01.21
[골빈해커 Chapter8 정리]  (0) 2020.01.19
[골빈해커 Chapter7정리]  (0) 2020.01.17
[골빈해커 Chapter6 정리]  (0) 2020.01.16
Comments