텐서플로우 튜토리얼 – 1

이 글은 Illia Polosukhin 가 쓴 TensorFlow Tutorial – Part 1 을 번역한 글 입니다.
(update: 2016-04-18) 텐서플로우 0.8 버전에 맞추어 코드를 수정하였고 번역을 다듬었습니다. 아래 예제를 쥬피터 노트북으로 작성하여 깃허브에 올려 놓았습니다.
(update: 2016-08-29) 일리아 폴러서킨(Illia Polosukhin)이 주로 TF.Learn에 관해 수정한 내용을 반영하였습니다. 일리아의 코드는 TF 0.10에 맞춰진 것으로 정식버전이 릴리즈 되면 깃허브의 내용을 수정하겠습니다.

구글이 텐서플로우 머신러닝 프레임워크를 공개하고 나서 광풍이 휘몰아치고 있습니다. 깃허브에는 만개가 넘는 별이 달리고 인공지능 연구자들 사이에서 이미 큰 관심을 모으고 있습니다

그럼 데이터 과학자들이 할 법한 일들을 위해 텐서플로우를 어떻게 사용할 수 있을까요? (그리고 당신이 인공지능 연구자라면-앞으로 흥미로운 문제들과 마주하게 될 것입니다.)

왜 텐서플로우인가?

당연한 질문입니다. 데이터 과학자로서 이미 R, Scikit Learn 등 여러 툴들을 사용하고 있는데 왜 또 다른 프레임워크를 다루어야 하는걸까요?

대답은 두가지 입니다:

  • 텐서플로우의 딥러닝 파트는 하나의 모델 안에서 여러개의 다른 모델을 쌓아 올리거나 변환시킬 수 있고 한꺼번에 모두를 학습시킬 수 있습니다. 텍스트, 이미지 그리고 일반적인 카테고리 속성이나 숫자 속성 변수를 한 모델에서 쉽게 다룰 수 있습니다. 또 동시에 여러개의 타겟(target)과 로스(loss) 함수를 다룰 수 있고 프리러닝(pre-learning)이나 보통의 방식으로는 불가능하거나 거의 어려운 여러 머신러닝 테크닉들을 수행할 수 있습니다.
  • 텐서플로우의 파이프라인은 데이터 프로세싱에 점점 강력해지고 있습니다. 향후에는 데이터 프로세싱과 머신러닝이 모두 하나의 프레임워크에서 수행될 것인데 텐서플로우는 그 방향으로 나아가고 있습니다.

타이타닉 데이터셋을 이용한 심플 모델

캐글(Kaggle)의 타이타닉(Titanic) 데이터셋을 이용하여 간단한 예를 시작해 보겠습니다.

먼저 텐서플로우(TensorFlow)와 사이킷런(Scikit Learn) 패키지를 설치합니다. 아마 몇몇 라이브러리도 함께 설치될 것 입니다.(역주: TF.learn은 scikit learn 과 같은 fit/predict 인터페이스를 이용하여 텐서플로우를 사용할 수 있도록 도와줍니다)

pip install numpy scipy sklearn pandas
# For Ubuntu:
pip install https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.9.0-cp34-cp34m-linux_x86_64.whl
# for Mac
pip install https://storage.googleapis.com/tensorflow/mac/tensorflow-0.9.0-py3-none-any.whl

(TF.Learn는 텐서플로우안에 포함되어 있어서 이제 따로 설치할 필요가 없습니다. GPU 버전이나 파이썬 2.7.x 용 버전을 설치하시려면 0.9 릴리즈 포스팅을 참고하세요.)

데이터와 코드 샘플은 http://github.com/ilblackdragon/tf_examples 에서 받을 수 있습니다.

git clone https://github.com/ilblackdragon/tf_examples.git

간단히 데이터를 둘러 봅니다.(iPython 이나 iPython 노트북을 이용하면 대화식으로 쉽게 사용할 수 있습니다.) (역주: 원문에는 train이 아니고 data 변수에 데이터를 로드 하였습니다만 이는 오타로 번역본에서는 올바르게 수정하였습니다.)

