케라스는 파이썬으로 구현된 쉽고 간결한 딥러닝 라이브러리로, 내부적으로 텐서플로우Tensorflow, 티아노Theano,CNTK 등의 딥러닝 전용 엔진이 구동되지만 내부엔진을 알 필요 없이 직관적인 API로 쉽게 다층퍼셉트론 신경망 모델, 컨벌루션 신경망 모델, 순환 신경망 모델 등 다양한 구성을 할 수 있다.
케라스의 가장 핵심적인 데이터 구조는 바로 모델이다. 케라스에서 제공되는 시퀀스 모델을 사용하면 원하는 레이어를 쉽게 순차적으로 정의할 수 있고, 다중 출력과 같이 좀 더 복잡한 모델을 구성하려면 케라스 함수 API를 사용하면 된다. 케라스로 딥러닝 모델을 만들 때는 다음과 같은 순서로 작성한다.
과정 | 설명 |
---|---|
데이터셋 전처리 | 원본 데이터를 불러오거나 시뮬레이션을 통해 데이터 생성. Training set, Test set, Validation set을 생성하며 이 때 모델의 학습 및 평가를 할 수 있도록 format 변환을 한다. |
모델 구성 | 시퀀스 모델을 생성한 뒤 필요한 레이어를 추가하여 구성하며 좀 더 복잡한 모델이 필요할 때 케라스 함수 API를 사용한다. |
모델 학습 설정 |
학습하기 전 학습에 대한 설정을 수행하는데 Loss 함수(ex. cross-entropy) 및 최적화 방법(ex. Gradient Descent)을 정의하고 케라스에서는 compile() 함수를 사용한다. |
모델 학습 | 구성한 모델을 Training dataset으로 학습시키는데 fit() 함수를 사용한다. |
학습 과정 살펴보기 |
모델 학습 시 Training dataset, Validation dataset의 Loss 및 Accuracy를 측정하고 반복 횟수(epoch)에 따른 Loss 및 Accuracy 추이를 보며 학습 상황을 판단한다. |
모델 평가 | 준비된 Test dataset으로 학습한 모델을 평가하는데 evaluate() 함수를 사용한다. |
모델 사용 | 임의의 입력으로 모델의 출력을 얻는데 predict() 함수를 사용한다. |
케라스에서는 층을 조합하여 모델을 생성한다. 레이어 인스턴스를 생성자에게 넘겨줌으로써 Sequential
모델을 구성할 수 있다.
from keras.models import Sequential
from keras.layers import Dense, Activation
model = Sequential()
model.add(Dense(32, input_dim=784, activation='sigmoid')) # 층 갯수, 입력값 수, 활성화 함수
모델을 학습시키기 이전에, compile
메소드를 통해서 학습 방식에 대한 환경설정을 해야 한다. 다음의 세 개의 인자를 입력으로 받는다.
- 정규화기 (optimizer)
rmsprp
나adagrad
와 같은 optimizer에 대한 문자열 식별자 또는Optimizer
클래스의 인스턴스를 사용할 수 있다.
- 손실 함수 (loss function)
- 모델 최적화에 사용되는 목적 함수이다.
categorical_crossentropy
또는mse
와 같은 기존의 손실 함수의 문자열 식별자 또는 목적 함수를 사용할 수 있다. 참고: 손실
- Metrics
- 분류 문제에 대해서는
metrics=['accuracy']
로 설정한다. 기준은 문자열 식별자 또는 사용자 정의 기준 함수를 사용할 수 있다.
- 분류 문제에 대해서는
# For a multi-class classification problem
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
# For a binary classification problem
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
# For a mean squared error regression problem
model.compile(optimizer='rmsprop',
loss='mse')
# For custom metrics
import keras.backend as K
def mean_pred(y_true, y_pred):
return K.mean(y_pred)
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy', mean_pred])
fit()
은 오차로부터 매개변수를 업데이트시키는 과정을 학습 과정을 수행하는 역할을 한다.- epoch: 전체 학훈련데이터 학습을 몇 회 반복할지 결정
- batch_szie: 계산하는 단위 크기
- validation_data: 모델의 성능을 모니터링하기 위해서 사용. 입력과 정답 데이터로 이루어진 검증 데이터를 전달하면 1회 epoch이 끝날때마다 정달된 검증데이터에서의 손실과 평가지표를 출력함
model.fit(x,y,epochs=3000,batch_size=1)
훈련데이터(x, y)와는 별도로 모델을 계속 학습하면서 각 에폭마다 검증데이터로 현재 모델에 대한 유효성(성능)을 검증할 수도 있다. 보통은 전체 훈련 데이터와 검증데이터를 8:2 비율로 분할하여 사용하며, 이때는 다음과 같이 코드를 구성하면 된다.
model.fit(x,y,epochs=3000,batch_size=1,validation_split=0.2)
# For a single-input model with 2 classes (binary classification):
model = Sequential()
model.add(Dense(32, activation='relu', input_dim=100))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
# Generate dummy dataimport numpyas np
data = np.random.random((1000, 100))
labels = np.random.randint(2, size=(1000, 1))
# Train the model, iterating on the data in batches of 32 samples
model.fit(data, labels, epochs=10, batch_size=32)
# For a single-input model with 10 classes (categorical classification):
model = Sequential()
model.add(Dense(32, activation='relu', input_dim=100))
model.add(Dense(10, activation='softmax'))
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
# Generate dummy dataimport numpyas np
data = np.random.random((1000, 100))
labels = np.random.randint(10, size=(1000, 1))
# Convert labels to categorical one-hot encoding
one_hot_labels = keras.utils.to_categorical(labels, num_classes=10)
# Train the model, iterating on the data in batches of 32 samples
model.fit(data, one_hot_labels, epochs=10, batch_size=32)
evaluate()
: 테스트 데이터를 통해 학습한 모델에 대한 정확도를 평가predict()
: 임의의 입력에 대한 모델의 출력값을 확인
keras로 XOR을 분류하는 인공지능을 만들어보자
import numpy as np
import tensorflow as tf
x = np.array([[1,1], [1,0], [0,1], [0,0]])
y = np.array([[0],[1],[1],[0]])
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(units=2, input_dim=2, activation='sigmoid'))
model.add(tf.keras.layers.Dense(units=1, activation='sigmoid'))
model.compile(optimizer=tf.optimizers.SGD(learning_rate=0.1), loss='mse') # mse는 값을 이분화시켜줌. 여러개면 categorical_entropy 사용
model.summary()
history = model.fit(x, y, epochs=3000, batch_size=1)
for weight in model.weights:
print(weight)
loss = model.evaluate(x,y,batch_size=1)
print(loss)
print("====================================")
print(x)
print(model.predixt(x))
print("====================================")
# 출력값
====================================
[[1 1]
[1 0]
[0 1]
[0 0]]
1/1 [==============================] - 0s 256ms/step
[[0.09821586]
[0.92452645]
[0.92447394]
[0.06521357]]
====================================