Keras 시작하기2

Keras 시작하기에서 사용한 코드를 더 간단하게 만들어봤다. Keras는 기본적으로 Sequential 이라는 모델을 제공한다. 레이어를 쉽게 쌓을 수 있는 함수라고 생각된다. 기본적인 사용법은 Keras 공식 홈페이지에서 확인할 수 있다.

사실 공식 홈페이지만 봐도 충분한 사람들도 있겠지만 나는 공식 홈페이지만 봐서는 어떻게 시작해야할지 감을 잡기가 힘들었다. 그래서 Develop Your First Neural Network in Python With Keras Step-By-Step 을 보고 도움을 얻었다.

우선 전체코드부터 보자.
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
from keras.models import Sequential
from keras.layers import Dense
from sklearn.cross_validation import KFold

mnist_data = input_data.read_data_sets('MNIST_data', one_hot=True)
X_train = mnist_data.train.images
y_train = mnist_data.train.labels
X_test = mnist_data.test.images
y_test = mnist_data.test.labels


img = tf.placeholder(tf.float32, shape = [None, 784]) # "shape =" 생략해도 됨.

def create_model():
    model = Sequential()
    model.add(Dense(128, input_dim=784, activation='relu'))
    model.add(Dense(128, activation='relu'))
    model.add(Dense(10, activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

kf = KFold(55000)
for (train, test) in kf:
    model = create_model()
    model.fit(X_train[train], y_train[train], epochs=1)
    accuracy = model.evaluate(X_test, y_test)

model = create_model()
model.fit(X_train[htrain], y_train[htrain], epochs=1)
accuracy = model.evaluate(X_test, y_test)

print("\n%s : %.2f%%" % (model.metrics_names[1], accuracy[1] * 100))    

arr =  tf.argmax(model.predict(mnist_data.test.images[0:5]),1)
y = tf.argmax(mnist_data.test.labels[0:5],1)
with tf.Session() as sess:
    for i in range(0,5):
        print("\n예상값 : %d, 참값 : %d" % (sess.run(arr[i]), sess.run(y[i])))
한 눈에 봐도 Keras 시작하기에서 사용한 코드보다 짧고 간결한 것을 알 수 있다. 사실 저 코드가 잘 짜여진 코드인지는 아직 잘 모르지만, 결과가 잘 나왔으니 잘 짜여졌으리라고 믿고있다. 코드를 보면 dropout 이나 bias 초기값 등 학습 전에 설정해주어야하는 것들이 보이지 않는데, 기본값으로 이미 설정되어있기 때문이다. 물론 사용자가 직접 설정할 수도 있다.
model.add(Dense(128, input_dim=784, activation='relu'))
Dense는 fully connected layer를 생성하는 함수이다. input_dim = 784 인 이유는, img 변수가 mnist 데이터를 받아올 때 한 행에 784개씩 들어오기 때문이다. Dense의 가장 앞 파라미터는 레이어가 몇 개의 뉴런으로 이루어지는 지를 정하는데, 이 값을 어떻게 정할지는 경험적인 것이라고 한다. 너무 많아도, 너무 적어도 안 좋다. 그래서 몇 개의 뉴런으로 구성해야 좋은 결과를 얻을 수 있는지를 정해주는 기법도 있다고 한다.

가장 밑 줄의 model.metrics_names과 accuracy 는 [loss, acc] 으로 이루어져있다.

KFold 는 주어진 데이터를 훈련용과 테스트용으로 나눠주는 함수이다. MNIST는 이미 나눠져있기 때문에 쓸 필요가 없지만 보통의 경우에는 그렇지 않기 때문에 한 번 연습용으로 써봤다. 들어가는 인자는 데이터의 개수이다.