사용자:CrMT/연습장/1 편집하기

이 문서는 리브레 위키의 사용자 문서이며, 일반적인 항목이 아닙니다.

리브레 위키의 정책에 따라, 이 문서에는 블로그, 이메일 주소, SNS 계정 등의 개인정보 및 친목 관련 요소가 있는 외부 사이트의 언급과 링크 노출이 금지됩니다. 또한, 이 문서에서는 다른 사용자를 언급해서는 안 됩니다.


편집하면 당신의 IP 주소가 공개적으로 기록됩니다. 계정을 만들고 로그인하면 편집 시 사용자 이름만 보이며, 위키 이용에 여러 가지 편의가 주어집니다.

편집을 취소할 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 게시해주세요.

최신판 당신의 편집
36번째 줄: 36번째 줄:
==== 유닉스 계열 ====
==== 유닉스 계열 ====
# '''Install Python. '''Python 2.7이나 3.5(혹은 3.4)를 설치합니다. 추후에 바뀔 수 있으나, 아직 3.6은 추천하지 않습니다. (Ubuntu/Linux 64-bit에서 TF 1.0.0RC0를 설치할 경우에만 3.6이 지원됩니다.) [https://www.python.org/ Python 공식 홈페이지]에 가서 인스톨러 소스를 받거나 command에서 apt-get 등의 명령어로 설치합니다. 우분투(14.04 이상)의 경우 Python은 자동으로 설치되어 있습니다.
# '''Install Python. '''Python 2.7이나 3.5(혹은 3.4)를 설치합니다. 추후에 바뀔 수 있으나, 아직 3.6은 추천하지 않습니다. (Ubuntu/Linux 64-bit에서 TF 1.0.0RC0를 설치할 경우에만 3.6이 지원됩니다.) [https://www.python.org/ Python 공식 홈페이지]에 가서 인스톨러 소스를 받거나 command에서 apt-get 등의 명령어로 설치합니다. 우분투(14.04 이상)의 경우 Python은 자동으로 설치되어 있습니다.
# '''Install Anaconda. '''[https://www.continuum.io/downloads Anaconda 공식 홈페이지]에서 '''Python 버전에 맞는''' Anaconda를 설치합니다. 설치 과정은 '''Download for ***''' 탭에 나와 있습니다. 구 버전(Python 3.3~3.5는 Anaconda 4.2.0)은 [https://repo.continuum.io/archive/index.html 여기]에서 받아주세요. 우분투의 경우 '''다운로드 폴더로 이동한 후에'''(cd ~/Downloads 또는 cd ~/다운로드)<syntaxhighlight lang="bash">bash Anaconda2-4.3.0-Linux-x86_64.sh # if Python 2.x
# '''Install Anaconda. '''[https://www.continuum.io/downloads Anaconda 공식 홈페이지]에서 '''Python 버전에 맞는''' Anaconda를 설치합니다. 설치 과정은 '''Download for ***''' 탭에 나와 있습니다. 우분투의 경우 '''다운로드 폴더로 이동한 후에'''(cd ~/Downloads 또는 cd ~/다운로드)<syntaxhighlight lang="bash">bash Anaconda2-4.2.0-Linux-x86_64.sh # if Python 2.x
bash Anaconda3-4.2.0-Linux-x86_64.sh # if Python 3.x and not 3.6
bash Anaconda3-4.2.0-Linux-x86_64.sh # if Python 3.x</syntaxhighlight> 중 자신의 Python 버전에 맞는 줄을 복사하여 터미널에 넣으세요.
bash Anaconda3-4.3.0-Linux-x86_64.sh # if Python 3.6</syntaxhighlight> 중 자신의 Python 버전에 맞는 줄을 복사하여 터미널에 넣으세요.
# '''Create conda environment. ''''tensorflow'라는 conda 환경을 만듭니다. 다음 셋 중 자신의 Python 버전에 맞는 것을 넣어주세요.<syntaxhighlight lang="bash">conda create -n tensorflow python=2.7 # Python 2.7
# '''Create conda environment. ''''tensorflow'라는 conda 환경을 만듭니다. 다음 셋 중 자신의 Python 버전에 맞는 것을 넣어주세요.<syntaxhighlight lang="bash">conda create -n tensorflow python=2.7 # Python 2.7
conda create -n tensorflow python=3.4 # Python 3.4
conda create -n tensorflow python=3.4 # Python 3.4
conda create -n tensorflow python=3.5 # Python 3.5
conda create -n tensorflow python=3.5 # Python 3.5</syntaxhighlight> 그리고 <syntaxhighlight lang="bash">source activate tensorflow</syntaxhighlight>로 conda environment를 활성화합니다. 그러면 '$'가 있는 줄 앞에 '(tensorflow)'가 생겼을 것입니다.
conda create -n tensorflow python=3.6 # Python 3.6</syntaxhighlight> 그리고 <syntaxhighlight lang="bash">source activate tensorflow</syntaxhighlight>로 conda environment를 활성화합니다. 그러면 '$'가 있는 줄 앞에 '(tensorflow)'가 생겼을 것입니다.
# '''Ubuntu/Linux 64-bit GPU의 경우''' [https://developer.nvidia.com/cuda-downloads CUDA toolkit 8.0]와 [https://developer.nvidia.com/cudnn CuDNN v5.1]가 필요합니다. CUDA toolkit 8.0은 /usr/local/cuda와 같은 곳에 설치하고, cuDNN을 '''toolkit 설치 위치'''에 갖다 놓은 후 <syntaxhighlight lang="bash">tar xvzf cudnn-8.0-linux-x64-v5.1-ga.tgz
# '''Ubuntu/Linux 64-bit GPU의 경우''' [https://developer.nvidia.com/cuda-downloads CUDA toolkit 8.0]와 [https://developer.nvidia.com/cudnn CuDNN v5.1]가 필요합니다. CUDA toolkit 8.0은 /usr/local/cuda와 같은 곳에 설치하고, cuDNN을 '''toolkit 설치 위치'''에 갖다 놓은 후 <syntaxhighlight lang="bash">tar xvzf cudnn-8.0-linux-x64-v5.1-ga.tgz
sudo cp -P cuda/include/cudnn.h /usr/local/cuda/include
sudo cp -P cuda/include/cudnn.h /usr/local/cuda/include
105번째 줄: 103번째 줄:


