2016년 3월 18일 금요일

tensorflow 접근 퀵가이드

본문은 알파고로 유명세를 타고있는 tensorflow에 대한 접근 과정에 필요한 정보들을 요약한다.
tensorflow를 편하게 사용하기 위해서 만들어진(wrapped) skflow를 통해서 tensorflow를 다루는 간략한 예제와 기존의 유명한 학습 기법과 성능을 비교해 본다.

1. skflow 소개 및 DNN 사용 예제

skflow는 파이썬의 대표적인 기계학습 라이브러리인 scikit-learn과 구글에서 공개한 딥러닝 도구 tensorflow를 조합한 라이브러리다.
익숙한 scikit-learn의 인터페이스를 통해서 tensorflow를 참조 모델 셋으로 사용하기 때문에, 기존 기계학습 사용자들이 편하게 접근 할 수 있게 도와준다.

사용 방법:
# 텐서 플로우 DNN 설정
clf = skflow.TensorFlowDNNClassifier(hidden_units=h, n_classes=n)
# 학습 데이터 입력
clf.fit(mf.train_data, mf.train_target, logdir='log_dnn')
# 실험 데이터의 실제 결과와 모델의 예측치와 비교
score = metrics.accuracy_score(mf.test_target, clf.predict(mf.test_data))
print("Accuracy: %f with TF_DDN" % score)
# 모니터링 보기
command$ tensorboard --logdir=log_dnn/2016-03-18_18-15-08
# tensorboard에서 Loss 추이 화면 (MNIST 학습 과정)
**
hidden_units은 복수개의 은닉 계층을 뜻한다.
예를 들면, [10,20]의 입력 값은 10개의 unit과 20개의 unit으로 이루어진 2개의 은닉계층을 표현한다. 최적의 값을 위한 은닉계층의 수나 유닛의 수는 실험적인 결과를 통해 유추는 것으로 보인다. (좀 더 학습이 필요한 부분이다.)


2. tensorflow의 딥 뉴럴 네트워크(DNN)와 기존 기법과 성능 비교


알고리즘 수행시간 정확도 비고
IRIS
4개의 속성
데이터 150개
학습 90%
테스트 10%
DNN 1.2 s
0.933333
h=[10,20,10]
GNB 2.81 ms
0.933333

SVM 1.82 ms
0.966667
kernel=rbf (방사형 함수)
Decision Tree 5.2 ms
0.933333

MNIST
784개의 속성
학습 55000개
테스트 10000개
DNN 1.8 s
0.769600
h=[10,20,10]
DNN 13.7 s
0.903400
h=[1000,2000,1000]
GNB 1.43 s
0.549200

SVM 12min 50s
0.943900
kernel=rbf (방사형 함수)
Decision Tree 26.5 s
0.872400

**
SVM은 정확도는 높고 성능은 낮다.
GPU를 사용하지 않음에도 불구하고, DNN이 소요 시간 대비 성능이 높다. (hidden_units에 따라 성능과 속도를 적절하게 조정한다.)


참고

MNIST 데이터 내려받기
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

55,000 data points of training data (mnist.train)
10,000 points of test data (mnist.test)
and 5,000 points of validation data (mnist.validation)

mnist.train.images는 이미지를 일렬로 나열한 배열이다.
mnist.train.labels는 이미지의 라벨을 One-hot 코드로 나열한 배열이다.

IRIS 테이터 내려 받기
from sklearn import datasets
from sklearn.cross_validation import train_test_split
iris = datasets.load_iris()
train_data, test_data, train_target, test_target = train_test_split(iris.data, iris.target, test_size=0.2)

data shape (150,4)

MNIST
손으로 쓴 디지털(숫자) 이미지 데이터베이스이다.

One-Hot
전자 회로에서 단 한개의 상태만 high(1)를 가지고 나머지는 low(0) 상태를 가지는 비트의 그룹을 의미한다. One-Cold의 경우 반대로 단 한개의 상태만 low(0)를 가진다.
예를 들면, 8의 경우 0000000100과 같이 8 번째 위치에 1을 넣어서 표기한다.

사용 라이브러리
import skflow
from sklearn import svm, tree, naive_bayes
from tensorflow.examples.tutorials.mnist import input_data
from sklearn.cross_validation import train_test_split
from sklearn import datasets, metrics

0 개의 댓글:

댓글 쓰기