SW/인공지능

케라스 : classification : 분류 예제 실습

얇은생각 2019. 10. 24. 07:30
반응형
import matplotlib.pyplot as plt
import numpy as np
from keras.layers import *
from keras.utils import *
from keras.models import * 
from collections import Counter
%matplotlib inline

우선 필요한 라이브러리들을 선언합니다. 만약 설치되어 있지 않다면 설치를 진행해주세요.

 

x = np.random.uniform(-np.pi, np.pi, 500)
y = np.random.uniform(-1, 1, 500)

X = np.asarray([[x[i], y[i]] for i in range(500)])

sine = np.sin(x)
Y = sine < X[:, 1]

plt.scatter(x, sine)
plt.scatter(X[:,0][Y == 0], X[:,1][Y == 0])
plt.scatter(X[:,0][Y == 1], X[:,1][Y == 1])

사인함수로 분류

임의의 값들을 생성하였습니다. 그다음 대표적인 사인함수로 이 해당 값들을 라벨링해줍니다. 사인함수보다 크다면 True을 붙여주고, 사인함수보다 작다면 False을 붙여주었습니다. 해당 값을 그래프로 표현하면 다음과 같이 출력됩니다. 

 

Y = to_categorical(Y)
print(Y)
"""
[[[0. 1.]
  [1. 0.]]

 [[0. 1.]
  [1. 0.]]

 [[0. 1.]
  [1. 0.]]

 ...

 [[1. 0.]
  [0. 1.]]

 [[0. 1.]
  [1. 0.]]

 [[1. 0.]
  [0. 1.]]]
  """

 

그 다음, 해당 값들을 가지고 훈련을 하기 위해, to_categorical 함수를 활용하였습니다. 해당 값은 각 true, false를 위와 같이 분류하여 줍니다.

 

model = Sequential()

model.add(Dense(10, activation='relu', input_shape=(2,)))
model.add(Dense(10, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(2, activation='softmax'))

model.summary()

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

model.fit(X,Y, epochs=200)

"""
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_26 (Dense)             (None, 10)                30        
_________________________________________________________________
dense_27 (Dense)             (None, 10)                110       
_________________________________________________________________
dense_28 (Dense)             (None, 10)                110       
_________________________________________________________________
dense_29 (Dense)             (None, 10)                110       
_________________________________________________________________
dense_30 (Dense)             (None, 2)                 22        
=================================================================
Total params: 382
Trainable params: 382
Non-trainable params: 0
_________________________________________________________________
Epoch 1/200
500/500 [==============================] - 0s 863us/step - loss: 0.7499
Epoch 2/200
500/500 [==============================] - 0s 230us/step - loss: 0.6648
Epoch 3/200
500/500 [==============================] - 0s 194us/step - loss: 0.6341
"""

이제 Dense 레이어를 사용하여 모델을 생성하고, 훈련을 진행해봅니다. activation 함수는 relu로 사용하고, 마지막은 분류를 하기 위해, softmax 함수를 사용하였습니다. 그리고 로스함수는 크로스엔트로피, 최적화함수는 sgd를 사용하였습니다. 

 

score = model.evaluate(X, Y)
print(score)

"""
500/500 [==============================] - 0s 200us/step
0.0665539783835411
"""

이제 훈련이 잘 진행되었는지 evaluate 함수를 사용하여보았습니다. 값을 보니 잘 훈련된 것을 확인할 수 있었습니다. 

 

a = [-2, 0] # 초록색
b = [2, 0] # 주황색

pred_x = np.vstack((a,b))
pred = model.predict(pred_x)

print(pred)

"""
[[4.5925056e-04 9.9954081e-01]
 [9.9599540e-01 4.0045627e-03]]
 """

이제 직접 임의의 데이터를 만들어 실제 예측을 해보도록 하겠습니다. x의 좌표에 따라서 99.9퍼센트로 확신을 하고 있는 모델의 모습을 확인하실 수 있습니다.

 

머신러닝, 딥러닝이 가장 잘하는 것 중 하나인 분류 예제에 대해 알아보았습니다. 이처럼, 다양한 데이터를 일괄적으로 만들어 라벨링을 한다면, 기본적인 ai를 만들 수 있다는 것을 알게 되었습니다. 이제 실제 이미지 데이터를 활용해, 좀 더 심화된 학습을 한다면 더욱 재미있을 것 같습니다. 

반응형