개요:

웹에서 간단하게 머신러닝을 실행시킬 수 있는 사이트가 존재. (정확히는 파이썬, 텐서플로)

위 사이트를 통해서 아래 코드를 실행 (코드의 내용은 다음과 같음)

'1~9까지의 약 6만여 장의 숫자 이미지를 학습하고, 랜덤으로 숫자 이미지가 주어졌을 때 어떤 숫자인지 맞춤'



사이트:

https://colab.research.google.com


메인 화면


회색: 코드 입력 부분

[ ]: 코드 입력 후 실행 아이콘


* 아래 코드를 입력 후 [ ]에 마우스 커서를 올리면 손가락 모양으로 변하는데 이를 클릭하면 수행됨 *


코드:


코드 삽입 결과:


코드 수행 결과:


추가사항:

fashion-mnist라는 mnist와 똑같은 형태지만 숫자 이미지가 아닌 패션 이미지의 mnist data가 존재

https://github.com/zalandoresearch/fashion-mnist

위 사이트에서 코드 및 상세한 설명을 볼 수 있음


여기서 mnist의 정석 코드와 영어지만 주석으로 원리에 대한 설명이 존재함.

원리부터 알고 시작하기 위해서는 Youtube의 김성훈 교수님의 머신러닝 강의가 원리 설명에 가장 Simple함



FASHION-MNIST 코드:


FASHION-MNIST 결과:


FASHION-MNIST 주의점:

- DataLoad 할 때, 숫자 MNIST가 나올 수 있음-


머신러닝 꾸준히 하자!


전문적인 내용보다는 그 때의 이야기를 쓰고 싶다.


때는 . . . 그러니까 2016년 1월이다.

판교에서 쥬라기 시대로 돌아가 공룡을 잡고 수렵하는 게임을 만든 게임 회사에 지원했을 때 일이다.


당당하게 이력서에 연봉을 딱 적어 내었다.

이 때가 아마 이 기업에 이력서를 4번째 냈던 시기였다.


항상 떨어지던 서류가 초심으로 자기소개서를 작성하니 신기하게도 통과되었다.

서류를 통과하고 두 번째로 온라인으로 시험을 보는 테스트를 치뤘다.

'플랫폼' 분야로 지원해서인지 온라인 테스트의 내용들은 전반적인 신 기술들에 대해서 기본적으로 알고 있는 지

그리고 기본적으로 코딩이 가능한 지, 마지막으로 정답이 없는 문제에 대해 자기만의 생각을 적을 수 있는 지

에 관련된 것이었다.


한 번 된통 깨졌던 경험이 있었기에, 이번에는 정답을 찾기보다 순전히 내가 찾고 분석해서 나만의 생각을 적어내었다.

뭐 그것이 정답이었는지, 아니었는지 모른다.

다행히 통과되었고 다음은 기술 면접 시간이었다.


이 때의 기술 면접에서 전반적인 주제는 최단 거리 찾기 알고리즘이었고 그 중에서도 '다익스트라' 알고리즘이었다.

솔직히 2년이 넘게 지난 지금 이젠 좀 가물 가물하다.


임베디드 쪽으로 공부하신 석사분과 함께 면접을 봤는데,

아무래도 임베디드 쪽이다보니 알고리즘 쪽으로는 기본에만 충실하신듯 하셨다.

그래서인지 자료구조와 알고리즘만 달달 외운 내가 돋보일 수 있는 면접이었다.

그 분께 먼저 질문하고 그 뒤 나에게 '~~씨는 알겠어요?' 라고 되게 젊은 면접관 분이 물었다.


다행히 신기하게도 질문들 하나 하나가 그 당시의 내가 자신있어 하는 부분들

MST, 프림, 크루스칼 등등 그래프 관련 자료구조와 알고리즘이었고 나름 알차게 대답했다.

유일하게 대답 못했던 알고리즘이 아마 A* 알고리즘이다.


지금도 A* 알고리즘은 모른다.

공부할 때 한 번 코드로 작성해봤어야 했는데 미루다보니 못했다. 쩝... 쩝!


아무튼 이 면접의 하이라이트는 다익스트라 알고리즘 이야기가 나왔을 때였다.

