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 개의 댓글:
댓글 쓰기