- 중요한 신경망의 개념 중 하나. 

- NN은 다음과 같이 

- Input값이 Hidden layer에서 선형 함수를 거친 다음 Activation Function(tanh)를 거치고 Output으로 바로 전환디는 과정을 거침.  

NN

- 그러나 RNN은 Hidden layer에서 선형함수를 거친 다음Activation Function(tanh)가 바로 Output으로 전달되지 않고, 다시 Input 값으로서 전달 됨. 그 다음 다시 해당 값이 선형 함수를 거치고 Actication Function을 거친 다음 다음 Input 값으로 전달 됨. (반복) => Recurrent Neural Network => 순서가 있는 데이터를 처리하는데 강점을 가짐. 

RNN

- 순서가 있는 데이터?

: 내부 요소들이 동일하다고 하더라도 순서가 바뀌면 통합적으로 완전히 다른 의미가 되는 것. 

예) 텍스트 데이터. 

I work at google(나는 구글에 근무한다)

I google at work(나는 회사에서 구글링한다)

: 내부 요소는 동일하지만 순서가 바뀌니까 다른 의미가 되었다. 

그렇다면 우리가 RNN으로 잘 알고 있는 주식 데이터를 살펴보자. (종가만)

1일   2일    3일    4일   

1000 1050  900   1060

1일    3일   2일    4일

1000  900   1050  1060

- 내부 요소는 같지만 내가 의도하는 바는 전혀 다르다. 나는 시계열로 일별 종가를 필요로 하였는데 전혀 다른 값이 왔다. 이런 데이터는 RNN으로 손쉽게 처리 할 수 있다. 

- RNN은 순서가 있는 데이터를 온전히 파악하기 위하여 은닉측 내에 순환적 구조(Recurrent structure)를 이용하여 과거의 데이터를 기억(Remember)해 두고 있다가 새롭게 입력으로 주어지는 데이터와 은닉층에서 기억하고 있는 과거 데이터를 연결 - (New Input+Recurrent Output)시켜서 그 의미를 알아내는 기능을 수행. 

=> 데이터 분석 결과가 데이터 분석 결과에 영향을 미칠 경우 RNN을 사용하자!

[RNN의 동작 원리]

가장 간단한 텍스트 데이터(I work at google)를 분석하면서 동작 원리를 알아 보자. 

1. 먼저 문장을 각 요소별로 분리한다. (데이터 전처리 = 형태소 분리) 

: I/work/at/google

2. 신경망 구조 설계

: 입력 - 은닉 - 출력

: 은닉층으로는 tanh를 사용한다. 그리고 최종 분류로는 softmax를 사용한다. 

: 출력층은 명사, 대명사, 동사, 전치사 4가지 Class를 분류한다. 

3. 먼저  I가 입력층으로 들어감. I는 선형회귀를 서친 다음 tanh를 거침. 이전에 아무 값도 들어오지 않았으므로 I를 그대로 분석함. 이후 출력층에서는 다시 한 번 선형회귀를 거치고 softmax를 통해서 해당 단어(I)가 어떤 class에 속하는 지 분류해 냄. 여기서는 대명사.

4. 다음으로 Work를 입력. 

같은 신경망에 Work가 들어감. 기본에 I가 잔존해 있어서 이 값이 영향을 줌. 하지만 분류는 위 3의 과정과 같이 똑같이 해낼 수 있음. 즉, 동사로 분류

(이하 상동)

 

 

오토인코더의 종류는 다양하다. Single Auto Encoder, Deep Auto Encoder, Stacker Auto Encoder, Denoising Auto Encoder. 그리고 경우에 따라서는 Auto Encoder를 합칠 수도 있고 이러한 어플리케이션을 Google에서 볼 수 있다. 

여기에서는 각각의 단일 경우에 대해서만 그림과 간단한 설명으로 살펴 보도록 한다. 

Auto Encoder

: Encoder와 Decoder - 즉, 입력과 출력이 대칭이 되도록 네트워크를 디자인 한 오토인코더

Stacked Auto Encoder

: Latent space역시 단층이 아니라 여러 층이 될 수 있다. 이에 따라 이러한 네트워크를 Stacked layer라고 이름을 붙였다. 이러한 네트워크는 일반적으로 Single Auto Encoder보다 좋은 성능을 보인다. (Deep learning이 layer가 깊어 질 수록 성능이 좋아지는 것 처럼)

 

Deep Auto Encoder

더 이상 그리기가 힘들어서 캡쳐로 대체한다. (https://wiki.pathmind.com/deep-autoencoder

딥 오토안코더는 네트워크를 최소 4개 사용해야 한다. 그리고 Encoder와 Decoder를 대칭으로 사용해야 함. 

Denoising Auto Encoder

그림이 별로 없다. 설명을 많이 보충해야 할 것 같다. 

- 일단 상기의 그림을 보면 Encoder쪽 그림이 깨끗하지 못하다. 즉. Noise가 섞여 있다. Network에 Keras에서는 Gaussian잡음을 넣는 것는 코드를 지원하는 것으로 기억한다. 

- 그리고 가우시안 Noise를 넣은 다음에는 Encoder에 잡음이 섞인 Input'를 넣은 다음 압축(Copressed represenation)을 한다. 

- 그리고 Decoder는 해당 Compressed representation을 어떻게든 깨끗하게 처음처럼 Gaussian Noise가 섞이지 않은 처음 Input(주의!....Input'가 아님) 으로 복원하는 것을 목표로 한다. 

 

 

Sparse Encoder도 있는데 이건 시간나면 해 보겠다. 지금은..잘 모른다. =_ㅠ

 

 

 

# library import

from keras.datasets import mnist

from keras.layers import Input, Dense

from keras.models import Model # <=기존 모델의 인풋 값과 내 모델의 아웃풋 값을 전달

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

%matplotlib inline

==========================

#data load

(X_train, _), (X_test, _) = mnist.load_data()

#chage types as a real value 

X_train = X_train.astype('float32')/255

X_test = X_test.astype('float32')/255

#reshape the data from (60000, 28,28) , (10000, 28,28)to (60000, 784), (10000, 784)  

X_train = X_train.reshape(len(X_train), np.prod(X_train.shape[1:]))

X_test = X_test.reshape(len(X_test), np.prod(X_test.shape[1:]))

print(X_train.shape)

print(X_test.shape)

 

#set input layer

input_img= Input(shape=(784,))

#===================encoder================================#

encoded = Dense(units=128, activation='relu')(input_img)

encoded = Dense(units=64, activation='relu')(encoded) ###

encoded = Dense(units=32, activation='relu')(encoded)

#===================decoder================================#

decoded = Dense(units=64, activation='relu')(encoded)

decoded = Dense(units=128, activation='relu')(decoded)

decoded = Dense(units=784, activation='sigmoid')(decoded)

Input layer, Enc. Dec. Network 개념도

중간에 네트워크 짜는 개념은 알고 가야 할 것 같아서 설명을 넣는다. 

- 상기와 같이 초기에 전처리한 Input layer를 넣고 그 다음에 차차 압축해 가면서 Encoder를 넣는다. 

- 그리고 그 다음에 압축된 데이터를 복원하기 위해 Latent space(여기서는 32)로부터 차차 다시 올라가도록 한다. 

- 그리고 이러헤 복원시키는 이미지를 사용하는 오토인코더를 만든다. (최종모델)

#####################################

autoencoder=Model(input_img, decoded) # decode를 거쳐 복원하는 최종 모델 (auto encoder)???????(확인 필요) Model의 의미

autoencoder.compile(optimizer='adam', loss='binary_crossentropy',metrics=['accuracy'])

autoencoder.fit(X_train, X_train,

                epochs=50,

                batch_size=256,

                shuffle=True,

                validation_data=(X_test, X_test))

#####################################

encoder = Model(input_img, encoded) # encode를 거쳐 lated space로 압축하는 모델(확인 필요)

다음은 실수로 오토인코딩 하는 코드 살펴 보는 것으로 하는 것으로

 

저번 포스팅에서 오토인코더의 기본적인 개념에 대해서 알아 보았다. 

복습하면 오토인코더는 딥러닝을 2개 붙여놓은 것으로 

  • 하나의 딥러닝 구조는 Encoder로 Hidden(latent space)로 압축 하는 것. 
  • 하나의 딥러닝 구조는 Decoder Hidden(latent space)으로 압축된 것에서 원본으로 복원하는 것. 

이다. 즉, 단순히 출력 =입력이 되도록 하는 개념이다. 하지만 이런 Autoencoder도 여러 기법을 사용한다. 

예를 들어서 Denoising autoencoder, 그리고 Stacked encoder와 같은 방법이 존재한다. 

Denoising autoencoder(https://excelsior-cjh.tistory.com/187)

입력에 Noise를 추가하고 노이즈가 없는 우너본 입력을 Decoder가 구성하도록 학습시키는 것. 

Denoising AE 

일반적으로 Gaussian Random을 추가하며, 복원할 떄는 입력된 초기 값을 복원한다. 

- Denoising Auto Encoder를 사용하면 (Training Data + Noise) - Training Data를 학습한 결과가 Encoder에 넣어져서 노이즈를 붙이기 전 데이터와 노이즈를 붙였을 때 Data와의 차이를 구한다.

- 어떤 Data가 Noise에 대해 강력한 지 알 수 있다. 

- 예) 사람이라면 머리, 눈, 코가 가장 강력하게 구분하는 데 강력한 영향을 미치고, 주근깨 등은 적은 영향을 미침. 

- 따라서 Denoising Auto Encoder를 잘 활용하면 데이터가 별로 없는 상황에서도 어떤 특성이 가잔 영향력을 많이 미치는 지 비지도 학습으로 딥러닝을 수행할 수 있다. 

Stacked Auto Encoder(http://jaynewho.com/post/9)

Stacked Encoder의 구조

Auto Encoder자체가 비지도 학습이지만 Stacked Encoder는 Latent Space를 더 많이 사용하여 레이블되지 않은 데이터가 많을 때 사용하는 방법이다. 즉, Hidden layer를 더 많이 사용함으로써, 1)  전체 데이터를 학습시켜서 데이터를 레이블링한 다음 2)  하위 레이어를 사용하여 다시 학습시키는 방법을 사용하여 성능을 증가 시키는 방법을 사용한다. 

이 방법으로 일반적인 오토인코더보다 성능이 훨씬 개선되지만 정확한 수식이나 코드는 아직 보지 못했다. 최근에는 Denoising과 Stacked Auto Encoder를 섞어서 사용하는 것 같은데 이러한 방법에 대해서도 알아 봐야 할 것 같다. 다음에는 이, Stacked Denoising Auto Encoder아니면 Stacked나 Denoising Autoencoder의 코드를 알아 보도록 하겠다. 

-끝- 

 

 

Auto Encoder란 무엇인가

오토인코더란 비지도 학습의 하나로 사람이 라벨링을 해줘서 일일히 가르쳐 줘야 하는 지도학습과 달리(개, 고양이)분류를 하는 일반적으로 우리가 알고 있는 딥러닝과 같이

그림1. 지도 학습 알고리즘의 예시

레이블링을 따로 해 줄 필요가 없다. 

일반적으로 우리가 알고 있는 딥러닝의 구조가 그림2와 같다면 오토인코더의 구조는 그림3과 같다.

그림2. 딥러닝의 구조
그림3. 오토인코더의 구조

간단하게 설명하면 딥러닝을 2개 붙여놓은 구조이다.

  • 하나의 딥러닝 구조는 Encoder로 Hidden(latent space)로 압축 하는 것. 
  • 하나의 딥러닝 구조는 Decoder Hidden(latent space)으로 압축된 것에서 원본으로 복원하는 것. 

따라서 Auto Encoder를 거치면 원래의 Data를 비슷하게 복원할 수 있다.

하지만 Decoder는 Train Data즉 학습 Data만 제대로 복원할 수 있고 학습하지 않은 Data는 제대로 복원할 수 없다. 


 오토 인코더에 대해서는 자세한 수식도 있고 이에 대해서 설명한 글도 많이 있지만 이는 이해하지 못했으므로 추후에 포스팅 하도록 하고 이번에는 개념적인 것만 포스팅 하도록 한다. 

참고: https://lewisxyz000.tistory.com/22

파라미터 튜닝하는 방법으로는 

Grid Search

Random Search

배이지안 

최근에 나온 여러가지 방법들

4가지로 나눠 볼 수 있음. 

Grid Search가 가장 간단하지만 성능은 가장 안 좋음

여기서는 Grid Search에 대해서 서술함. 

* 사용법

def create_network(optimizer='rmsprop'):

        network = model.Sequential()

        ............................................................

neural_netowrk = KerasRegressor(buid_fn=create_network)

# => 탐색 할 하이퍼 파라미터 정의

.................................................................

#######################

hyperparameters = dict{epochs = epoch , optimizer = optimizers........}

grid = GridSerchCV(estimator = neural_network, param_grid = hyperparameters)

grid_result = grid.fit(X_val, y_val)

print(grid_result.best_params_)

 

 

tensorflow==2.0.0

keras==2.3.0

h5py==3.1.0

 

model을 못 읽는 desirialize? 직렬화에 대한 문제가 발생.

아무래도 버전업되면서 문제가 발생한듯

그런데 나는 이미 개발을 완료함

tensorflow랑 keras버전은 그대로 두고 다른 걸 변경해야 함

pip uninstall h5py

pip install h5py==2.10.0

문제해결

keras 2.3부터는 metric 형식이 업데이트 되었음

 

import keras

import tensorflow 한 뒤

tf.keras.losses.MeanAbsoluteError() 로 하니 해결됨. 

+ Recent posts