# Windows 운영체제가 '''64-bit'''인지 확인해 주세요. 컴퓨터 (우클릭) - 속성으로 시스템을 들어가면 볼 수 있습니다.
# Windows 운영체제가 '''64-bit'''인지 확인해 주세요. 컴퓨터 (우클릭) - 속성으로 시스템을 들어가면 볼 수 있습니다.
# Python '''3.5'''를 설치합니다. http://python.org
# Python '''3.5'''를 설치합니다. (추후에 3.6이 될 수도 있음. 현재는 리눅스상의 v1.0.0에서 Python 3.6을 지원하는 상태.) http://python.org
# Anaconda3 4.2.0(또는 최신 버전)을 설치합니다. https://www.continuum.io/downloads#windows 에서 for Python 3.5, 64-bit installer를 받으시면 됩니다.
# Anaconda3 4.2.0(또는 최신 버전)을 설치합니다. https://www.continuum.io/downloads#windows 에서 for Python 3.5, 64-bit installer를 받으시면 됩니다.
# 컴퓨터 (우클릭) - 속성 - 고급 시스템 설정 - (하단) 환경 변수를 눌러 시스템 변수 - Path에 MSVCP140.DLL가 있는지 확인해 주세요. 아니라면 https://www.microsoft.com/en-us/download/details.aspx?id=53587 (혹은 [https://www.microsoft.com/ko-kr/download/details.aspx?id=48145 여기])에서 vc_redist.x64.exe를 설치하시면 됩니다. 그렇지 않으면 텐서플로우가 그 dll을 사용하지 못해 <code>No module named "_pywrap_tensorflow"</code>라는 에러가 발생한다고 합니다.
# 컴퓨터 (우클릭) - 속성 - 고급 시스템 설정 - (하단) 환경 변수를 눌러 시스템 변수 - Path에 MSVCP140.DLL가 있는지 확인해 주세요. 아니라면 https://www.microsoft.com/en-us/download/details.aspx?id=53587 (혹은 [https://www.microsoft.com/ko-kr/download/details.aspx?id=48145 여기])에서 vc_redist.x64.exe를 설치하시면 됩니다. 그렇지 않으면 텐서플로우가 그 dll을 사용하지 못해 <code>No module named "_pywrap_tensorflow"</code>라는 에러가 발생한다고 합니다.
# ('''GPU의 경우''') [https://developer.nvidia.com/cuda-downloads CUDA toolkit 8.0]과 [https://developer.nvidia.com/cudnn cuDNN 5.1]를 설치하셔야 합니다.
# ('''GPU의 경우''') [https://developer.nvidia.com/cuda-downloads CUDA toolkit 8.0]과 [https://developer.nvidia.com/cudnn cuDNN 5.1]를 설치하셔야 합니다.
# 이제 '''Anaconda prompt'''를 열어, 아래의 원하는 버전을 택하여 붙여 넣으시면 됩니다.<syntaxhighlight lang="bash">TF 0.12.1 CPU:
# 이제 명령 프롬프트를 열어, 아래의 원하는 버전을 택하여 붙여 넣으시면 됩니다.<syntaxhighlight lang="bash">pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-0.12.1-cp35-cp35m-win_amd64.whl # TF 0.12.1 CPU
pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-0.12.1-cp35-cp35m-win_amd64.whl
pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/gpu/tensorflow_gpu-0.12.1-cp35-cp35m-win_amd64.whl # TF 0.12.1 GPU
TF 0.12.1 GPU:
pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-1.0.0rc0-cp35-cp35m-win_amd64.whl
pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/gpu/tensorflow_gpu-0.12.1-cp35-cp35m-win_amd64.whl
# TF 1.0.0RC0 CPU
TF 1.0.0RC1 CPU:
pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/gpu/tensorflow_gpu-1.0.0rc0-cp35-cp35m-win_amd64.whl
pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-1.0.0rc1-cp35-cp35m-win_amd64.whl
# TF 1.0.0RC0 GPU</syntaxhighlight>
TF 1.0.0RC1 GPU:
pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/gpu/tensorflow_gpu-1.0.0rc1-cp35-cp35m-win_amd64.whl</syntaxhighlight>