기본적인 개요를 설명하고 면접관님의 질문이 '쿡'하고 들어왔다.


(1) 벨만 포드 알고리즘과 다익스트라 알고리즘 차이점은?

(2) 만약 ~~ 상황이 있다면 두 알고리즘 중 어떤 알고리즘을 사용할 것인지?

(3) 방금 다익스트라 알고리즘은 보통 우선순위 큐를 사용한다고 했는데, 그렇게 사용하면 생기는 이점은?


위에 대한 답변은 ... 이젠 진짜 핵심만 기억날 뿐 자세한 원리들은 다른 자료들을 찾아보는 것이 좋다.

확실히 기억나는 것은 이 때의 답변과 면접은 정말 내 면접 경험 중 가장 뿌듯하고 운이 좋다고 생각한 면접이며

이건 떨어질 수 없는 면접이다라고 생각이 든 면접이다.


유일하게 자기소개를 망했었는데 횡설수설 한 바람에 왼쪽 면접관님이 내 자기소개를 듣고 중간에 나가버리셨다.

역시 억지로 날 포장하며 말하는 게 난 너무 힘들다. 

이 때 충격으로 그 뒤 면접은 항상 내 소개를 대전에서 온 ~~ 입니다. 잘하는 것은 ~~고 ~~하겠습니다. 라고

항상 짧고 담백한 30초 자기소개를 하게 된 계기가 되었다.


아무튼 면접이 끝나고 흡족한 모습으로 고생했다고 말해주는 면접관님의 모습을 보고 나오면서 내 표정은 밝았다.

그런데 아쉬운 것은 면접비를 챙겨주지 않았다. 그래서 조금 실망하긴 했지만 긍정적인 결과를 기다리고 회사를 나왔다.


그리고 역시나 합격 메일을 보고나서는 쾌재를 외쳤다.

그 동안 노력한 보람이 있다고 느꼈다.


이제 다음 관문은 마지막 관문인 코딩 시험이었다.

이 때 채용 프로세스는 특이하게도 기술 면접 뒤의 마지막 관문이 직접 코딩이었다.

임원 면접이 형식적으로 이루어지는 건지 마지막 관문이라고 말씀해주셨고, 또한 이 코딩은 온라인으로 진행되었는데

4시간동안 ... 어떠한 테스트 케이스도 통과할 수 있는 '다익스트라' 알고리즘을 작성하는 것이었다.


보자마자 난 행복했다.

다! 익! 스! 트! 라! 라니.


이건 완전 날 뽑기 위해서 낸 문제인가?

그렇게 내가 맘에 들었나?

라는 실없는 상상을 하면서 열심히 시험에 임했다.


그런데 시험 과정은 순탄치 않았다.

먼저 장소가 안좋았다.

무슨 배짱인지 항상 집에서 조용히 온라인 테스트를 치루던 것과 다르게 

그 때에는 카페에 가서 시험을 쳤는데, 충분히 이어폰으로 막을 수 있을 것이라 생각했던 사람들의 대화 소리는

'슝슝' 뚤렸고 집중도 풀리고 완전 힘들었던 시간이었다.

오죽하면 2시간 뒤에 시험 도중에 빠르게 택시타고 집에 와서 다시 시험을 쳤으니까.

(절대 카페에서 코딩 온라인 테스트는 치루지 말자!)

 

그 때의 나는 C++ STL을 공부하지 않았기 때문에 C++ STL을 사용할 수 없었다.

항상 내가 공부하면서 만들어 두었던 나만의 자료구조 코드를 가지고 시험을 쳤었는데

지금 생각하면 내가 항상 코딩 온라인 테스트 탈락했던 이유 중 하나다.


C++ STL을 쓰면 한 줄이면 끝나는 코드를 내 자료구조를 쓰면 오류를 수정하는데 2시간이나 걸렸으니까.

정말 얕봤다가 멘붕의 시간을 경험하게 했던 코딩 테스트였다.

내가 만든 '우선순위 큐'는 완전 쓰레기 같아서 다익스트라 알고리즘 결과가 샘플 테스트 케이스조차 통과하지 않았다.


