관리 메뉴

ComputerVision Jack

[케라스 Chapter8 정리] 본문

DeepLearning/케라스 - Keras Lib

[케라스 Chapter8 정리]

JackYoon 2020. 2. 23. 16:45
반응형

확장된 인공지능(Augmented intelligence)

여러 분야에서 AI가 사람의 능력을 증가시키는 도구로 사용되는것

LSTM으로 텍스트 생성하기

순환 신경망으로 시퀀스 데이터를 생성할 수 있다.

딥러닝에서 시퀀스 데이터를 생성하는 방법은 이전 토큰을 입력으로 사용해서 시퀀스의 다음 1개 또는 몇 개의 

토큰을(RNN이나 컨브넷으로) 예측하는 것이다.

 

언어 모델(Language model)

 텍스트 데이터를 다룰 때 토큰은 보통 단어나 글자이다. 이 전 토큰들이 주어졌을 때 다음 토큰의 확률을 

모델링 할 수 있는 네트워크

 

글자 수준의 신경망 언어 모델(Character-level neural language model)

초기 문자로 텍스트 생성하고 다시 입력으로 사용하고, LSTM층을 사용하여 모델의 출력은 출력 가능한 모든 글자에

대해 소프트맥스 값을 취하는 모델

글자 수준의 신경망 언어 모델

샘플링 전략의 중요성

탐욕적 샘플링(greedy sampling)

텍스트 생성 할때, 다음 글자를 선택하는 방법으로 가장 높은 확률을 가진 글자를 선택하는 방법

 

확률적 샘플링(stochastic sampling)

글자의 확률 분포에서 샘플링하는 과정에 무작위성을 주입하는 방법(확률적 = 무작위)

 

모델의 소프트맥스 출력은 확률적 샘플링을 사용하기에 좋다

샘플링 과정에서 확률의 양을 조절하기 위해 소프트맥스 온도(softmax temperature) 파라미터를 사용한다.

 

[모델 구성]

model = keras.models.Sequential()