====테스트====
====테스트====
<code>python</code> 명령어를 쳐서 Python을 열거나(UN*X) Anaconda Prompt(Windows), 또는 '''Spyder'''를 엽니다. 나오는 창에 Python 옆에 'Anaconda'가 써 있는 것을 확인해 주세요. '>>>' 표시가 나오면, 한 줄씩 다음 코드를 칩니다.<syntaxhighlight lang="python">import tensorflow as tf
<code>python</code> 명령어를 쳐서 Python을 엽니다. 나오는 창에 Python 옆에 'Anaconda'가 써 있는 것을 확인해 주세요. '>>>' 표시가 나오면, 한 줄씩 다음 코드를 칩니다.<syntaxhighlight lang="python">import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
sess = tf.Session()
print(sess.run(hello))</syntaxhighlight> 이때 '''Hello, TensorFlow!'''라는 메시지가 나오면 정상적으로 설치된 겁니다! 축하합니다!
print(sess.run(hello))</syntaxhighlight> 이때 '''Hello, TensorFlow!'''라는 메시지가 나오면 정상적으로 설치된 겁니다! 축하합니다!


Anaconda는 IDE에서 사용이 불가하며, 대신 Spyder(Anaconda 설치 시에 같이 설치되는 IDE)사용해 주세요.
IDLE에서 Anaconda를 사용하려면 [http://stackoverflow.com/questions/26047185/import-anaconda-packages-to-idle 여기]참고해 주세요.


==== 에러 ====
==== 에러 ====
현재 윈도상의 TF 1.0.0 RC1(RC0)에서 다음과 같은 에러가 나타날 수 있습니다.<syntaxhighlight>E c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\framework\op_kernel.cc:943] OpKernel ('op: "BestSplits" device_type: "CPU"') for unknown op: BestSplits
현재 윈도상의 TF 1.0.0 RC0에서 다음과 같은 에러가 나타날 수 있습니다.<syntaxhighlight>E c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\framework\op_kernel.cc:943] OpKernel ('op: "BestSplits" device_type: "CPU"') for unknown op: BestSplits
E c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\framework\op_kernel.cc:943] OpKernel ('op: "CountExtremelyRandomStats" device_type: "CPU"') for unknown op: CountExtrem
E c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\framework\op_kernel.cc:943] OpKernel ('op: "CountExtremelyRandomStats" device_type: "CPU"') for unknown op: CountExtrem
elyRandomStats
elyRandomStats
138번째 줄: 134번째 줄:
E c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\framework\op_kernel.cc:943] OpKernel ('op: "TreePredictions" device_type: "CPU"') for unknown op: TreePredictions
E c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\framework\op_kernel.cc:943] OpKernel ('op: "TreePredictions" device_type: "CPU"') for unknown op: TreePredictions
E c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\framework\op_kernel.cc:943] OpKernel ('op: "UpdateFertileSlots" device_type: "CPU"') for unknown op: UpdateFertileSlots
E c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\framework\op_kernel.cc:943] OpKernel ('op: "UpdateFertileSlots" device_type: "CPU"') for unknown op: UpdateFertileSlots
E c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\framework\op_kernel.cc:943] OpKernel ('op: "ReinterpretStringToFloat" device_type: "CPU"') for unknown op: ReinterpretStringToFloat</syntaxhighlight>
E c:\tf_jenkins\home\workspace\release-win\device\cpu\os\windows\tensorflow\core\framework\op_kernel.cc:943] OpKernel ('op: "ReinterpretStringToFloat" device_type: "CPU"') for unknown op: ReinterpretS
그냥 무시하시면 됩니다. [https://github.com/tensorflow/tensorflow/issues/6791 여기]를 참고해 주세요.
tringToFloat</syntaxhighlight> [https://github.com/tensorflow/tensorflow/issues/6791 여기]를 참고해 주세요.


=== 참고 자료 ===
=== 참고 자료 ===
153번째 줄: 149번째 줄:
머신 러닝은 꾸준한 학습(경험)을 통해 점점 성능을 나아지게 하는 프로그램입니다. 머신 러닝은 크게 세 가지로 나눌 수 있는데, 다음과 같습니다.
머신 러닝은 꾸준한 학습(경험)을 통해 점점 성능을 나아지게 하는 프로그램입니다. 머신 러닝은 크게 세 가지로 나눌 수 있는데, 다음과 같습니다.
===Supervised Learning===
===Supervised Learning===
사람이 어떤 함수의 데이터와 결괏값을 몇 개 입력하면, 컴퓨터가 그것을 보고 사람이 의도한 함수에 매우 가까운 '''가설 함수'''(hypothesis)를 알아맞히는 방법입니다. 이때 식을 줄 수도 있고([[회귀]] 등), 아니면 다른 데이터를 넣었을 때의 결괏값을 줄 수도 있습니다([[분류]] 등). 예를 들어, ([[선형 회귀]])
사람이 어떤 함수의 데이터와 결과값을 몇 개 입력하면, 컴퓨터가 그것을 보고 사람이 의도한 함수에 매우 가까운 '''가설 함수'''(hypothesis)를 알아맞히는 방법입니다. 이때 식을 줄 수도 있고([[회귀]] 등), 아니면 다른 데이터를 넣었을 때의 결과값을 줄 수도 있습니다([[분류]] 등). 예를 들어, ([[선형 회귀]])
: (x, y) = (3, 7), (6, 8), (9, 9)
: (x, y) = (3, 7), (6, 8), (9, 9)
라는 세 개의 데이터(x)와 결괏값(y)을 주었고, 가설 함수가
라는 세 개의 데이터(x)와 결과값(y)을 주었고, 가설 함수가
: <math>H(x) = wx + b, \qquad</math>'''H'''ypothesis, '''w'''eight, '''b'''ias
: <math>H(x) = wx + b, \qquad</math>'''H'''ypothesis, '''w'''eight, '''b'''ias
의 모양, 즉 [[일차식]]으로 주어졌다고 합시다. 그러면 컴퓨터는 w와 b를 바꾸어 가면서, 가설 함수와 데이터 사이의 차이를 최소화합니다. 최소화 과정을 거치면 컴퓨터는 다음의 결과를 낼 것입니다(약간의 오차는 있을 수 있습니다.):
의 모양, 즉 [[일차식]]으로 주어졌다고 합시다. 그러면 컴퓨터는 w와 b를 바꾸어 가면서, 가설 함수와 데이터 사이의 차이를 최소화합니다. 최소화 과정을 거치면 컴퓨터는 다음의 결과를 낼 것입니다(약간의 오차는 있을 수 있습니다.):
163번째 줄: 159번째 줄:
단지 데이터(x)만을 줍니다. 이때 컴퓨터는 주어진 데이터를 비슷한 것끼리 모으는 '''군집화'''를 할 수도 있고, 더 나아가 그 데이터의 분포를 맞히는 '''분포 추정'''을 할 수도 있습니다.
단지 데이터(x)만을 줍니다. 이때 컴퓨터는 주어진 데이터를 비슷한 것끼리 모으는 '''군집화'''를 할 수도 있고, 더 나아가 그 데이터의 분포를 맞히는 '''분포 추정'''을 할 수도 있습니다.
=== Reinforcement Learning===
=== Reinforcement Learning===
위 둘과 다르게, '''강화 학습'''은 현 상태를 보고 어떤 행동을 해야 좋을지를 판단합니다. 현 상태('''state''')에서 컴퓨터가 어떤 행동('''Action''')을 취하면 그에 따른 점수('''Result''', 보상)가 매겨집니다. 컴퓨터는 이 보상을 최대화하려고 다음에 어떤 행동을 해야 할 것인지 판단하는 정책('''Policy''')를 세웁니다. 예를 들어, [[자율 운전]]은 강화 학습의 예입니다. 사람이 운전하듯이, 자율주행 차량에 주어지는 데이터(state)는 카메라 영상이며, 이것으로 얼마나 앞에 무엇이 있는지를 판단합니다. 간단한 설명을 위해 왼쪽(-30도), 앞쪽(0도), 오른쪽(30도)으로의 세 거리를 측정할 수 있다고 합시다. 그리고 그 결괏값이[[파일:MLRun.png.png|섬네일]]
위 둘과 다르게, '''강화 학습'''은 현 상태를 보고 어떤 행동을 해야 좋을지를 판단합니다. 현 상태('''state''')에서 컴퓨터가 어떤 행동('''Action''')을 취하면 그에 따른 점수('''Result''', 보상)가 매겨집니다. 컴퓨터는 이 보상을 최대화하려고 다음에 어떤 행동을 해야 할 것인지 판단하는 정책('''Policy''')를 세웁니다. 예를 들어, [[자율 운전]]은 강화 학습의 예입니다. 사람이 운전하듯이, 자율주행 차량에 주어지는 데이터(state)는 카메라 영상이며, 이것으로 얼마나 앞에 무엇이 있는지를 판단합니다. 간단한 설명을 위해 왼쪽(-30도), 앞쪽(0도), 오른쪽(30도)으로의 세 거리를 측정할 수 있다고 합시다. 그리고 그 결과값이[[파일:MLRun.png.png|섬네일]]
: (L, F, R) = (200, 100, 50)
: (L, F, R) = (200, 100, 50)
이었다고 해 봅시다. 예를 들어 다음 그림과 같은 상황이 됩니다.  
이었다고 해 봅시다. 예를 들어 다음 그림과 같은 상황이 됩니다.  
175번째 줄: 171번째 줄:


== 어쨌든 시작해 보자!: 선형 회귀 ==
== 어쨌든 시작해 보자!: 선형 회귀 ==
=== 일변수 선형 회귀 ===
=== 일차원 선형 회귀 ===
가장 간단한 머신 러닝 예제는 선형 회귀입니다. 먼저, 간단하게 실숫값을 가지는 (x, y)가 주어진다고 합시다.
가장 간단한 머신 러닝 예제는 선형 회귀입니다. 먼저, 간단하게 실숫값을 가지는 (x, y)가 주어진다고 합시다.
: <math>(x_{i},~y_i) \in \mathbb R^2</math>
: <math>(x_{i},~y_i) \in \mathbb R^2</math>
261번째 줄: 257번째 줄:
:<math>\mathrm{cost}(\mathbf x_i) = \sum_{j=1}^n (H(x_{ij}) - y_i)^2</math>
:<math>\mathrm{cost}(\mathbf x_i) = \sum_{j=1}^n (H(x_{ij}) - y_i)^2</math>
또한 전체 cost는 모든 데이터에 대한 평균으로 정의합니다.
또한 전체 cost는 모든 데이터에 대한 평균으로 정의합니다.
:<math>\mathrm{cost} = \frac{1}{m} \sum_{i=1}^m \mathrm{cost}(\mathbf x_i) = \frac 1 m \sum_{i=1}^m \sum_{j=1}^n (H(x_{ij}) - y_i)^2</math>
:<math>\mathrm{cost} = \frac{1}{m} \sum_{i=1}^m \mathrm{cost}_i = \frac 1 m \sum_{i=1}^m \sum_{j=1}^n (H(x_{ij}) - y_i)^2</math>
 
<syntaxhighlight lang="python">
# -*- coding: utf-8 -*-
import tensorflow as tf # 텐서플로우를 불러옵니다.
 
# 데이터를 입력해 줍니다.
x_data = [[1, 1, 1, 1, 1], # 첫째 행은 'b를 없애기 위해' 1로 채우는 행입니다.
          [1, 0, 3, 0, 5],
          [0, 2, 0, 4, 0]] # 이때 len(x_data) = 3입니다.
y_data = [1, 2, 3, 4, 5]
 
W = tf.Variable(tf.random_uniform([1, len(x_data)], -3.0, 3.0)) # [m, n]는 m행 n열의 행렬(2차원 텐서)이라는 뜻입니다.
 
# W가 1행 len(x_data)열인 이유는 내적 여러 개를 행렬곱으로 계산하기 위함입니다.
#                        [[_, _, _, _, _],
# W * x_data = [[_, _, _]] [_, _, _, _, _], = [_, _, _, _, _]
#                          [_, _, _, _, _]]
 
X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)
 
hypothesis = tf.matmul(W, X)
cost = tf.reduce_mean(tf.square(hypothesis  - y_data)) # reduce_mean은 벡터(텐서)의 성분을 평균(mean)을 낸 후 괄호를 없애(reduce) 반환합니다.
 
# 최소화 알고리듬
learning_rate = tf.Variable(0.1)
optimizer = tf.train.GradientDescentOptimizer(learning_rate)
train = optimizer.minimize(cost)
 
# 세션에서 실행
with tf.Session() as sess:
sess.run(tf.global_variables_initializer()) # 변수 초기화
 
for step in range(1001):
sess.run(train, feed_dict={X:x_data, Y:y_data})
if step % 100 == 0:
print (step, sess.run(cost, feed_dict={X:x_data, Y:y_data}), sess.run(W)) # 그 스텝에서의 weight와 cost를 출력합니다.
 
print (sess.run(hypothesis, feed_dict={X:[[1],[1],[5]]})) # X를 열벡터 형태로 입력합니다. 맨 앞은 1이고, 이 입력은 H(1, 5)를 출력하게 합니다.
</syntaxhighlight>
 
<syntaxhighlight lang="bash">
0 0.663228 [[-1.02151275  1.38295853  0.99940979]]
100 0.000335062 [[-0.04339394  1.01140702  1.01353443]]
200 6.81898e-07 [[-0.00195755  1.00051451  1.00061047]]
300 1.39222e-09 [[ -8.83055473e-05  1.00002325e+00  1.00002754e+00]]
400 2.90186e-12 [[ -3.95542747e-06  1.00000107e+00  1.00000131e+00]]
500 2.06057e-14 [[ -2.98086547e-07  1.00000012e+00  1.00000012e+00]]
600 2.06057e-14 [[ -2.98086547e-07  1.00000012e+00  1.00000012e+00]]
700 2.06057e-14 [[ -2.98086547e-07  1.00000012e+00  1.00000012e+00]]
800 2.06057e-14 [[ -2.98086547e-07  1.00000012e+00  1.00000012e+00]]
900 2.06057e-14 [[ -2.98086547e-07  1.00000012e+00  1.00000012e+00]]
1000 2.06057e-14 [[ -2.98086547e-07  1.00000012e+00  1.00000012e+00]]
[[ 6.00000048]]
</syntaxhighlight>
 
== 간단한 분류 모델 ==
주어진 데이터가 어떤 분류에 속하는지를 컴퓨터에게 가르쳐 보려 합니다. 즉, 'C1, C2, ...,위 Ck'라는 분류가 있을 때, 주어진 (n차원) 데이터 x가 어떤 분류에 속하는지를 알아보고 싶습니다. 하지만, 위(선형 회귀)에서 얻은 결괏값 y는 실숫값입니다. 우리는 이 실숫값을 '''분류에 속하는지 아닌지'''의 YES/NO로 바꾸어야 합니다. 즉, 결괏값은 0과 1로만 이루어진 k차원 벡터가 됩니다. 만약 이 분류들이 겹치지 않는다고 가정하면(mutually disjoint), 그 벡터는 단 한 성분에서만 1이고 나머지는 0인 '''one hot''' 방식의 벡터가 됩니다.
 
가장 합리적인 변환은, '''제일 큰 값만 살려두기'''입니다. 즉 결과 벡터 y를 각 분류에 들어가는 정도(들어갈 확률)로 한 후에, 가장 그 확률이 높은 분류를 정답으로 택합니다. 이때 사용하는 함수는 '''softmax'''입니다.
:<math>\mathrm{softmax} ~ S(y_i) = \frac{e^{y_i}}{\sum_j e^{y_j}}</math>
:<math>\mathbf y = \begin{bmatrix}\mathrm P(\mathbf x \in C_1) \\ \mathrm P(\mathbf x \in C_2) \\ \vdots \\ \mathrm P(\mathbf x \in C_k)\end{bmatrix} \xrightarrow{\mathrm{softmax}}\xrightarrow{\mathrm{argmax}}  \begin{bmatrix}\mathrm 0 \\ \vdots \\ 1 \\ \vdots \\ 0\end{bmatrix} </math>
 
Loss function은 어떻게 해야 할까요? 이전의 least square 방식을 쓰면 (softmax에 지수함수가 있어서) 볼록하지 않아지고, 즉 여러 optimizer를 쓰기 곤란해집니다. 이럴 때 쓰는 것이 로그가 포함된 '''cross entropy'''라고 하는 함수입니다.
:<math>\displaystyle H(p,q)=\operatorname {E} _{p}[-\log q] = -\sum _{x}p(x)\,\log q(x).</math>
텐서플로우에서는 <code>tf.nn.softmax_cross_entropy_with_logits(logits=hypothesis, labels=Y)</code>라는 메서드가 준비되어 있습니다. 이것은 어떤 데이터가 각 분류에 들어갈 확률을 의미합니다. 이것이 의도된 출력값 y와 차이가 적을수록 잘 학습이 된 것이니, 이것을 loss function으로 쓰면 됩니다. 즉,<syntaxhighlight lang="python">cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=hypothesis, labels=Y))
optimizer = tf.train.{{some optimizer}}({{learning rate}}).minimize(cost)</syntaxhighlight>으로 구현합니다.
=== MNIST ===
가장 많이 쓰이는 분류 예제는 '''MNIST'''입니다. 손으로 쓴 숫자를 인식하는 모델로, '''28x28 = 784''' 픽셀의 숫자 이미지를 인식합니다.
 
