인공지능 및 데이터과학/딥러닝 프레임워크

케라스(Keras) #1 - 학습의 이해 및 간단한 방정식 풀이

Steve Jang 2019. 11. 19. 17:24

케라스(Keras) 설치가 완료되었으면, 이제 케라스를 이용해서 본격적으로 간단한 문제를 학습을 통해서 풀어보는 시간을 갖도록 하겠다. 


학창 시절 방정식 문제를 지겹게 풀어봤을 터인데 컴퓨터의 학습은 바로 이 방정식으로 끝이 난다고 해도 과언이 아니다. 


y = ax + b


위에 있는 매우 쉬운 공식은 머신러닝과 딥러닝을 이해하기 위한 공식이며, 이것만 이해할 줄 안다면 모든 것은 아니지만 딥러닝을 학습할 준비는 모두 끝이 난 것이다.


위 공식을 기반으로 문제를 생성을 한번 해보겠다.


5 = a*2 + b

3 = a*1 + b

7 = a*3 + b


위 문제들을 보았을 때, a와 b의 값은 무엇일까? 사실 이정도는 수학과 담을 쌓은 사람이라고 해도 쉽게 풀 수 있을 것이다. 정답은 a=2, b=1 이다.


딥러닝을 포함한 머신러닝은 바로, a의 값이 2인 것과 b의 값이 1인 것을 맞추는 작업을 하는 것이다. 우리가 위의 값을 풀었을 때 대입을 해서 얻어 걸린 케이스도 있을 것이고, 직관적으로 3,5,7이라는 값의 차이로 맞춘 사람이 있을 것이다. 


사람은 다양한 방법으로 문제를 풀 수 있지만, 컴퓨터는 이러한 방법으로 풀 순 없다. 물론, 풀어야 되는 규칙을 미리 지정해서 해당 방법으로 문제를 풀라고 하면 금방하겠지만, 그건 어디까지나 인간이 크게 개입한 것이고 개발자의 알고리즘의 영향을 받았기에 딥러닝이나 머신러닝 분류는 아닐 것이다.


컴퓨터는 a와 b에 수많은 값들을 대입해본 후, 가장 유사한 값을 스스로 찾아나가면서 문제를 풀게 되는데 다음에서 설명할 케라스 소스로 컴퓨터의 사고 방식을 터득하며, 케라스의 간단한 사용법도 익혀보도록 하겠다.



코드(Code) 및 설명


라이브러리 지정


1
2
3
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
import numpy as np
cs


우선, 위와 같은 라이브러리들을 사용할 것이라 선언을 한다. 해당 모듈에 대한 설명은 아래 참고



값 세팅


1
2
= np.array([12345])
= x * + 1
cs


데이터를 세팅한다. x는 1,2,3,4,5라는 값의 배열로 되어 있으며, y는 배열값에 2를 곱하고, 1을 더한 결과를 저장한다. 즉 y는 3,5,7,9,11 이라는 값이 세팅된다.


print(x) 결과 : [1 2 3 4 5]

print(y) 결과 : [ 3  5  7  9 11]



모델링


1
2
3
4
# 학습 구조 모델링
model = Sequential()
model.add(Dense(1, input_shape=(1,)))
model.compile('SGD''mse')
cs


데이터 x와 y를 세팅하였으면, 이제 학습하기 위한 모델링을 생성한다. 여기서 Sequential() 이라는 것은 학습을 하기 위해서 레이어를 층층이 쌓아주는 메소드이이며, Dense라는 것으로 층을 설정할 수 있다. 모델링의 마지막은 compile 단계로 compile을 통해서, 현재의 과정들을 조립 하게 된다.


compile단계에서 지정한 SGD와 mse는 각각 SGD(Stochastic gradient descent, 확률적 경사 하강법)와 MSE(Mean Squared Error, 평균 제곱 오차)의 의미를 담고 있는데 학습을 하는 방법(정답을 찾는 과정)을 지정한 것으로 이해를 하고 넘어가도록 하자(해당 의미를 알고 있는 분들은 케라스가 참 편하다는 것을 알 수 있을 것이다)



학습 수행


1
2
# 학습 수행
model.fit(x, y, epochs=100, verbose=0)
cs


학습은 fit 메소드를 호출하여 실행한다. epochs(에포크)는 학습의 전체 반복 주기이며 verbose는 학습의 진행 상황을 보여줄 것인지 지정을 하는데 verbose를 1로 세팅하면 학습이 되는 모습을 볼 수 있다.


5/5 [==============================] - 0s 200us/sample - loss: 0.0031

Epoch 99/100


5/5 [==============================] - 0s 200us/sample - loss: 0.0031

Epoch 100/100


verbose를 1로 지정했을 때 보여지는 화면은 위와 같다. Epoch의 상황과, loss의 값이 보여져서 verbose를 1로 지정하는것이 좋아보일 수도 있지만 너무 많이 print가 찍히기 때문에 상황에 따라 설정을 하는 것이 좋아보인다.



평가


1
2
# 평가
print('y:', y, ',predict:', model.predict(x).flatten())
cs


마지막으로 결과를 뿌려서 실제값과 예측값이 얼마나 같은지 확인할 수 있다. 위 내용들을 소스로 다시 적자면



전체 소스


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
import numpy as np
 
# 데이터 세팅
= np.array([12345])
= x * + 1
 
 
# 학습 구조 모델링
model = Sequential()
model.add(Dense(1, input_shape=(1,)))
model.compile('SGD''mse')
 
# 학습 수행
model.fit(x, y, epochs=100, verbose=0)
 
# 평가
print('y:', y, ',predict:', model.predict(x).flatten())
cs


위와 같으며, 결과는



결과 (Epochs=100)


y: [ 3  5  7  9 11] ,predict: [ 2.9075465  4.942965   6.978383   9.013802  11.04922  ]


위와 같이 출력이 되며, 좀 더 정답과 가깝게 하려면 epoch의 값을 올려준다



결과 (Epochs=1000)


y: [ 3  5  7  9 11] ,predict: [ 2.979299   4.9872293  6.9951596  9.003091  11.011022 ]


Epochs를 1000으로 올린 후, predict 값들이 실제 y 값과 좀 더 가까워졌음을 알 수 있다.