hold-out 교차검증과 k-fold 교차검증

머신러닝 모델의 성능을 평가하는 방법은 크게 두가지로 나눌 수 있습니다. 하나는 hold-out 교차검증이고 하나는 k-fold 교차검증입니다. 제가 주로 연구하는 이미지품질평가 분야에서는 hold-out 교차검증을 주로 채택합니다. 그리고 시각품질편안도평가 분야에서는 k-fold 교차검증을 주로 활용하구요. 문헌조사를 통해 자신이 연구하는 분야에서 보통 어떤 검증 방법을 채택하는지를 살펴본 후 그것을 이용하면 됩니다. 그러면 이제 hold-out 교차검증과 k-fold 교차검증에 대해서 하나씩 살펴보도록 하겠습니다. 

 

hold-out 교차검증 

hold-out은 데이터셋을 훈련셋과 테스트셋으로 분리합니다. 예를들어, 데이터셋의 80%를 훈련셋으로 삼아 모델을 훈련시키고, 나머지 20%를 테스트셋으로 이용해서 성능을 평가하는 것이죠. 그런데 훈련셋과 테스트셋으로만 나눠서 모델의 성능을 평가하다보면, 테스트셋이 모델의 파라미터 설정에 큰 영향을 미치게 됩니다. 모델이 테스트셋에 오버피팅될 가능성이 있게 되는 것이죠.

 

hold-out 교차검증의 한 방법

 

그래서 데이터셋을 훈련셋과 테스트셋으로만 나누기 보다는 훈련셋, 검증셋, 테스트셋 이렇게 세개로 나누는 것을 권장합니다. 훈련셋을 이용해서 모델을 훈련시키고, 검증셋으로 모델의 최적 파라미터들을 찾아가고, 그 다음에 테스트셋을 이용해서 모델의 성능을 평가하는 것이죠. 이렇게 해주면, 테스트셋은 모델의 훈련과 성능을 높여주는 과정과는 무관하기 때문에 좀 더 나은 검증방법이라고 볼 수 있습니다. 

 

hold-out 교차검증의 또다른 방법

k-fold 교차검증

k-fold 교차검증은 데이터셋을 k개의 서브셋으로 분리합니다. 5-fold면 5개의 서브셋으로 분리해주는 것이죠. 그 다음에 하나의 서브셋만 테스트에 사용하고 나머지 k-1개의 서브셋은 훈련에 사용합니다. 이것을 k번 반복합니다. 다음 그림과 같은 방식으로 말이죠. 이렇게 k번 측정한 성능지표를 평균냄으로 최종적으로 모델의 성능을 평가합니다. 

 

k-fold 교차검증

 

 

만약 데이터셋의 크기가 별로 크지 않다면, 데이터셋의 샘플을 랜덤하게 섞어준 다음에 hold-out 교차검증이나 k-fold 교차검증을 해줍니다. 샘플을 섞어주고 검증하는 과정을 여러번 반복해서(10번 or 100번 or 1000번) 얻은 성능지표들을 평균내어서 성능을 평가하기도 합니다. 이렇게 해주면 좀 더 제대로 모델을 평가할 수 있죠. 

 

끝까지 읽어주셔서 감사합니다. 항상 질문과 지적은 환영합니다. 빠르게 답변드리고 있으니 댓글 남겨주세요.

 

 

<참고자료>

[1] https://medium.com/@eijaz/holdout-vs-cross-validation-in-machine-learning-7637112d3f8f, Eijaz Allibhai, "Hold-out vs. Cross-validation in Machine Learning"

댓글()

[Anaconda+python] 미리 훈련된 ResNet50으로 이미지 분류하기

컴퓨터비전/python|2020. 3. 14. 12:34

오늘은 거대한 데이터셋인 이미지넷에서 미리 훈련된 ResNet50을 이용해서 이미지 분류를 시행해보도록 하겠습니다. ResNet은 2015년 이미지넷경진 대회에서 우승을 차지한 이미지 분류 모델입니다. ResNet50은 ResNet 중에서 50개의 층을 갖는 하나의 모델입니다. 

 

이미지넷과 같이 아주 큰 데이터셋을 이용해서 직접 이미지 분류기를 훈련시키는 것은 쉽지 않습니다. 상당히 많은 시간이 소요되기 때문입니다. 공대생들이 소장하고 있는 고성능의 랩탑이나 데스트탑을 이용한다고 해도 보름 이상은 걸릴 일입니다. 그래서 보통은 이미지넷에 훈련된 모델을 가지고 와서, 그것을 각자의 목적에 맞게 업그레이드시켜서 사용합니다. 좀 더 자세히 말한다면, 훈련된 가중치들을 가지고 와서 그 가중치들을 목적에 맞게 새롭게 fine-tuning 해주는 것이죠.

 