[[파일:MNIST.png]]
 
MNIST 데이터는 <syntaxhighlight lang="python">from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("./mnist/data/", one_hot=True)</syntaxhighlight>로 받아옵니다. 가설 함수는 그냥 선형(Y = XW)으로 두고 학습시켜 봅시다.
 
데이터를 학습할 때에, '''batch'''라는 묶음 단위로 한꺼번에 학습을 합니다. mnist.train.num_examples는 데이터의 총 개수이고, 한 batch 당의 데이터 개수로 나눠주면 이 batch가 몇 개 있는지 알아낼 수 있습니다. 물론 그 반대도 가능합니다.
 
<syntaxhighlight lang="python">import tensorflow as tf
 
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("./mnist/data/", one_hot=True)
 
X = tf.placeholder(tf.float32, [None, 784]) # 784 pixel의 이미지를 가져와서
Y = tf.placeholder(tf.float32, [None, 10]) # 0~9의 10 개 성분을 가진 one hot 벡터로 출력합니다.
 
W = tf.Variable(tf.random_normal([784, 10], stddev=0.01))
 
hypothesis = tf.matmul(X, W)
 
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=hypothesis, labels=Y))
optimizer = tf.train.AdamOptimizer(0.001).minimize(cost) # Adam optimizer를 사용해 보겠습니다.
 
