관리 메뉴

개발이야기

[Keras] Keras 기초 본문

Machine Learning /Keras

[Keras] Keras 기초

안성주지몬 2018. 7. 20. 18:57

이전에 연구실 발표를 다시 정리한 포스팅입니다.

Keras에 대해 기초적으로 설명하고 Mnist 예제를 구현한 코드를 리뷰해보겠습니다.


Keras 



keras에 대한 이미지 검색결과


케라스(Keras) 기본 개념 


- 케라스의 가장 핵심적인 데이터 구조는 “모델"이다.


- 케라스에서 제공하는 시퀀스 모델로 원하는 레이어를 쉽게 순차적으로 쌓을 수 있다. 



케라스 모델링 순서


케라스로 딥러닝 모델을 만들 때는 다음과 같은 순서로 작성된다.


1. 데이터 셋 생성하기

원본 데이터를 불러오거나 데이터를 생성한다.

데이터로부터 훈련셋, 검증셋, 시험셋을 생성한다.

이 때 딥러닝 모델의 학습 및 평가를 할 수 있도록 포맷 변환을 한다.


2. 모델 구성하기 

시퀀스 모델을 생성한 뒤 필요한 레이어를 추가하며 구성

좀 더 복잡한 모델이 필요할 때는 케라스 함수 API를 이용한다


3. 모델 학습과정 설정

학습하기 전, 학습에 대한 설정을 수행한다.

손실 함수 및 최적화 방법을 정의

케라스에서는 compile() 함수를 사용한다.


4. 모델 학습시키기
훈련셋을 이용하여 구성한 모델로 학습시킨다.
케라스에서는 fit() 함수를 사용한다.

5. 학습과정 살펴보기
모델 학습시 훈련셋, 검증셋의 손실 및 정확도를 측정한다.
반복횟수에 따른 손실 및 정확도 추이를 보면서 학습상황 판단.

6. 모델 평가
준비된 시험셋으로 학습한 모델을 평가한다.
케라스에서는 evaluate() 함수를 사용

7. 모델 사용하기
임의의 입력으로 모델의 출력을 얻는다.
케라스에서는 predict() 함수를 사용한다.

Mnist 구현 & 코드리뷰 


1. import keras & train set , test set 분리 


train : 훈련셋, train_images 에는 손글씨, 어떤 숫자를 의미하는지 정답을 써놓은 traing labels로 구성되어 있습니다.


Mnist data ? -------------------------------------------


이미지 데이터 중에서 가장 기본이 되는 데이터셋입니다. 이 데이터 셋은 우편번호에 사용되는 0부터 9까지의 숫자들을 사람이 직접 쓴 손글씨 이미지들로 구성이 되어 있습니다. 케라스 데이터셋 패키지를 이용하여 쉽게 부르고 사용할 수 있습니다. 훈련데이터와 시험 데이터를 불러준다.

 ----------------------------------------------------------



이미지데이터가 실제로는 픽셀 데이터로 구성이 되어있다는 것을 확인할 수 있습니다.





그래프 모듈을 사용하여 이미로 확인한 모습. 이 첫번째 데이터는 학습을 위한 5를 손글씨로 쓴 이미지인 것 같죠. 정말 5가 맞는지는 라벨 정보에 있으므로 결과 데이터의 첫 번째 데이터를 확인해보면 됩니다.



2. train set, test set 성분 확인



3. normalize 


mnist 이미지 데이터들은 흑백이지만, 그 진하기에 따라 0~255까지의 숫자로 되어있습니다. 0은 하얀색이고, 255는 검정색입니다. 이를 0~1사이의 값으로 Nomalize해줍니다.



float32로 변환하는 이유는 나누기 연산을 하여 0~1 사이 값을 가지게 하기 위함입니다!



4. Preprocess class labels for Keras.


이미지 데이터(인풋)을 reshape 해줬으니, 이번엔 라벨즈 데이터(아웃풋, class or label)도 수정을 해줘야합니다. One-hot encoding으로 수정을 해줄 것인데, 간단하게 설명드리면 0~9까지의 숫자중에서 5를 One-hot encoding으로 표현하게 되면, 5 => [0, 0, 0, 0, 0, 1, 0, 0, 0, 0] 로 바뀌게 됩니다.




5. Modeling


데이터셋을 생성하는게 모두 끝났습니다. 이제 모델을 구성할 것인데요. 앞서 keras 특징에서 설명한것처럼 시퀀스 모델을 생성한 뒤 필요한 레이어를 추가하며 구성합니다.




렐루(ReLU, Rectified Linear Unit) 활성화 함수는 최근 딥 뉴럴 네트워크의 히든 레이어에서 사용되는 기본 활성화 함수가 되었습니다. 이 함수는 간단한데 max(0, x) 로서 음수의 경우 0 을 리턴하고 그 외에는 x 를 리턴합니다.


-softmax