오늘은 이미지넷을 이용해서 훈련된 ResNet50의 성능을 한 번 살펴보도록 하겠습니다. 따로 fine-tuning은 해주지 않았습니다. 이미지넷에 훈련되었기 때문에 1000개의 객체를 분류해낼 수 있습니다. 이미 훈련된 ResNet50에게 아래 이미지가 무엇에 관한 것인지 물어보도록 하겠습니다.

 

ResNet50아, 얘네들 뭐야?

 

우선 새라고 분류해낼지, 또한 이 새의 정확한 이름을 알려줄 수 있을지 관심을 갖고 지켜보시면 되겠습니다. 필요한 파이썬 코드는 다음과 같습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import numpy as np
from tensorflow.keras.applications.resnet50 import ResNet50, preprocess_input, decode_predictions
from tensorflow.keras.preprocessing.image import load_img, img_to_array
 
# imagenet에 미리 훈련된 ResNet50 모델 불러오기
model = ResNet50(weights='imagenet')
model.summary()
 
# 테스트할 이미지 불러오기
img_path = 'test1.bmp'
img = load_img(img_path, target_size=(224224)) 
 
# ResNet에 입력하기 전에 이미지 전처리
= img_to_array(img)
= np.expand_dims(x, axis=0)
= preprocess_input(x)
 
# 이미지 분류
preds = model.predict(x)
print('Predicted:', decode_predictions(preds, top=3)[0])
cs

 

실행에 앞서 준비해야할 패키지들이 있습니다. 우선 tensorflow를 이용하기 때문에, tensorflow를 먼저 설치해주셔야 합니다. 

 

>> conda install tensorflow

 

그리고 혹시 다음과 같은 에러가 뜨신다면, 

 

 

Pillow 패키지도 설치해주셔야 합니다.

 

>> conda install Pillow

 

그럼 이미지 분류를 잘 해내는지 테스트해보겠습니다. 위 파이썬 코드를 실행한 결과, 위 이미지를 다음과 같이 분류했습니다.

 

 

저는 가장 높은 확률을 가지는 3개의 결과가 나오도록 했습니다. 가장 큰 확률인 0.994385로 macaw(금강앵무)라고 분류했고, 두번째로 큰 확률인 0.0021338847로 lorikeet(청해앵무속), 세번째로 큰 확률인 0.0010255446로 bee_eater(벌잡이새류)라고 분류했습니다. 해당 이미지가 macaw일 확률이 절대적으로 크다고 ResNet50은 봤습니다. 

 

위키피디아에서 macaw가 뭔지 찾아봤습니다.

 

https://en.wikipedia.org/wiki/Macaw

 

아주 정확히 분류한 것 같죠? ㅎㅎ 

 

재미삼아 하나의 이미지를 더 테스트해보겠습니다. 피아노가 주 피사체인 사진입니다. 

 

ResNet50아, 이것은 뭐야? 

 

위 파이썬 코드에서 img_path 부분만 이 이미지 파일의 이름으로 봐꿔주고 실행했습니다. 저는 이 결과가 상당히 놀라웠습니다. 

 

 

여기서 upright가 바로 다음과 같이 생긴 피아노를 의미하는 것이더라구요.

 

구글에서 upright piano를 검색했을때 나오는 결과

 

grand_piano(그랜드 피아노)는 다들 어떻게 생긴 피아노인지 아실 것이고. ResNet50이 업라이트 피아노와 그랜드 피아노도 구분할 수 있는 능력을 가지고 있다는 것이 놀랍습니다. 

 

오늘은 이미 훈련된 ResNet50을 이용해서 이미지를 분류해봤습니다. ResNet50말고도 VGG16, InxeptionV3, MobileNet, DenseNet 등의 다른 이미지 분류 모델들을 불러와서 사용할 수도 있습니다. 한 두줄의 코드만 바꿔주면 됩니다. 

 

질문과 지적은 항상 환영입니다. 빠르게 답변드리도록 노력하고 있으니 댓글 남겨주세요.^^  

 

 

<참고자료>

[1] https://keras.io/applications/, Keras Documentation, "Applications"

댓글()

[논문 정리] Oh, "Deep Visual Discomfort Predictor for Stereoscopic 3D Image", TIP(2018)

컴퓨터비전/논문 정리|2020. 3. 12. 16:28

이 논문에서 제안하는 스테레오스코픽 3D(stereoscopic 3D, S3D) 이미지 시각 불편도 예측(visual discomfort prediction, VDP) 모델은 다음과 같은 알고리즘을 갖고 있다. 

 

1) 훈련셋에 속하는 S3D 이미지들을 로컬 패치로 분할한다.

2) 각 로컬 패치의 의사품질점수를 기존의 S3D-VDP 모델로 얻는다.

3) 로컬 패치들과 그것들의 의사품질점수들을 이용해서 로컬 패치의 품질 점수를 예측할 수 있는 패치 기반 CNN 모델을 훈련시킨다.

4) 훈련된 패치 기반 CNN 모델에 훈련셋의 S3D 이미지의 로컬 패치들을 입력해서 패치당 200개의 특성을 얻는다.

5) 하나의 S3D 이미지 내의 로컬 패치들마다 얻은 200개의 특성을 로컬 특성 종합 레이어에 통과시킴으로 800개의 특성이 되게 해준다. 800개의 특성과 MOS 값을 이용해서 회귀 함수를 훈련시킨다. 이 과정에서 패치 기반 CNN 모델의 가중치들도 재보정된다. 

댓글()

<양육쇼크>, 좀 더 과학적인 양육법은?

삶/교훈책방|2020. 3. 11. 07:32

아래 글은 2017년 어느날에 <양육쇼크>를 읽고 적은 독후감입니다. 

-----


우리 가정의 임신 소식을 듣고 결혼식 날 주례해주신 목사님 가정이 며칠 전에 이 책을 선물해주셨다. 총 9권의 책을 선물해주셨는데, 대부분 양육에 관한 책이다. 이제 내 책장에 새로운 분야의 책들이 꽂혀가면서 결혼과 임신을 더욱더 실감하게 되는 것 같다. 여러 권 중에서 이 책을 먼저 읽어봐야겠다는 생각이 든 것은 다름 아닌 제목 때문이다. 영어 제목이 함께 적혀있는데 바로 NurtureShock이다. Culture shock에서 cul을 nur로 바꾸었을 뿐인데, '제목 하나 참 잘 지었네'하며 감탄했다.

이 책은 기존에 우리가 경험적으로 대대로 물려져오고 있는 당연하다고 생각되는 양육 방법들 중에 몇몇은 잘못되었다는 것을 과학적인 연구들을 통해서 증명해낸다. 그 중 인상깊었던 몇가지만 소개한다.

대표적인 것이 바로 아이들에게 칭찬을 많이 해줘야한다는 믿음이다. "칭찬은 고래도 춤추게 한다"는 속담에 너무 깊게 감명을 받았는지 우리는 아이들에게 칭찬을 무분별하게 많이해왔다. 칭찬을 통해 자신에 대해 자긍심을 갖게해야한다는 이유 때문이다. 특히 많은 부모가 자신의 자녀들이 영재였으면 하는 바램때문인지는 몰라도 "아이고 우리 아들 똑똑하네", "누구 닮아서 이렇게 똑똑할까?" 등의 지능에 대한 칭찬을 많이한다. 그러나 지능에 대한 칭찬을 많이 듣고 자라온 아이들은 도전의식과 노력이 부족한 경우가 많았다. 문제를 풀다가 어려운 문제나 나오면 지능에 대한 칭찬을 많이 들어온 아이들의 경우, '이건 내 머리로 풀 수 있는 것이 아니야. 좀 더 똑똑해야지만 이 문제를 풀 수 있어'라고 스스로의 지능에 한계를 둔다. 그러나 노력에 대해 칭찬을 들어온 아이들의 경우, '내가 집중을 하지 않아서 이 문제를 풀지 못했던 것이야. 좀 더 열심히 노력하면 풀 수 있을거야'라고 생각한다. 이런 생각을 가진 아이들이 당연히 성장할 가능성이 훨씬 더 크다. 따라서 우리는 지능이 아닌 노력에 대해서 칭찬을 해줘야한다.

사람의 뇌는 쓰면 쓸수록 좋아진다. 다른 신체 기관들과 달리 나이가 들어도 발전할 가능성이 있는 것은 뇌뿐이다. 성장하는 뇌를 고영성, 신영준의 '완벽한 공부법'이라는 책에서는 '뇌 가소성'이라고 표현한다. 뇌는 쓰면 쓸수록 좋아지기 때문에 자신의 지능에 한계를 두는 것은 더이상 머리를 쓰지 않겠다고 스스로 선언하는 것과 마찬가지다. 과외를 하면서 아이들에게 숙제를 내주면, 그 중에 몇몇은 조금이라도 어려운 문제는 손도 대지 않는다. 왜 이 문제들은 안 풀었냐고 물어보면, 대부분 "선생님, 이 문제들은 너무 어려워서 제 머리로는 절대 풀 수 없어요. 좀 더 똑똑한 친구들만 풀 수 있을거에요."라고 답한다. 스스로의 능력에 계속 제한을 두는 것이다. 이 상황이 반복되면 문제가 심각해질 것 같아, 최근에 뇌 가소성에 대해 설명해주었더니 좀 더 끈기있게 문제를 풀려고하는 모습을 볼 수 있었다. 머리를 쓰게 하는 훈련을 계속해서 시키는 것이 당장 한 문제 두 문제 더 맞는 것보다 훨씬 중요한 일임을 새삼 깨닫고 있다.

두번째로 중요한 발견은 아이들을 충분히 재워야한다는 것이다. 많은 부모들이 아이들이 너무 많이 잔다고 걱정하는 것 같다. 그러나 사실은 필요보다 덜 자고 있다. "아이들의 두뇌는 21세까지 지속적으로 발달을 거듭해가는데 그중 상당부분이 취침 중에 이루어진다." (p. 55) 아마도 부모들의 욕심때문에 아이들의 취침 시간이 줄어든 것은 아닐까? 좀 더 공부잘하게 만들려고 취침시간을 줄였는데, 결과적으로는 두뇌가 성장하는 것을 방해하고 있던 것이다. 또한 하루 동안 공부한 내용이 잘 정리되기 위해서라도 충분한 숙면은 꼭 필요하다. 잠을 자는 동안 두뇌는 그날 학습한 것들을 무의식 중에 잘 정리해서 효율적으로 저장한다. 학부시절에 시험기간이 오면 밤새 공부하고 시험을 보는 친구들이 있었다. 암튼 그렇게 공부한 것은 단기기억으로 당장 시험은 어떻게든 통과할지 몰라도 제대로 남지 않는다. 아마 일주일만 지나도 거진 다 까먹을 것이다. 그래서 아이들의 등교시간을 늦춰야한다는 것이 학자들의 의견이다. 중학교, 고등학교 시절 생각해보면 8시까지 등교해야했는데, 그때까지 학교를 가려면 6시, 늦어도 7시에는 일어나야갈 수 있곤 했다. 그런데 보충수업 끝나고 집에 들어오면 새벽 1시였으니 많이 자야 6시간이었던 것이다. 결과적으로 아침 0교시는 항상 취침 시간과 같았다. 그렇게 무의미하게 시간을 보내느니 차라리 등교시간을 1시간 늦추라는 것이다. 수업에 임하는 학생들의 태도와 성적이 완전히 눈에 띄게 좋아진다는 것이 실험들을 통해 입증된 사실이다.

내년 5월이면 로아가 태어날텐데, 좋은 부모로 잘 준비되도록 노력해야겠다. 과외를 여러 명 해오면서 느낀 바는 부모의 과한 욕심이 아이들을 상당히 힘들게 만든다는 것이다. 내 자식이 태어나면 또 다르겠지만, 이 아이가 나의 자녀일 뿐만 아니라 하나님께서 나에게 잠시 맡기신 생명임을 기억하고 겸손히 양육할 수 있도록 잘 준비해야 겠다. 기존의 양육 방식을 되돌아보며 새로운 통찰력을 얻고 싶은 부모들에게 이 책을 추천한다.

댓글()

[Anaconda+python] Spyder 편집창 간지나게 변경하기

컴퓨터비전/python|2020. 3. 10. 13:56

코딩을 하는데 있어서 중요한 것 중 하나는 간지죠. 카페에서 코딩을 하던가, 팀원들과 모여서 작업할 때 시각적인 면도 무시할 수 없습니다. 오늘은 Spyder의 편집창을 간지나게 바꾸는 방법에 대해 소개해드리도록 하겠습니다.  

 

참고로 제가 사용하고 있는 Spyder의 버전은 3.3.6입니다. 아마 다른 버전의 경우도 크게 다르지 않을 것으로 예상됩니다. 

 

편집창의 Syntax의 색상은 다음과 같이 바꿀 수 있습니다. 

 

메뉴바에서 

 

Tools - Preferences - Syntax coloring

 

에 들어가셔서 Scheme을 원하는 것으로 바꿔주면 됩니다. 각 Scheme 마다 어떤 색상으로 구성되는지 아래 예들을 하나하나 확인해보세요. 뭐가 가장 괜찮은지는 각자 판단하시면 되겠습니다. 

 

1. Emacs 

Emacs

2. IDLE

IDLE

3. Monokai

Monokai

4. Pydev

Pydev

5. Scintilla

Scintilla

6. Solarized Dark

Solarized Dark

7. Solarized Light

Solarized Light

8. Spyder

Spyder

9. Spyder Dark

Spyder Dark

10. Zenburn

Zenburn

 

저는 개인적으로 3번 Monokai가 가장 괜찮아 보여서 이것으로 세팅했습니다. 여러분들의 선택은 어떨지 궁금하네요.^^ 여성분들은 10번 Zenburn을 좋아할 것 같기도 하구요. ㅎㅎ

댓글()