##### 학습 #####
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
 
    batch_size = 100
    total_batch = int(mnist.train.num_examples/batch_size)
 
    for epoch in range(15):
        total_cost = 0
 
        for i in range(total_batch):
            # 텐서플로우 mnist 모델의 next_batch 함수로 batch를 가져옵니다.
            batch_xs, batch_ys = mnist.train.next_batch(batch_size)
            sess.run(optimizer, feed_dict={X: batch_xs, Y: batch_ys})
            total_cost += sess.run(cost, feed_dict={X: batch_xs, Y: batch_ys})
 
        print('Epoch:', '%04d' % (epoch + 1),\
              'Avg. cost =', '{:.3f}'.format(total_cost / total_batch))
 
    print('Optimization completed.')
 
    ##### 정확도 확인 #####
    # 가장 확률이 높은 것과 실제 데이터를 비교합니다. 이때 == 대신 tf.equal을 쓰는 것이 추천됩니다.
    check_prediction = tf.equal(tf.argmax(hypothesis, 1), tf.argmax(Y, 1))
    accuracy = tf.reduce_mean(tf.cast(check_prediction, tf.float32))
 
    print('Accuracy:', sess.run(accuracy, feed_dict={X: mnist.test.images, Y: mnist.test.labels}))</syntaxhighlight>
 