여기서 풀려는 문제는 입력 이미지가 주어졌을 때 0~9 까지 각 숫자와 얼마나 비슷한지에 대한 확률을 얻으려는 것임을 기억해 두세요. 예를 들면 우리 모델이 어떤 이미지에 대해 “9” 일 확률이 80% 이고 “8” 일 확률이 5%(9의 애매한 꼬리 부분으로 인해) 이며 다른 숫자에 대해서는 낮은 확률을 예측할 수 있습니다. 손글씨 숫자를 인식하는 것엔 어느정도 불확실한 부분이 있고 100% 확신을 가지고 하긴 어렵습니다. 이런 경우에 확률 분포는 예측에 대해 얼마나 신뢰할 수 있는지에 대해 좋은 정보를 제공합니다.


그래서 우리는 상호 배타적인 레이블에 대한 결과로 확률 분포를 담은 출력 벡터를 가집니다. 10개의 확률 값을 가진 이 벡터는 각각 0 에서 9 까지의 숫자에 대응되는 것이고 확률의 전체 합은 1 입니다.


앞서 언급한 것 처럼 이 벡터는 출력 레이어를 소프트맥스 활성화 함수로 구성하여 얻어집니다. 소프트맥스 함수를 사용한 뉴런의 출력 값은 그 레이어의 다른 뉴런의 출력 값에 영향을 받게 되고 그들의 출력 값 합은 1 이 되어야 합니다.


우선 network를 추가하고, network.add를 통해 인풋과 아웃풋 데이터를 설정한다. 마지막으로 compile을 하면서 데이터를 훈련시킨다.


신경망의 핵심 블록은 "계층"이란 데이터를 처리하는 모듈인데 데이터에 대한 "필터" 같은 거라고 생각하시면 됩니다. 어떤 데이터가 들어와서 좀 더 쓸만한 형태로 바뀌어서 나갑니다. 정확하게 말하자면, 계층에 주어지는 데이터에서 문제를 다루는 데에 있어 좀 더 의미가 있을 표현을 추출해 냅니다. 대부분의 심층학습은 실제로 점진적인 "데이터 증류" 형태를 구현하는 단순한 계층 간의 연결로 구성됩니다. 심층학습 모델은 데이터를 처리하는 체와 같이 점점 더 정교해지는 데이터 필터(바로 계층이죠)의 연속으로 이루어집니다.


우리 신경망은 두 개의 Dense 계층의 연속으로 이루어져 있습니다. Dense 계층은 '연결 밀도가 빽빽한(densely-connected)'('완전히 연결된, fully-connected'이라고도 합니다) 신경망 계층입니다. 두 번째(이자 마지막) 계층은 10개 범주의 "소프트맥스" 계층으로, 합계가 1이 되는 10개의 확률 점수의 배열을 반환합니다. 각 점수는 현재의 숫자 이미지가 10개 숫자 분류 각각에 속할 확률입니다.


모델 학습과정 설정


학습하기 전, 학습에 대한 설정을 수행합니다. 손실함수 및 최적화 방법을 정의하고 케라스에서는 compile 함수를 사용합니다.


우리 신경망을 훈련시킬 준비를 하기 위해 컴파일 단계로 3가지를 더 선택해야 합니다:


손실 함수

훈련 데이터에 대해 얼마나 신경망이 얼마나 잘 맞아들어가고 있는지 측량하여 바람직한 방향으로 조정하는 척도입니다.


최적화기

신경망이 받은 데이터와 손실 함수에 기반하여 스스로를 업데이트하는 메커니즘입니다.


메트릭

훈련 및 시험 중에 모니터링할 측정값입니다. 여기서는 정확도(올바르게 분류된 이미지의 비율)만을 모니터링합니다. 손실 함수와 최적화기의 정확한 목적은 다음 두 장에 걸쳐 명쾌하게 알아보도록 하겠습니다.



모델 학습

훈련셋을 이용하여 구성한 모델로 학습을 시킵니다. 케라스에서는 fit() 함수를 사용합니다. epochs=5 : 총 5번 훈련. batch_size=128 : 한 번에 128개씩 훈련.



학습과정 살펴보기

모델 학습시, 훈련셋, 검증셋의 손실(loss), 정확도(acc)을 측정합니다. 반복횟수에 따른 손실 및 정확도 추이를 보면서 학습상황을 판단합니다.


모델 평가


- 준비된 시험셋으로 학습한 모델을 평가합니다.

- 케라스에서는 evaluate() 함수를 사용합니다.



정확도가 98가 나오네요 !!


네 이번 포스팅은 여기까지였습니다. 다음 포스팅에서는 CNN을 이용하여 기존 모델과 정확도 차이가 얼만큼 나는지 확인해보도록하겠습니다.




-----------------------------------------------

위에 코드들은 아래 URL에서 확인하실 수 있습니다. 

https://github.com/AhnSungJoo/keras

Comments