본문 바로가기
  • 조금 느려도, 꾸준히
Artificial Intelligence/Machine Learning

[Keras Deep Learning] 신경망 Tutorial

by chan 2020. 4. 18.
반응형

# Why Keras?

필자는 이전까지 [핸즈온 머신러닝] 시리즈를 이어왔다. 

핸즈온 머신러닝은 아주 유명하고 좋은 서적이나, 1판 기준으로는 2부 신경망/Deep learning 주제에서 Tensorflow 1 버전을 이용하기에, 트렌드에 뒤쳐진 측면이 있었다.

 

Tensorflow 는 지난해 2.0 버전을 발표하면서 Keras를 주력 기반 프레임워크로 내세웠으며, Keras는 기존의 TF 1버전에 비해 초보자들도 사용하기 쉽고 간단한 문법으로 이루어져 있다.

 

따라서 일반 Machine Learning, 즉 핸즈온 머신러닝 시리즈에서 1부에 해당하는 부분은 핸즈온 머신러닝의 Scikit-Learn으로 진행하였고, 신경망/기타 다른 Deep Learning 에 대해서는 Keras를 이용하는 방향으로 연재를 진행하려 한다.

 

* 참고로 TF 2 버전으로 내용이 개정된 핸즈온 머신러닝 2판 버전이 번역이 완료되어 현재 예약 구매를 진행하고 있으니, 관심있는 사람들은 참고하면 좋겠다.

 

지금부터 진행에 참고할 서적은 [케라스 창시자에게 배우는 딥러닝] 이라는 책이며, 프랑소와 숄레 저의 역시나 너무나도 유명한 입문 서적이다. 

현재 딥러닝 스터디 운영을 시작했는데, 이 책을 참고도서로서 채택하였으며 매주 프레젠테이션 밋업에서 공유하는 내용들을 연재글에 담을 예정이다.

 

 # Keras Tutorial

본격적으로 신경망 학습에 대한 내용을 다루기에 앞서, 이번 글에서는 간단히 Keras 를 이용해 손글씨 숫자 분류를 학습하는 신경망을 구현한 코드를 훑어보고, 리뷰하는 시간을 가져보겠다. '케라스는 이렇게 생겼구나' 하는 마음으로 가볍게 읽어주시면 감사하겠다.

 

#1
%tensorflow_version 1.x  #tensorflow downgrade magic

#2
from keras.datasets import mnist

#3
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

코드 마다 주석으로 번호를 달아놓았다. 

 

#1 이 코드는 사실 필요할 수도, 필요하지 않을 수도 있는 코드인데, 만약 구글 Colab을 이용할 경우, 디폴트 값으로 Tensorflow 2.x 버전이 설치 되어 있을 수도 있다.

 

만약 그런 경우라면, 앞으로 진행할 Keras 코드들이 오류를 일으킬 수있다. 왜냐하면, 기본적으로 Keras는 독립적인 프레임워크가 아니라, Tensorflow 백엔드에서 실행되는 모듈이기 때문에, Tensorflow 1.x 백엔드 상에서 실행되는 Keras 와 TF 2 버전의 tf.keras 는 살짝 차이가 있다.

 

보통 TF 1 백엔드에서 실행되는 Keras 는 기존에 알려진 Keras이고, tf.keras 는 기존의 케라스와 거의 같지만 tensorflow 스타일과 살짝 합쳐진 형태라고 지금은 그렇게 생각하면 된다.

 

 

#2 keras 의 datasets라는 모듈에서 mnist 손글씨 데이터를 임포트 하였다.

 

 

#3 mnist 모듈에는 load_data() 라는 함수가 존재하는데, 이 함수를 호출하면 (Train set), (Test set) 형태의 테이터를 반환한다. 각각의 set 에는 숫자 이미지와 그에 따른 레이블(답) 이 존재한다.

 

#1
from keras import models
from keras import layers

#2
network = models.Sequential()

#3
network.add(layers.Dense(512, activation='relu', input_shape=(28*28,)))

#4
network.add(layers.Dense(10, activation='softmax'))

#1 keras 에서 models 와 layres 라는 클래스를 임포트하였다. models는 기본적으로 학습 모델 구축에 전반적으로 사용되는 모듈이고, layers는 앞으로 다룰 신경망에서 어떤 함수를 이용해 학습하는 층을 만들지 결정할 때 사용되는 모듈이다.

 

 