그런데 모든 테스트 케이스에서 통과라니.

아마 마지막에 내가 제출한 알고리즘은 메모리 오버플로우로 터져버렸을 것이다.


아무튼 4시간 동안 간신히 내가 만든 자료구조를 사용하여

샘플 테스트 케이스를 통과하는 다익스트라 알고리즘 코드를 완성할 수 있었다.


이 때 진짜 뿌듯했다.

말도 안되는 업적인 줄 알았다.


또한 다른 사람들이 STL을 사용할 때 나는 내가 만든 것을 사용했으니 더 가산점을 받겠지?

라는 미친 생각을 하며 나도 드디어 취업하는구나 하며 행복한 일주일을 보냈다.


결과는 당연히 탈락.

주석도 없고, 코드 정리도 못하고, 불안정한 자료구조에,  STL을 사용하지도 않고, 

코드 길이는 몇 줄이면 될 것을 초 장문 코드를 작성하여 냈으니

오직 샘플 테스트 케이스에서만 돌아가는 다익스트라 알고리즘의 탄생이다.


이제와서 돌이켜보면 개발자에게 코딩 테스트의 탈락은 의심할 여지도 없는 실력 부족인 것 같다.

물론 운도 있을 수 있겠지만, 나중에 보니 그 때의 난 당연히 탈락했어야 하는 실력이었다.

부끄러울 정도로.


물론 이 경험들이 모여서 나중엔 결국 취업 관문을 이겨낼 수 있게 만들었지만.


그러니 지금도 항상 부족함을 안고 살자.

지금의 날 지켜보는 내 선배님과 팀장님 입장에서는 난 아직도 병아리일테니까.


- 다익스트라 면접 일기 끝 - 

무언가를 목표로 죽을듯 살아야 그 때 듣던 노래속에 잔향이 깃든다.
구디단의 기억과 느낌


이번 포스트는 일기처럼 쓰고싶은 내용이다.

그래서 제목도 일화라고 붙였다.

내가 아무것도 없을때 마주한 첫 면접.


이 면접을 통과하면 넷마블 게임즈 인턴 기회를 얻을 수 있었다.

솔직한 심정은 개인적으로 이 때 기회를 주신 기술 면접관님께 정말 감사하다.


아마 이 때 통과하지 못했다면 소프트웨어 개발은 아마 나랑은 연관없는 일이 되었을텐데.

기획 분야나 아니면 공무원 시험 준비나 아니면 영업 분야에 몸 담았을텐데.


학점 3.0에 영어 점수도 전공 자격증도 하나 없이 아무런 검토도 하지 않았던 자소서로 임했던 과정.

지금 다시 이 자소서를 돌아보면, 2년 뒤 조금은 완성된 자소서에 비하면 정말 투박하지만 뭔가 시작하는 느낌이 새록 든다.


이 인턴 과정동안 모두의 마블 게임 클론을 만들면서 정말 개발이 내 삶에서 하고싶은 일이구나를 느꼈다.

또한 인턴 기간동안 만난 사람들과 함께했던 일은 정말 즐거웠는데.



본론으로 들어가면 


이 면접동안 받은 기술 질문은 총 3개이다.

(1) 데이터 네트워크 과목인 OSI 7계층에 대해 말해보시오.

(2) TCP와 UDP의 차이를 말해보시오.

(3) Bubble Sort에 대해서 손코딩해보시오.


앞선 두 가지 이론에 대해서 답하는데 이 땐 정말 패기로운 면접이었다.

OSI 7계층 말해보라던 질문에 대한 내 답변은 이랬다.


음 죄송한데 제가 배운것은 총 5계층밖에 없는데 이것만이라도 말해도 되겠습니까?


그러자 흔쾌히 해보라고 하셨던 면접관님.

솔직히 OSI 7계층은 이 때 처음 들었다. 후에 면접이 끝나고 찾아보니 

OSI 7계층과 좀 더 간소화시킨 인터넷 5계층이 있었는데, OSI 7계층이 더 공식으로 인정받는 계층이다.


이 질문부터 이미 면접은 망했다고 생각했다.


내 맘대로 7계층 답하랬더니 5계층 답하고있으니 스스로 생각해도 답이없어 보였다.

그래서 오히려 더욱 마음 내려놓고 임할 수 있었던 것 같다.


뒤이어 TCP와 UDP의 차이는 그래도 핵심은 알고있었기에 잘 넘어갔고 마지막으로 Bubble Sort에 대해 물어보셨다.


면접관님: 혹시 Bubble Sort에 대해서 저 앞에서 손 코딩 할 수 있겠어요?


이 질문을 들었을 땐 정말 진심으로 멍했다.


손 코딩이라니...


손 코딩이라니.............



손 코딩이라니.............................



황당한 건 그래도 기술면접 준비하는 기간동안 여러 기출 질문들을 찾아봤고

아주 높은 빈도로 Sort에 대해서 나왔기 때문에 내가 가장 자신있게 준비했던 부분도 바로 정렬 알고리즘이었다.


특히 Quick Sort와 Merge Sort는 달달 외울정도로 많이 준비했는데 Bubble Sort라니.


처음 들어본 Sort였다. (단순 이 중 for문이 정렬 알고리즘이라고는 전혀 생각도 안했기에)


이 때 솔직히 탈락을 많이 생각했다.

그래도 정말 인생에서 처음으로 온 기회를 그렇게 쉽게 놓치기 싫었다.

그런 마음이었는지 정말 말이 준비없이 그냥 튀어나오더라.


솔직히 Bubble Sort같은 건 처음 들어봅니다. 빅 오 수행시간 이점으로 전 항상 퀵 정렬과 머지 정렬, 힙 정렬들을 

사용했지(실제론 한 번도 사용안했다.) Bubble Sort는 한 번도 안써봤습니다. 그래서 ...


라고 말하려는데 면접관님이 말을 잠시 멈추게하시곤 한 말씀하셨다.


면접관님: 그럼 Quick Sort 지금 손 코딩할 수 있겠어요?


그 때 난 정말 쾌재를 외쳤다. 만약 Merge나 Heap짜라고 했으면 그 당시엔 절대 못 짰을텐데 그래도 유일하게

다 외우고 있던 Quick 정렬이라니!


난 자신있게 '네!!!' 하며 대답하고 칠판에 섰다.



진짜 아무 생각도 안나더라.



내가 Quick 정렬을 짜는지 아니면 지렁이를 그리는지 몰랐다.

매개변수는 아무것도 없는 신기한 Quick 정렬 함수를 짜고 있는데, 마침 마지막 부분인 Swap() 함수를 

쓰자 면접관님이 '됐어요. 이리와 앉아요.' 라고 말씀하셨다.



진짜 망했다.


내가 코드를 봐도 정말 말도 안되는 코드다.


그 뒤엔 꽤나 일상적인 질문들 성격이나 무엇을 했는지 자기소개서에 쓴 이 말을 뭔지 등등을 물어보셨다.

그리고 면접이 끝났다.



정말 알 수 없는 결과만을 기다리며 집으로 가는 버스에서 ... 정말 가슴이 떨렸다.

왜냐하면 바로 결과가 나온다고 했기 때문이다.


1시간쯤 스마트폰만 잡고 긴장하며 기다렸는데, 연락은 안왔다.

정말 불안했다.


그러다 긴장이 풀려서 깜빡 졸았는데, 대전에 도착할무렵 갑자기 손에서 진동이 '파바바바바밧' 울린다.



느낌왔다.


... 네이버 메일 알림.


그리고 그 알림을 보고는 정말 기뻤다.


비록 최종 합격이 아닌 직전 관문인 인턴 합격 메일이었지만 앞으로 그 좋은 곳에서 2달동안 다닐 수 있다는 것에 너무

흥분되고 좋았다. 정말 좋았다.


이제는 조금 마음이 퍼석거리기 시작하지만 이 때의 그 벅찬 감정을 다시 느낄 수 있는 나날들이 찾아왔으면 좋겠다.


확실한 건 면접이 망하건 잘되건 뒤집을 수 있는 기회는 그 면접장안에서 시간이 다하기전에 죽을듯이 부딪혀야 한다는 것.



그러고보니 이게 내 초심이었네.


+ Recent posts