2017/01/26

텐서플로우(TensorFlow) 숫자 인식 테스트 // MNIST, 파이썬(Python) 3.5, 윈도우즈(Windows)용

0. 들어가며

윈도우즈에 아나콘다 배포판을 이용해서 파이썬을 설치하고, pip로 윈도우즈용 텐서플로우를 설치한 환경( 참고: http://comajava.blogspot.kr/2017/01/windows-tensorflow-python-35-anaconda.html )에서,

이미지 파일에 그려진 숫자를 텐서플로우로 판독해 내는 예제 코드를 돌려보았습니다.

외국 블로그의 예제 코드와 설명을 참고했으며, 참고자료의 소스 코드를 실행할 때 발생하는 간단한 오류들을 해결하는 방법에 대한 내용을 포함하고 있습니다.

* 참고 자료 :
1. https://niektemme.com/2016/02/21/tensorflow-handwriting/
2. https://github.com/niektemme/tensorflow-mnist-predict/

위의 두 페이지를 별도의 브라우저 창에 띄워놓고 보시면 편합니다.

본문은, 여친이 음스므로 음슴체


1. 목표

참고 자료 2 에 있는 예제 파일 중
create_model_1.py 를 이용해서 기계 학습을 진행한 후,
predict_1.py 를 이용해서 숫자가 그려진 이미지 파일을 텐서플로우가 인식해 내는 것을 확인함.


1-1. 참고 자료 2에 대한 설명

참고 자료 2의 예제 파일은 텐서플로우(TensorFlow) 공식 사이트의 MNIST 튜토리얼을 기반으로 작성한 것이며,
_1로 끝나는 파이썬 스크립트는 기초(beginner) 단계의 예제를 이용했고
_2로 끝나는 스크립트는 고급(expert) 단계의 예제를 이용한 것이라고 함.

기초 단계의 예제는 기계 학습의 학습 시간이나 강도를 낮춰서 간단히 결과를 확인할 수 있는 수준으로 맞춰진 듯 함.


2. 구동 환경

- 파이썬(Python) 3.5.2  64비트

- 텐서플로우(TensorFlow) 0.12.1

- OS는 윈도우즈(Windows) 7  64비트


아래 링크의 설명을 따라서 텐서플로우 구동 환경을 구축했다는 가정하에 계속 진행함.

* 윈도우즈(Windows)용 텐서플로우(TensorFlow) 설치 방법 // 파이썬(Python) 3.5, 아나콘다(Anaconda)
http://comajava.blogspot.kr/2017/01/windows-tensorflow-python-35-anaconda.html


2-1. 필수 라이브러리 확인

참고 자료 2의 설명에 따르면 다음의 파이썬 라이브러리가 필요하다고 함

The following Python libraries are required.

sys - should be installed by default
tensorflow - TensorFlow
PIL – Pillow


(참고) 파이썬 개발 환경에 설치된 라이브러리들을 확인하는 방법
윈도우즈 7 기준으로,
윈도우즈 실행 창에 (단축키는 윈도우즈키 + R) cmd 명령어로 윈도우즈 콘솔 창을 열고,
pip freeze 실행

잠시 후에, 설치된 패키지가 알파벳 순으로 나열됨


파이썬 개발 환경에 설치된 라이브러리들을 확인, pip freeze
파이썬 개발 환경에 설치된 라이브러리들을 확인, pip freeze

...
Pillow==3.3.1
...
tensorflow==0.12.1

로 패키지 설치 확인

* sys 라는 이름의 패키지는 pip freeze 결과에는 따로 안 보이는데
아마도 python의 기본 시스템(?)을 말하는 것인 듯 -.-a


3. 소스 실행



3-1. 소스 다운로드

참고 자료 2의 사이트에서 소스 코드를 다운로드함.

niektemme/tensorflow-mnist-predict
niektemme/tensorflow-mnist-predict


화면 위쪽&오른쪽에 있는 Clone or download를 선택한 후 Download ZIP 클릭

여기서, 소스 코드의 다운 경로가 살짝 중요한데

본인은 zip 파일을 다운받아서 C:\Temp 안에 tensorflow-mnist-predict-master 폴더를 만들면서 압축을 해제함.

즉, 소스 파일의 경로는

C:\Temp\tensorflow-mnist-predict-master


3-2. create_model_1.py 실행

윈도우즈 콘솔창을 열고
소스 파일이 있는 경로로 이동

cd C:\Temp\tensorflow-mnist-predict-master

* 콘솔창을 열 때 기본으로 열리는 경로가
C:\Users\...> 등으로 C 드라이브 기준으로 열리는데,
소스 파일을 C 드라이브가 아닌 다른 드라이브(파티션)에 저장한 경우에는
그 드라이브로 먼저 바꾼 다음에 cd 명령어를 입력해야 함

d: (엔터)
cd d:\Dev

본인이 다운로드 및 압축 해제한 소스 파일이 있는 경로로 이동한 다음,
참고 자료 2 설명에 따라, 아래의 명령을 윈도우즈 콘솔창에 붙여넣고 엔터

python create_model_1.py


python create_model_1.py
python create_model_1.py


아래와 같이 기계 학습에 사용할 데이터 파일이 자동으로 다운로드 되고

에러가 뙇 나옴. -,-;


3-2-1 에러 발생


initialize_all_variables (from tensorflow.python.ops.variables) is deprecated and will be removed after 2017-03-02. Use 'tf.global_variables_initializer' instead.
initialize_all_variables (from tensorflow.python.ops.variables) is deprecated and will be removed after 2017-03-02. Use 'tf.global_variables_initializer' instead.


BoA~ Honey~

소스 내 라인 44에 있는 initialize_all_variables 가 deprecated 된 상태이고 2017-03-02 일자로 없어질 예정이니 global_variables_initializer 로 바꿔서 쓰라는 것과

라인 61에 있는 model.ckpt 파일명으로 텐서플로우 학습결과(?)를 저장하는 부분에서 부모 디렉토리가 없다며 부모님을 건드리는 상황이 발생하였음.

결과적으로 create_model_1.py 코드의 최종 성과물인 '모델'을 파일(model.ckpt)로 저장하지 못하고 실패한 상황


3-2-2 에러 해결


create_model_1.py 코드 수정
create_model_1.py 코드 수정

create_model_1.py 파일의
라인 44를 주석 처리하고
라인 45에 global_variables_initializer 를 눈치껏 삽입

라인 62에는 저장할 파일 이름 앞에 /Temp/를 추가해서 경로를 절대적(?)으로 지정해줌


* 윈도우즈 환경변수나 파이썬 환경 설정 등에서 파이썬 작업 경로에 현재 경로(./) 정도를 등록해주면, 소스 코드 내의 경로가 코드를 실행한 경로를 기준으로 자동으로 적용이 될 것 같은 느낌적인 느낌이 들지만 일단 결과를 빠르게 확인하는 관점에서 절대 경로로 처리.


python create_model_1.py 성공
python create_model_1.py 성공


너무 빨리 끝나서 의아하지만 잘 되었음.

설정한 경로(여기서는 C:\Temp)로 가서 model.ckpt 파일이 생성된 것을 확인해보면,
용량이 매우 작은 파일들이 몇 개 생성되어 있음


3.3 predict_1.py 수정 후 실행

predict_1.py 파일에서도 앞서 수정했던 것과 동일하게

predict_1.py 코드 수정
predict_1.py 코드 수정


라인 44를 주석 처리하고
라인 45에 global_variables_initializer 를 눈치껏 삽입

라인 58에는 저장했던 파일 이름 앞에 /Temp/를 추가해서 경로를 동일하게 지정해 줌


참고자료 2에 있는 설명에 따라

python predict_1.py ‘text32.png’

로 실행하면 에러가 발생

* 이미지 파일은 참고자료 1의 하단에 있는 이미지를 그대로 가져다 씀


python predict_1.py ‘text32.png’
python predict_1.py ‘text32.png’

파일명을 작은따옴표로 감싼 게 문제였던 듯.

아래처럼 파일명에서 따옴표를 제거하고 다시 실행하면 성공. 파이썬의 버전 차이에 따른 오류인 듯 함.

python predict_1.py text32.png


python predict_1.py text32.png
python predict_1.py text32.png


아래는 테스트용으로 사용한 이미지

text32.png
text32.png

위 이미지를 3으로 인식해내는 놀라운 결과에 감동해서 다른 이미지들도 넣고 돌려보았으나,
기계 학습의 강도가 낮아서 그런지 인식 정확도는 낮은 편. -,-a

참고 자료 2의 고급 단계 예제 코드인
create_model_2.py 와 predict_2.py 를 돌려보면 좀 더 나은 결과를 얻을 수 있을 듯.


Let the tensors flow, yeah~


댓글 3개:

  1. TensorFlow 로 시작하는 기계 학습과 딥 러닝 강의 링크입니다.
    https://codeonweb.com/course/7e8c4944-308e-410e-85aa-644624613741

    답글삭제
  2. 안녕하세요! 덕분에 진행에 많은 도움 받았습니다. 감사합니다 ㅠㅠ
    궁금한게 있는데 하나 여쭤봐도 될까요?

    이미지 크기나 그런거에 제한이 있나요?
    샘플로 넣어주신 3을 넣어도 8이나오고
    제가 임의로 만든 1을 넣어도 8이 나와서요 ㅠ

    답글삭제
    답글
    1. 안녕하세요, 댓글 감사합니다. ^^

      저도 이걸 돌려본지가 오래되어서 정확하지는 않지만
      이미지 크기는 파이썬 내 코드에서 특정 사이즈 범위로 축소(리사이즈)시키는 코드가 있었던 것 같습니다.

      숫자 인식력(?)이 떨어지는 이유는
      충분한 강도(?)로 기계학습이 되지 않아서 그럴 수도 있을 것 같습니다.
      위 예제 파일은 학습기간으로 컴퓨터가 돌아가는 시간이 매우 짧더라구요. ^^;;

      본문 중 참고 자료 2의 고급 단계 예제 코드를 돌려보시거나

      http://comajava.blogspot.kr/2017/01/windows-tensorflow-python-35-anaconda.html 에서
      '4-2. 텐서플로우 데모 모델 실행' 부분의 내용을 따라 텐서플로우를 돌린 후에
      모델을 뽑아서(저도 안 해봤습니다;;) 숫자 인식 테스트를 해보시면 좀 더 나은 결과가 나오지 않을까 합니다.

      삭제