{|class="wikitable" style="width:100%!important"
|+ batch 크기에 따른 정확도(차이가 있을 수 있음)
|-
! batch_size
| 1 || 10 || 100 || 1000
|-
! accuracy
| 0.9213 || 0.9266 || 0.9261 || 0.8558
|}
 
== ConvNet ==
리브레 위키에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-동일조건변경허락 3.0 라이선스로 배포됩니다(자세한 내용에 대해서는 리브레 위키:저작권 문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.
글이 직접 작성되었거나 호환되는 라이선스인지 확인해주세요. 리그베다 위키, 나무위키, 오리위키, 구스위키, 디시위키 및 CCL 미적용 사이트 등에서 글을 가져오실 때는 본인이 문서의 유일한 기여자여야 하고, 만약 본인이 문서의 유일한 기여자라는 증거가 없다면 그 문서는 불시에 삭제될 수 있습니다.
취소 편집 도움말 (새 창에서 열림)

| () [] [[]] {{}} {{{}}} · <!-- --> · [[분류:]] · [[파일:]] · [[미디어:]] · #넘겨주기 [[]] · {{ㅊ|}} · <onlyinclude></onlyinclude> · <includeonly></includeonly> · <noinclude></noinclude> · <br /> · <ref></ref> · {{각주}} · {|class="wikitable" · |- · rowspan=""| · colspan=""| · |}

이 문서에서 사용한 틀:

이 문서는 다음의 숨은 분류 1개에 속해 있습니다: