케라스
케라스는 딥러닝 패키지를 편리하게 사용하기 위해 만들어진 래퍼(wrapper) 패키지이다.
대표적인 딥러닝 패키지인 텐서플로, 씨아노 등을 사용해 신경망을 구현하려면 꽤 많은 양의 코드를 입력해야 한다.
코드를 살펴보자.
#훈련할 가중치 변수 선언
w = tf.Variable(tf.zeros(shape=(1)))
b = tf.Variable(tf.zeros(shape=(1)))
#경사 하강법 옵티마이저 설정
optimizer = tf.optimizers.SGD(lr = 0.05)
#에포크만큼 훈련
num_epochs = 10
for step in range(num_epochs):
#미분 연산 과정 기록
with tf.GradientTape() as tape:
z_net = w * x_train + b
z_net = tf.reshape(z_net, [-1])
sqr_errors = tf.square(y_train - z_net)
mean_cost = tf.reduce_mean(sqr_errors)
#손설 함수 가중치 그레이디언트 계산
grads = tape.gradient(mean_cost, [w, b])
#옵티마이저 그레이디언트 계산
optimizer.apply_gradients(zip(grads, [w, b]))
텐서플로와 케라스를 이용하여 간단한 예제를 만들어 봤다.
이를 케라스로 구현하면 어떻게 될까?
#모델 생성
model = tf.keras.models.Sequential()
#완전 연결층 추가
model.add(tf.keras.layers.Dense(1))
#옵티마이저와 손실함수 지정
model.compile(optimizer='sgd', loss='mse')
#훈련
model.fit(x_train, y_train, epochs=10)
코드의 양이 확 줄었다.
구글은 케라스를 아예 텐서플로 안에 포함시켰다. 텐서플로 2.0에서는 아예 케라스를 텐서플로의 주력 파이썬 API로 만들었다. 케라스의 대표 구현은 오픈 소스로 여전히 씨아노나 텐서플로를 백엔드(backend)로 지정하여 사용할 수 있다.
텐서플로에 구현된 tensorflow.keras 모듈은 케라스 명세를 따르는 텐서플로만을 위한 구현이다.
케라스는 인공신경망 모델을 만들기 위한 Sequential 클래스와 완전 연결층을 만들기 위한 Dense 클래스를 제공한다.
Sequential 클래스는 이름의 그대로 '순차적으로 층을 쌓은 신경망 모델'이다.
Dense 클래스는 모델에 포함된 완전 연결층이다. 그림에서와 같이 모두 다 연결된 층을 말한다.
Sequential 클래스 사용방법
사용법은 간단하다.
모델을 생성한 뒤 add() 메소드를 이용하여 층을 추가하면 된다.
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
model = Sequential([Dense(...),...])
이와 같이 하면 된다.
Dense 클래스 사용방법
Dense 클래스에 전달해야 하는 첫 번째 매개변수는 층의 유닛(unit) 개수이다.
두 번째 매개변수는 활성화 함수를 지정하는 activation이다. default는 None이다. sigmoid, softmax, relu 등 많은 함수가 있다.
모델의 최적화 알고리즘과 손실 함수 설정
모델을 훈련하기 위해서는 최적화 알고리즘이나 손실 함수를 지정해야 한다.
다중 분류의 최적화 알고리즘은 경사 하강법 알고리즘을 사용하고, 손실 함수는 크로스 엔트로피 손실 함수를 사용한다.
model.compile() 메소드를 사용하여 최적화 알고리즘과 손실 함수를 지정한다.
텐서플로에는 경사 하강법을 비롯하여 널리 사용되는 최적화 알고리즘이 이미 구현되어 있다.
최적화 알고리즘은 매개변수 optimizer를 사용한다.
손실 함수 지정하는 매개변수는 loss이다.
제곱 오차, 로지스틱 손실 함수, 크로스 엔트로피 손실 함수 등 많은 손실 함수가 있다.
제곱 오차의 경우 loss 매개변수를 mse로 지정하고 로지스틱 손실함수의 경우 binary_crossentropy,
다중 분류는 categorical_crossentropy로 지정한다.
model.complie(optimizer='sgd', loss='categorical_crossentropy')
케라스로 다중 분류 신경망 생성
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
#모델 생성
model = Sequential()
#은닉층과 출력층 추가
model.add(Dense(100, activation='sigmoid', input_shape=(784,)))
model.add(Dense(10, activation='softmax'))
#최적화 알고리즘과 손실 함수 지정
model.compile(optimizer='sgd', loss='categorical_crossentropy', metrics=['accuracy'])
#훈련
history = model.fit(x_train, y_train_encoded, epochs=40, validation_data=(x_val, y_val_encoded))
이렇게 훈련이 진행되는 과정을 볼 수 있다.
이제 결과를 봐보자.
print(history.history.keys())
history객체에 어떤 값들이 들어가 있는지 살펴보았다.
손실(loss)과 정확도(accuracy), 검증 손실(val_loss), 검증 정확도(val_accuracy)가 저장되어 있다.
이를 시각화해보자.
import matplotlib.pyplot as plt
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train_loss', 'val_loss'])
plt.show()
손실 그래프는 일정한 수준으로 감소하는 추세를 보인다.
import matplotlib.pyplot as plt
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train_accuracy', 'val_accuracy'])
plt.show()
정확도 그래프도 점진적으로 증가한다.
검증 세트 정확도는 그럼 어떻게 될까??
evaluate() 메서드를 사용하면 손실값과 metrics 매개변수에 추가한 측정 지표를 계산하여 반환한다.
40번의 에포크로 정확도는 약 86% 임을 확인했다.
loss, acccuracy = model.evaluate(x_val, y_val_encoded, verbose=0)
print(acccuracy)