1-14 Iris flowers data 사용 TensorFlow Deep Learning
Iris data를 사용하여 scikit-learn 이 아닌 텐서플로우로 머신 러닝을 해보자. Iris 꽃 데이터는 1936년에 영국의 생물학자이면서 통계학자로 유명한 Fisher 교수와 영국 하버드 대학의 발생학 전문의 앤더슨 교수가 연구차 영국을 방문하여 Fisher 교수와의 연구에서 수집된 보석과도 같은 데이터이다.
텐서플로우로 Deep Learning을 한다고 해서 scikit-learning 의 결과와 그다지 달라질 것은 없으나 MNIST 수기문자 인식 문제 와 CNN 코드 예제를 대상으로 Deep Learning 문제를 많이 다루어 보았으면 Iris flowers 데이터를 상대로도 TensorFlow 로 다루어 보고 싶은 생각이 있기 마련이다. 아울러 scikit-learn 에서 핸들링하는 데이터를 직접 TensoFlow용으로 변환하려는 노력을 해보았으나 아직은 준비가 되지 않아 데이터 파일을 제공하여 직접 읽어서 처리하는 방법을 택하였다.
Iris flower 의 데이터 제원은 위 그림과 같다. 꽃 종류별로 petal(꽃잎)의 길이와 폭, sepal(꽃받침)의 길이와 폭을 나타내며 종류로는 ‘Iris-setosa’, ‘Iris-versicolor’,‘Iris-virginca’ 가 있다.
scikit-learn 라이브러리에서 사용하는 Iris data 포맷이 TensorFlow에서 요구되는 포맷과 달라 별도로 준비한 데이터 파일 즉 Iris.train 과 Iris.test 를 사용하기로 하자. 학습을 위한 Iris train은 Iris 꽃별로 각 40개씩 테스트를 위한 Iris.test는 각 10개씩 데이터로 구성된다.
헤더 영역에서 tensorflow, numpy, time 3개의 라이브 모듈을 불러 온다. 학습 횟수 증감에 따른 소요 실행 시간을 카운트 해 보기 위해서 시작 시점의 시간과 종료 시점의 시간을 기록하고 마지막 줄에 차이 값을 계산하여 출력하기로 한다.
함수 label_encode() 와 data_encode()를 정의 한다. data_encode()는 데이터 파일을 넘겨주면 읽기용으로 오픈하여 줄바꿈(‘\n’) 기준으로 라인 데이터를 읽어 들여서 ‘,’ 를 기준으로 데이터를 분리하여 line[0], line[1], line[2], line[3], line[4]에 각각의 값을 입력한다. 한편 label_encode() 는 넘겨받게 되는 데이터가 문자열 종류가 ‘Iris-setosa’ , ‘Iris-versicolor’, ‘Iris-virginica’ 인지를 따져서 그에 대응하는 one hot code를 데이터를 넘겨주게 된다. 이는 TensorFlow에서 Softmax 명령 사용을 위해서 필요한 데이터 준비 작업이다.
다음의 함수 model()은 Neural Network 레이어의 Depth를 부여하기 위한 역할을 한다. 입력 벡터 x 와 웨이트 매트릭스 weights 및 바이아스 벡터 b 가 필요하며 우선 x 와 weights를 매트릭스 연산 후 성분별로 바이아스 벡터를 더하기 하여 하난의 레이어 연산이 끝났으며 relu() 처리를 시행한다. relu()는 음수 값이 입력되면 0.0 으로 두고 양수 값이 입력되면 그대로 둔다. NN에서 멀티 레이어를 구성할 때에 필수적인 처리 과정이다.
relu() 처리 된 1차 레이어를 사용하여 다시 2차 NN 처리한다. 즉 2개의 레이어를 사용하는 셈이다.
아나콘다 스파이더에서 Iris.train 및 Iris.test 데이터 파일을 읽어 들이자. 참고로 아나콘다 스파이더 편집기가 아닌 일반 편집기를 사용할 경우 파이선 OS에서 데이터 파일을 열기 위한 인터페이스를 위하여 다음과 같은 추가 명령이 헤더 영역에서 선언되어야 할 수도 있음을 참고하자. 아나콘다에서 스파이더에서는 없어도 무방하다.
import os
os.environ["TF_CPP_MIN_LOG_LEVEL"]='2'
각 40개씩의 학습 데이터와 10개씩의 테스트 데이터를 읽어들여 준비한다. learning rate 느 ㄴ0.01 학습 횟수는 1000회 cost 함수 출력은 200 학습 마다 하기로 한다.
네트워크 파라메터로서 n_input 은 4 즉 Iris 데이터는 4개가 1 세트이다. n_hidden 은 10으로 10번의 Depth에 해당하는 레이어를 사용하기로 하자. CNN을 비롯하여 대부분의 NN 구조에서 layer를 10개까지 사용하는 관행을 참조하자. one hot code를 입력하게 되는 n_output은 [1,0,0], [0,1,0], [0,0,1] 을 처리해야 하므로 3으로 설정한다.
tf.placeholder X 와 Y는 TensorFlow 전반부의 Computational Graph에서 설정이 이루어지며 Session에서 필요한 데이터를 공급하여 실행이 이루어진다.
TensorFlow 머신 러닝 시작을 위해서 random_normal() 을 사용하여웨이트 매트릭스와 바이아스 벡터의 값을 초기화 하자. zeros()를 사용하는 경우도 있긴 한데 임의의 랜덤한 값에서 시작하여 경사하강법을 적용하여 웨이트 값이 결정되어야 더 일반적이라 볼 수 있다. 특정 위치에서 출발하여 웨이트 값이 결정된다면 만약의 경우 출발 점이 변경될 경우 동일한 결과가 나올는지 확신 할 수 없는 문제점이 있을 수 있다.
Computational Graph 단계에서 필요한 랜덤 변수들이 설정되었으면 학습 모델을 정의 하도록 한다. 이어서 cost 함수를 구성하고 optimizer를 설정한다. TensorFlow에 여러 가지 종류의 성능이 조금씩 다른 Optimizer 가 있으며 여기서는 AdamOptimizer를 사용하였다. GradientDecent를 사용해도 별 문제는 없을 것이다.
학습횟수 1,000 과 10,000에 대한 아래의 계산 결과는 97.5% 인식률을 보여 주며 학습횟수는 1000회면 충분하다는 점을 알 수 있다.
이 예제를 아나콘다에서 실행해 보기 위해서는 Iris_01.py 파이선 코드와 데이타 파일 Iris.train 과 Iris.test를 같은 폴더에 저장해야 한다. 아울러 Iris_01.py 데이터 파일을 다운로드 받았을 경우 Session 단계에서 indentation 이 정확한지 여부를 이 블로그 설명의 그림과 비교해서 확인해 보도록 하자.
필요한 파일들은 외부에 위치한 필자의 블로그에서 가져 오도록 한다.









짱짱맨 호출에 응답하여 보팅하였습니다.
Congratulations @codingart! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :
Click here to view your Board
If you no longer want to receive notifications, reply to this comment with the word
STOP