>>> import pandas
>>> train = pandas.read_csv('data/titanic_train.csv')
>>> train.shape
(891, 12)
>>> train.columns
Index([u'PassengerId', u'Survived', u'Pclass', u'Name', u'Sex', u'Age', 
u'SibSp', u'Parch', u'Ticket', u'Fare', u'Cabin', u'Embarked'], 
dtype='object')
>>> train[:1]
 PassengerId Survived Pclass                    Name  Sex Age SibSp \
0          1        0      3 Braund, Mr. Owen Harris male  22     1

 Parch    Ticket Fare Cabin Embarked
0    0 A/5 21171 7.25   NaN        S

이제 실수형(float) 변수(역주: ‘Age’, ‘SibSp’, ‘Fare’를 의미)를 사용해서 사이킷런(Scikit Learn)으로 생존자(Survived)를 예측해 봅시다(역주: 깃허브 소스 첫부분에서, LogisticRegression, accuracy_score 를 import 하고 있습니다.):

>>> y, X = train['Survived'], train[['Age', 'SibSp', 'Fare']].fillna(0)
>>> X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
>>> lr = LogisticRegression()
>>> lr.fit(X_train, y_train)
>>> print accuracy_score(lr.predict(X_test), y_test)
0.664804469274

데이터를 피처(feature, X)와 타겟(target, y)으로 나눈 뒤 N/A 를 0 으로 채우고 로지스틱 회귀분석(Logistic Regression)을 수행합니다. 학습한 모델의 정확도를 측정합니다.(물론 여기서는 적절하게 모델을 평가하거나 제대로 테스트 데이터셋을 사용한 것은 아닙니다. 지금은 단순함을 위해서 학습에만 신경쓰도록 하겠습니다.)

이제 tf.learn(aka. Scikit Flow)를 사용합니다.

>>> from tensorflow.contrib import learn
>>> import random
>>> random.seed(42)
>>> classifier = learn.LinearClassifier(n_classes=2, feature_columns=learn.infer_real_valued_columns_from_input(X_train), optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.05))
>>> classifier.fit(X_train, y_train, batch_size=128, steps=500)
>>> print accuracy_score(classifier.predict(X_test), y_test)
0.68156424581

(역주: 버전마다 스코어 값이 조금씩 다를 수 있습니다.)

축하합니다. 첫번째 텐서플로우 모델을 만들었습니다!

TF.Learn(aka. Scikit Flow)

TF.Learn은 깔끔하고 익숙한 사이킷런(Scikit Learn) API 스타일로 텐서플로우(TensorFlow)의 많은 API들을 감싸고 있는 라이브러리입니다.

텐서플로우(TensorFlow)는 전적으로 그래프(graph)를 만들고 실행시키는 라이브러리입니다. 이런 개념은 매우 좋긴하지만 처음 시작하기에는 번거롭고 어려운 점이 있습니다.

TF.Learn의 내부를 살펴 보겠습니다. 여기서 우리는 세가지 부분만 사용했습니다:

  • layers – 복잡한 그래프를 쉽게 만들어 주는 텐서플로우 함수들의 모음. 완전연결 레이어, 콘볼루션, 배치 노말라이제이션에서 부터 손실(loss) 함수와 최적화까지 포함.
  • graph_actions – 텐서플로우 그래프를 학습시키고, 평가하고 추론(inference)하는 데에 필요한 함수들의 모음.
  • Estimator – 사이킷런(Scikit Learn) 인터페이스를 계승하여 손쉽게 텐서플로우 모델을 만들고 학습시킬 수 있도록 도와주는 클래스들의 패키지. Estimator의 서브 클래스로는 LinearClassifier, LinearRegressor, DNNClassifier 등이 있으며 사이킷런의 LogisticRegression 처럼 코드 한 줄로 쓸 수 있는 모델입니다.