model.add(layers.LSTM(128, input_shape = (maxlen, len(chars)))

model.add(layers.Dense(len(chars), activation = 'softmax'))

#다음 글자를 예측하기 위한 단일 LSTM모델

 

[모델 컴파일]

optimizer = keras.optimizers.RMSprop(lr = 0.01)

model.compile(loss = 'categorical_crossentropy', optimizer = optimizer)

#모델 컴파일 설정하기

 

언어 모델 훈련과 샘플링

  • 생성된 텍스트를 주입하여 모델에서 다음 글자에 대한 확률 분포를 뽑는다.
  • 특정 온도로 이확률 분포의 가중치를 조정한다.
  • 가중치 조정된 분포에서 무작위로 새로운 글자를 샘플링한다.
  • 새로운 글자를 생성된 텍스트의 끝에 추가한다.

온도 파라미터에 대하여 낮은 온도는 아주 반복적이고 예상 가능한 텍스트를 생성한다. 하지만 전체적인 구조는 실제와 

매우 비슷하다. 높은 온도에서 생성된 텍스트는 흥미롭고 창의적으로 생성된다.

네트워크에서 텍스트 생성에 가장 좋은 온도는 0.5이다.

딥드림

딥드림(DeepDream)

합성곱 신경망이 학습한 표현을 사용하여 예술적으로 이미지를 조작하는 기법

  • 딥드림에선 특정 필터가 아니라 전체 층의 활성화를 최대화한다.
  • 노이즈 이미지 입력이 아니라 이미 가지고 있는 이미지를 사용한다.
  • 입력 이미지는 시각 품질을 높이기 위해 다른 스케일(옥타브)로 처리한다.

[모델 구현]

model = inception_v3.InceptionV3(weights = 'imagenet', include_top = False)

#합성곱 기만 층만 사용한 인셉션 v3네트워크를 생성한다.

하위층기하학적인 패턴을 만들고, 상위층은 ImageNet에 있는 클래스로 보이는 시각 효과를 만든다.

 

연속적인 스케일에 걸쳐 경사 상승법을 적용한다.

원본 이미지
딥드림 이미지 생성 결과

뉴럴 스타일 트랜스퍼

뉴럴 스타일 트랜스퍼(neural style transfer)

타킷 이미지의 콘텐츠를 보존하면서 참조 이미지의 스타일을 타깃 이미지에 적용합니다.

  • 스타일 : 질감, 색깔, 이미지에 있는 다양한 크기의 시각 요소
  • 콘텐츠 : 이미지에 있는 고수준의 대형 구조

참조 이미지의 스타일을 적용하면서 원본 이미지의 콘텐츠를 보존하는 것.

콘텐츠와 스타일을 수학적으로 정의할 수 있따면 최소화할 손실함수는 다음과 같다.

loss = distance(style(reference_image) - style(generated_image)) + distance(content(original_image) - content(generated_image))

#content 함수는 이미지의 콘텐츠 표현을 계산한다. style 함수는 이미지의 스타일 표현을 계산한다.

따라서 파생된 이미지는 스타일적 콘텐츠 적으로 원본과의 오차를 줄이려 노력해 나아간다.

 

콘텐츠 손실

네트워크 하위 층의 활성화는 이미지에 관한 전체적인 정보를 담고 있다.

상위 층 활성화는 점점 전역적이고 추상적인 정보를 담는다.

 

스타일 손실

콘텐츠 손실은 하나의 상위층만 사용한다. 스타일 손실은 컨브넷의 여러 층을 사용한다.

케라스 층의 활성화 출력의 그람행렬(Gram matrix)을 스타일 손실로 사용한다.

 

손실 정의

  • 콘텐츠를 보존하기 위해 타깃 콘텐츠 이미지와 생성된 이미지 사이에서 상위 층의 활성화를 비슷하게 유지한다.
  • 스타일을 보존하기 위해 저수준 층과 고수준 층에서 활성화 안에 상관관계를 비슷하게 유지한다.

[콘텐츠 손실]

def content_loss(base, combination):

    return K.sum(K.square(combination - base))

[스타일 손실]

def gram_matrix(x):

    features = K.batch_flatten(K.permute_dimensions(x, (2, 0, 1)))

    gram = K.dot(features, K.transpose(features))

 

def style_loss(style, combination):

    S = gram_matrix(style)

    C = gram_matrix(combination)

    channels = 3

    size = img_height * img_width

    return K.sum(K.square(S - C)) / (4. * (channels ** 2) * (size * 2))

[변위 손실]

생성된 이미지의 픽셀을 사용하여 계산하는 총 변위 손실

생성된 이미지가 공간적인 연속성을 가지도록 도와주며 픽셀의 격자 무늬가 과도하게 나타나는 것을 막아준다.

def total_variation_loss(x):

    a = K.square(x[:, :img_height - 1, : img_width - 1, :] - x[:, 1:, :img_width - 1, :])

    b = K.square(x[:, :img_height - 1, : img_width - 1, :] - x[:, :img_height - 1, 1:, :])

    return K.sum(K.pow(a + b, 1.25)

스타일 - 시각효과 적용
콘텐츠 - 기하학적 적용
스타일 트랜스퍼로 생성된 이미지

변이형 오토인코더를 사용한 이미지 생성

이미지의 잠재 공간에서 샘플링해서 완전히 새로운 이미지나 기존이미지를 변형 하는 방식

  • 변이형 오토 인코더(Variational AutoEncoders, VAE)
  • 적대적 생성 네트워크(Generative Adversarial Networks, GAN)

이미지 생성의 아이디어는 각 포인트가 실제와 같은 이미지로 매핑될 수 있는 저 차원 잠재 공간의 표현을 만드는것

잠재공간의 한 포인트를 입력 받아 이미지 출력하는 모듈을 

  • GAN : 생성자
  • VAE : 디코더

이미지 잠재 공간 학습하고 새로운 이미지를 샘플링 하는 과정

  • GAN : 매우 실제 같은 이미지를 생성한다
  • VAE : 구조적인 잠재 공간을 학습하는데 뛰어나다.

이미지 변형을 위한 개념 벡터

잠재 공간이나 임베딩 공간이 주어지면 원본 데이터의 흥미로운 변화를 인코딩한 축일 수 있다.

 

오토 인코더

입력을 저차원 잠재 공간으로 인코딩한 후 디코딩하여 복원하는 네트워크

 

변이형 오토 인코더

딥러닝과 베이즈 추론(Bayesian inference)의 아이디어를 혼합한 오토인코더의 최신버전

 

VAE는 이미지를 어떤 총계 분포의 파라미터로 변환한다.

VAE 작동

  • 인코더 모듈이 입력 샘플 Input_img를 잠재공간 두 파라미터 z_mean과 z_log_Var로 변환
  • 입력 이미지가 생성되면 잠재공간의 정규 분포에서 포인트 z를 z = z_mean + exp(0.5 * z_log_var) * epsilon처럼 무작위로 샘플링 한다. (epsilon = 작은값 랜덤 텐서)
  • 디코더 모듈은 잠재 공간의 이 포인트를 원본 입력 이미지로 매핑하여 복원한다.

잠재 공간에서 디코딩된 숫자 그리드

적대적 생성 신경망 소개

적대적 신경망(GAN)

VAE와 다른 방법으로 이미지의 잠재 공간을 학습한다. 생성된 이미지가 실제 이미지와 통계적으로 거의 구분되지 않도록 강제하여 실제 같은 합성 이미지를 생성한다.

 

GAN의 네트워크

  • 생성자 네트워크 : 랜덤 벡터를 입력으로 받아 이를 합성된 이미지로 디코딩한다
  • 판별자 네트워크 : 이미지를 입력으로 받아 훈련세트에서 왔는지 생성자 네트워크에서 왔는지 판별한다

GAN은 최적화의 최솟값이 고정되지 않은 시스템이다. 즉 생성자와 판별자 간의 평형점을 찾는 다이나믹 시스템이다.

구체적인 구현은 심층 합성곱(DOGAN)이다. 생성자와 판별자가 심층 컨브넷이다. 특히 생성자에서 이미지 업샘플링을 위해 Conv2DTranspose 층을 사용한다.

 

훈련방법

  • 생성자의 마지막 활성화로 tanh함수를 사용한다.
  • 정규분포(가우시안 분포)를 사용하여 잠재 공간에서 포인트를 샘플링 한다.
  • 무작위성은 모델을 견고하게 한다
  • 희소한 그래디언트는 GAN 훈련을 방해할 수 있다.

생성자 VS 판별자 = 적대적 네트워크 구조이다.

Gan으로 frog이미지 생성
8-1 LSTM 텍스트 생성.ipynb
0.14MB
8-2 딥드림.ipynb
0.01MB
8-3 뉴럴 스타일 트랜스퍼.ipynb
0.37MB
8-4 변이형 오토인코더.ipynb
0.28MB
8-5 적대적 생성 신경망.ipynb
0.14MB

반응형

'DeepLearning > 케라스 - Keras Lib' 카테고리의 다른 글

[케라스 Chapter9정리]  (0) 2020.02.24
[케라스 Chapter7정리]  (0) 2020.02.18
[케라스 Chapter6 정리]  (0) 2020.02.11
[케라스 Chapter5 정리]  (0) 2020.01.31
[케라스 Chapter4 정리]  (0) 2020.01.28
Comments