Eli의 여백

바쁜 나날들 사이에서 생각났던 이런저런 것들을 적어봅니다.

프로그래밍/Python 프로그래밍

Jupyter lab 환경에서의 MNIST 재해석

Eli♪ 2021. 5. 8. 00:02

들어가며

이번 주에는 실험을 하다가 즉석에서 계량과 오차계산을 다 해야 했던 실험과정이 있었다. 계산기를 쓰면 편한데 손에 라텍스 장갑을 끼고 있어서 키보드에 묻을 가능성도 있고 매우 찝찝했었다. 그래서 이전 글에서 세팅한 음성인식이 생각이 났다. 노트북에 동일한 세팅을 하고 OriginLab에 연결시켜두면 자동계산이 될 것 같았다. 찾아보니까 origin도 python 연동이 되긴 하는데 2021버전부터 지원하고, 내 소속기관 라이센스는 2019가 한계라 불가능했다. 어쩔 수 없이 엑셀에 미리 수식을 써놓은 파일을 만들고 입력 부분만 말로 연동할 수 있게 하는걸로 계획을 변경했다. 그래서 다른 사람 글을 참고해서 python으로 엑셀을 제어할 수 있는 모듈을 하나 작성했다. 음성인식 부분도 google speech recognition API를 써서 간단하게 작성을 했는데 이걸 이용해서 만드니 다음과 같이 구글 어시스턴트급의 성능을 그대로 뽑을 수가 있었다.

 

 

그런데 문제는 wakeword였다. 구글 API를 쓰니 무슨말을 하는지 잘 알아먹기는 하는데 실험실에 이걸 while로 돌려놓고 호출어가 없이 계속 구글에 음성 데이터를 전송하면 사생활 침해 문제가 발생할 수 있었다. 나도 내 음성 정보를 웬만하면 구글에 안 보내고 싶기도 했고 말이다. 이전 글에서 봐 두었던 voice macro라는 3rd party app을 시도해 보았으나 아래 사진과 같이 MS 기본 음성인식만 가능하고 언어는 한국어 지원은 안됐다. 그리고 심지어 영어도 에러율이 너무 컸다.

나는 엑셀과 마이크로소프트 엑셀을 말하고 있는데 계속 다르게 인식한다.

 

그래서 인터넷을 좀 찾아보니 꽤 쓸만한 걸 만든 사람(유튜브 영상)이 있었다. 

 