#2 network라는 변수에 models.Sequential() 함수를 할당하였는데, keras,models의 Sequential 함수는 말 그대로 여러 레이어(layer)들을 순차적으로 쌓아서 모델을 만든다는 것이다. 

 

 

#3 방금 선언한 Sequential 모델에 레이어를 추가한 코드인데, 보면 add라는 괄호 안에 layers.Dense 라고 되어 있다. 이는 keras의 Core layer 중 하나인 densely-connected NN 레이어, 즉 '밀집하게 연결된 신경망'으로 다음에 다루겠지만 fully-connected 신경망을 말한다. 

 

Dense 내의 Arguments를 보면, 512, 'relu', (28*28) 이라고 되어 있는데, 간단히 살펴보면 다음과 같다.

 

units=512 : 데이터가 layer를 통과했을 때 output 공간. 즉 512개의 output을 반환한다.

activation='relu' : activation 함수로 max(value,0)을 반환한다. 자세한 내용은 다음 장에서 다루도록 한다.

input_shape=(28*28, ) 입력되는 데이터의 사이즈와 차원을 규정. 28*28 size의 2D 데이터를 입력한다.

 

 

#4 이전과 같은 방법으로 output 이 10, activation 함수가 softmax 인 fully-connected layer 를 추가한다.

softmax 는 모든 output 값의 합이 1이 되는 확률 점수를 반환한다. 즉 위 코드에서 전체적인 신경망 model이 데이터를 학습하면 0~9 까지 레이블에 해당하는 학률 점수를 반환하게 되고, 가장 높은 확률 점수의 레이블을 답으로 채택하는 것이다.

 

#1
network.compile(optimizer='rmsprop',
                loss='categorical_crossentropy',
                metrics=['accuracy'])

#1 모델의 구성을 마쳤다면 모델을 컴파일 하는 과정을 거쳐야 한다. 컴파일 단계에는 세 가지 항목이 필요하다.

- 옵티마이저(optimizer): 입력된 데이터와 손실 함수를 바탕으로 신경망을 업데이트 한다.

- 손실 함수(loss function): 훈련 데이터에서 신경망의 성능을 측정하는 방법을 규정한다. 옳은 방향으로 학습할 수 있게 하는 수단

- 모니터링 지표(metrics): 어떤 지표를 이용해서 학습 방향을 결정할 것인지 규정한다.

 

모델을 컴파일 하는 과정은 Theano의 Wrapper 라이브러리의 흔적이다. Tensorflow 에서는 옵티마이저, 손실함수, 측정 지표를 연결해 계산 그래프로 구성하는 과정을 거친다.

 

#1
train_images = train_images.reshape((60000,28*28))
train_images = train_images.astype('float32')/255

#2
test_images = test_images.reshape((10000,28*28))
test_images = test_images.astype('float32')/255

#1, #2 훈련 데이터와 테스트 데이터를 input 사이즈에 맞게 (데이터 개수, 28 * 28) 사이즈로 reshape 하고( 원래는 (데이터 개수, 28, 28) 사이즈였다), 스케일링을 통해 [0,255] 범위의 값을 [0,1] 범위의 값으로 스케일 조정한다. 이는 훈련이 정상적으로 되기 위해서 값을 조정해 준 것이다. (뒤에서 relu 와 softmax 를 포함한 함수들을 공부하고 나면 이해가 될 것이다.)

 

#1
from keras.utils import to_categorical

train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)

#2
network.fit(train_images,train_labels,epochs=5,batch_size=128)

#1 keras.utils.to_categorical 함수는 주어진 Vector 데이터를 Matrix로 변환하여 반환한다.

즉 위 코드에서 train 과 test label 들을 파라미터로 넣어주었기 때문에, 변환된 레이블은 벡터에서 텐서로 변환되어 학습 과 결과를 정상적으로 이루어지게 한다. 

( 1부에 연재한 내용을 상기하면, 대부분 학습하고, 검증하는 과정에서 행렬곱이 사용된다. 즉 위 코드는 그러한 행렬곱이 가능하도록 1차원 벡터를 행렬로 바꾸어준 것이다)

 

 

#2 network.fit 메서드를 통해 모델을 학습시킨다. 

 

 

 

 

간단하게 keras 코드를 훑어 보았는데, 이렇게 하면 간단한 몇줄 코드로 신경망을 구축한 셈이 된다. 다음 포스트 부터는 신경망에 대한 보다 구체적이고 자세한 내용을 다루도록 하겠다.

 

반응형

댓글