텐서플로우(TensorFlow)에 친숙해지더라도 TF.Learn의 일부분은 여전히 유용할 것 입니다(graph_actions 과 layers 그리고 각종 연산과 여러가지 툴들). 다음번 포스트에서는 카테고리 변수와 텍스트, 이미지를 다루겠습니다.

텐서플로우 튜토리얼 – 1”에 대한 11개의 생각

  1. 핑백: 머신 러닝 타임즈 2015 | 텐서플로우 코리아

  2. 핑백: The Expanding Universe of Modern AI | 텐서플로우 코리아 (TensorFlow Korea)

  3. 핑백: TensorFlow 0.8 – Distributed! | 텐서플로우 코리아 (TensorFlow Korea)

  4. 핑백: skflow: scikit-learn 스타일의 TensorFlow 인터페이스 | 텐서플로우 코리아 (TensorFlow Korea)

  5. 초보자

    panda intstall 하는 부분에서

    Command /usr/bin/python -c “import setuptools, tokenize;__file__=’/tmp/pip_build_hadoop/scipy/setup.py’;exec(compile(getattr(tokenize, ‘open’, open)(__file__).read().replace(‘\r\n’, ‘\n’), __file__, ‘exec’))” install –record /tmp/pip-fxZeH9-record/install-record.txt –single-version-externally-managed –compile failed with error code 1 in /tmp/pip_build_hadoop/scipy
    Storing debug log for failure in /home/hadoop/.pip/pip.log

    이런 에러가 나는데 왜 그런걸 까요? ㅜ

    Liked by 1명

    응답
    1. 로드홈 글의 글쓴이

      안녕하세요. 위 내용만으로는 정확히 어떤 문제인지 잘 모르겠지만 pandas, numpy, scipy, scikit-learn 등을 설치해서 사용하는 것이 주 목적 이시라면 아나콘다 인스롤 패키지를 추천해 드립니다.
      https://www.continuum.io/downloads
      파이썬의 과학 기술 패키지들은 베이스코드가 c 로 많이 되어 있어 직접 설치하려면 시스템의 c 컴파일러와의 궁합에 종종 문제가 많이 생깁니다.
      아나콘다는 필요한 거의 대부분의 패키지를 플랫폼에 맞게 미리 컴파일해 놓은 거라 데이터 분석을 위해서나 보통의 작업에서도 아나콘다를 점점 더 많이 쓰는 추세인 것 같습니다. ^^

      Liked by 2 people

      응답
  6. 핑백: Gradientzoo – 머신러닝 모델 공유 | 텐서플로우 코리아 (TensorFlow Korea)

  7. 핑백: The Good, Bad & Ugly of TensorFlow | 텐서플로우 코리아 (TensorFlow Korea)

  8. SangJune Ahn

    >>>import random
    >>>import pandas
    >>>import numpy as np
    >>>import tensorflow as tf
    >>>from sklearn import metrics, cross_validation, linear_model

    >>>train = pandas.read_csv(‘data/titanic_train.csv’)
    >>>y, X = train[‘Survived’], train[[‘Age’, ‘SibSp’, ‘Fare’]].fillna(0)
    >>>X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=0.2, random_state=42)
    >>>lr = linear_model.LogisticRegression()
    >>>lr.fit(X_train, y_train)
    >>>print metrics.accuracy_score(lr.predict(X_test), y_test)

    Liked by 1명

    응답
  9. 김준민

    위에 SangJune Ahn님께서 써주신 부분을 설명하자면,

    예제에선 train_test_split 을 import 안 하고 호출하고 있습니다.
    NameError: name ‘train_test_split’ is not defined 에러가 발생하게 됩니다.

    >>> from sklearn.cross_validation import train_test_split

    을 하시고 진행하시면 정상적으로 됩니다.

    Liked by 1명

    응답

댓글 남기기

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.