출처: The A.I. Hacker - Michael Phi 유튜브 캡쳐 (https://youtu.be/ob0p7G2QoHA)

나도 그냥 이렇게 해야겠다고 생각했고, 이사람이 코드를 공개하고 있어서 볼 수 있었다. pytorch로 짰는데 내가 그동안 tensorflow 세팅을 대충 깔짝대기만 하고 이렇게 제대로 해본적이 없어서 코드를 보는데 힘이 들었다. 아무래도 내 실력이 부족한게 원인인 것 같았다. 직접 셋업하고 실행하면서 따라해봐야 알 것 같았다.

 

Jupyter lab 셋업

일단 셋업하려는 컴퓨터에 아무것도 안깔려있어서 miniconda를 설치 후 가상환경을 만든 다음 관련 라이브러리를 깔았다. 중간에 numpy랑 win32api가 계속 말썽을 일으켰었는데 해당 모듈만 지우고 다시 설치하니 문제가 사라졌다. 어쨌거나 되는 환경을 구성하고 jupyter notebook을 깔려고 봤더니 어느새 업글이 많이 되어있었고 이름도 jupyter lab으로 바뀌어 있었다. 몇 년 전에는 일반 IDE보다 쓰기가 힘들고 버그도 많아서 하다가 때려쳤던 기억인데 이제는 확실히 발전한 모습을 보여줬다.

 

이제 작성을 하려고 하니 이번엔 또 tensorflow가 엄청나게 역변해있었다. 예전의 내가 알던 tensorflow가 아니고 문법도 많이 바뀐거같아서 다시 새로 익혀야 할 지경이었다.

별 수 없이 machine learning의 hello world인 MNIST를 해보기로 했다.

 

MNIST 튜토리얼 수정

간만에 하려니까 기본 튜토리얼에 있는게 visualization을 안해서 별 감흥이 없었다. 그리고 predict 부분도 없어서 다른 문서를 참고해서 내 입맞에 맞게 고쳐봤다. 자세한 코드는 github에 업로드해놨다. 내가 처음 해보면서 궁금한것들을 print해뒀고 몇몇 추가한 부분들을 캡쳐해서 가져와보면 다음과 같다.

 

class name 확인

tensorflow 예제에는 대충 어물쩡 넘어가는데 사실 categorical하게 만들면 6만개의 train data를 넣었을 때 category가 10개로 줄어드는게 당연하지는 않다. 내부적으로는 알파벳순으로 정렬을 하는거같은데 내가 몰라서그런건지 클래스 리스트만 따로 뽑는게 없어서 numpy.unique를 사용해서 class name을 추출해봤다.

 

트레이닝 셋 표시

간만에 하니까 샘플이 눈에 안보이는게 불편했다. 그래서 다음과 같이 그림으로 앞쪽 9개 뽑아봤다. 여기에서 facecolor는 다크모드로 하니 jupyter lab에서는 잘 보여주는데 나중에 github 업로드할때 다크모드이면 배경이 투명이라 검은글자가 하나도 안보여서 넣어줬다.

 

모델 요약 표시

만든 모델을 summary()를 써서 출력해보면 param #에 익숙하지 않은 숫자들이 보였다. 알고보니 기본 벡터에 bias까지 1개 추가해서 총 파라미터 갯수(아마 vector의 rank가 되겠지?) 를 표시한 거였다.

 

prediction 확률 표시

이 부분이 예전에 비해 문법이 좀 많이 바뀐 것 같았다. 인터넷 뒤져보니 원래 model.predict를 하면 단일 확률들이 출력됐던거같은데 아예 array로 출력이 된다. 그런데 또 어레이에 class name을 직접 매칭시키는 함수를 찾질 못해서 prediction.argmax와 model.predict가 따로 노는 느낌이 들었다.

 

predict 결과 그림 표시

공식 튜토리얼에 보면 결과물을 표시해주는게 있는데 MNIST용으로는 영 그림이 마음에 안들어서 label을 포함해서 다시 그렸다. tick label에 class name을 넣어주니 뭐로 예측되는지 확실히 잘 보였다.

 

못맞춘 결과들 표시

앞에 그림을 그리고 나니까 죄다 잘맞추는 그림만 나와서 못맞춘건 어떻게 나올까 하고 그려봤다. 학습할 때 epoch를 10번 하니까 predict에서 대충 220개정도를 못맞춘 결과가 나왔다. 근데 아래 그림을 보면 알겠지만 못맞출만 했다. 그리고 사람이 보면 어느정도 맞출 수 있다는 점에서 ML이 아직은 사람처럼 되기까지는 멀었다는 생각도 들었다.

 

결론

이정도까지 하고 나니 이제야 jupyter lab과 tensorflow에 좀 익숙해진 느낌이 들었다.

 

결과물도 github에 바로 publish 가능하면 좋겠다는 생각이 들어서 찾아보니 git용으로 만들어진 플러그인이 있었다. 설치 후 실행해봤더니 readme.md까지 해결해주는 것은 아니어서 jupyter lab에서 md로 export한 후에 지저분하게 안되도록 doc폴더 만들고 md안에 그림 path를 수정해줬다. 최종 결과물은 github에 publish해뒀다.

 

역시 프로그래밍은 알면 삶이 편리해지는 느낌이다. 다음에 또 시간이 나면 위에 유튜브영상의 코드를 참고해서 wakeword 음성인식을 제대로 할 수 있게 만들어봐야될 것 같다. 끝.

 

 

그 외 찾아봤던 자료들

- voicemacro 잘쓰는사람(난 원어민이 아니라서 안되는건가): youtu.be/XuW54UVv2k4

- speech recognition module: github.com/Uberi/speech_recognition

- speech recognition background listening(나는 뭐가문젠지 잘 안됨): github.com/Uberi/speech_recognition/blob/master/examples/background_listening.py

- speech detector: github.com/arindomjit/Voice_Controlled_Mouse/blob/master/speech_detector.py

- audio visualization tool (그냥 욕심에 봐봤지만 프로그램 부피 커질거같아서 던짐): github.com/qxresearch/qxresearch-event-1/tree/master/Applications/Audio%20Visualization%20Tool

- 위 module의 demo (github은 멋있게 그려놓고 실상은 matplotlib 퀄리티다): youtu.be/0_wde7Db48E

- matplotlib보다는 나아보이는 spectrogram: nachwon.github.io/faster-waveform/

출처: https://nachwon.github.io/faster-waveform/

- pydub: pydub.com/

- carpedm20의 tacotron: github.com/carpedm20/multi-Speaker-tacotron-tensorflow

- tacotron 해설: melonicedlatte.com/machinelearning/2018/07/02/215933.html

- voice controlled mouse 5분컷(pyautogui 사용): towardsdatascience.com/build-a-voice-controlled-mouse-keyboard-in-5-minutes-952bc8f101fc

- pyautogui 대충 간단하게 설명된 글: pythondocs.net/pyautogui/pyautogui-%EB%A7%A4%ED%81%AC%EB%A1%9C-%EC%82%AC%EC%9A%A9%EB%B2%95-%EA%B8%B0%EC%B4%88/

- pipwin 써서 pip 호환성 문제 해결: blog.daum.net/sualchi/13720976

- keras 옛날식으로 구현한 것: keras.io/getting_started/intro_to_keras_for_engineers/#training-models-with-fit

- cross entropy loss에 대해 잘 정리된 글: gombru.github.io/2018/05/23/cross_entropy_loss/

- jupyter lab shortcut: gist.github.com/discdiver/9e00618756d120a8c9fa344ac1c375ac

대충 A B가 위아래 insert이고 ESC로 context전환이 가능하고 M을 하면 markdown block로 바꿔준다.

- 간단한 fashion MNIST: www.tensorflow.org/tutorials/keras/classification?hl=ko#%EC%98%88%EC%B8%A1_%EB%A7%8C%EB%93%A4%EA%B8%B0