Urban Sound Classification Update

(업데이트)아래 훈련 세트와 테스트 세트를 사용하여 간단한 모델을 만들어 보았습니다. 훈련 데이터에서 62.8%(주피터 노트북 참고), 테스트 세트에서 56.5%(주피터 노트북 참고) 정확도를 얻었습니다. 나중에라도 구글 클라우드를 쓸 기회가 있으면 파라미터 탐색 범위를 늘려서 한번 시도해 보겠습니다. ^^

(업데이트)이 글에서 작업한 훈련 세트와 테스트 세트의 분류가 잘못되었습니다. 테스트 세트와 훈련 세트가 같은 소리의 샘플을 가지고 있습니다(문제점을 찾아주신 최근우님께 감사드립니다). 예를 들면 한 강아지로 부터 몇 개의 소리가 녹음되어 있습니다. 이런 경우에 이 소리가 훈련 세트와 테스트 세트로 나뉘어져 들어가면 정확한 추정이 되지 못합니다. 새로운 데이터는 완전히 새로운 강아지의 목소리일 것이기 때문입니다. 이와 비슷한 경우의 예로는 의료 영상 같은 분야입니다. 한 환자의 영상이 테스트 세트에 섞여 들어가면 과도하게 낙관적인 추정을 얻게됩니다. UrbanSound8K의 사운드 추출 데이터를 레이블이 섞어지 않도록 scikit-learn의 GroupShuffleSplit를 사용하여 훈련 세트와 테스트 세트로 나누어 깃허브에 올려 놓았습니다. 이 데이터셋으로 도전해 보도록 하겠습니다. 🙂

UrbanSound8K 데이터를 이용해 10가지의 소리를 분류하는 Urban Sound Classification의 코드를 텐서플로우 1.1 버전에 맞추어 업데이트했습니다. 이전과 달라진 점은 레이어의 노드를 증가시켰고, 텐서플로우의 매트릭스 연산자를 사용하지 않고 조금 더 상위 API인 dense, softmax_cross_entropy_with_logits 등을 사용한 것과 기본적인 경사 하강법 말고 0.0001의 학습속도로 Adam 옵티마이저를 사용한 점 등입니다. 여러번 하이퍼파라미터 튜닝을 하기 위해 특성 데이터를 훈련용과 테스트용으로 나누어 놓고 작업을 시작했습니다.

urban_sound_train

훈련은 Urban Sound Classification-Train.ipynb 파일에, 테스트는 Urban Sound Classification-Test.ipynb 에 있습니다. 학습 결과는 훈련 데이터에서 92.6%, 테스트 데이터에서 92.8% 입니다. 결과를 보아서는 확실히 언더피팅 상태로 보입니다. 훈련 데이터에서 조금 더 성능을 끌어올릴 여지가 있을 것 같지만 다른 일들 때문에 여기서 일단 멈추었습니다. 나누어진 훈련 데이터와 학습된 파라미터는 깃허브에서 볼 수 있습니다.

TensorFlow 1.2.0 RC2 Release

텐서플로우 1.2.0 RC2 버전이 릴리즈 되었습니다. RC2에서부터 윈도우즈 파이썬 3.6 버전을 지원합니다. 이제 윈도우에서 아나콘다를 설치하고 따로 파이썬 3.5 환경을 만들었던 번거로움이 사라졌습니다. 또 1.2 버전이 cuDNN 5.1을 사용하는 마지막 버전이 되었습니다. 1.3 버전부터는 cuDNN 6.0을 기준으로 wheel을 생성합니다. 하지만 텐서플로우 소스 코드는 cuDNN 5.1과의 호환성을 유지합니다. cuDNN5.1을 반드시 사용해야 하는 경우라면 직접 빌드를 해야할 것 같습니다.

이번 버전에서 바뀐 자세한 내용은 이전 포스트와 릴리즈 노트를 참고하세요. 1.2.0 RC2 버전이 이미 PyPI에 등록되어 있기 때문에 pip 명령에서 --pre 옵션으로 간단하게 설치할 수 있습니다.

$ pip install --upgrade --pre tensorflow

$ pip install --upgrade --pre tensorflow-gpu

From R-CNN to Mask R-CNN

Athelas의 블로그에 이미지 분할image segmentation에 관한 최근의 연구 동향을 간단하게 짚어주는 포스트가 올라왔습니다. 바로 R-CNN, Fast R-CNN, Faster R-CNN, Mask R-CNN입니다.

R-CNN

0*Sdj6sKDRQyZpO6oH.

이미지를 분류하는 것보다 이미지 안에 어떤 물체들이 들어 있는지를 구분해내는 것이 훨씬 어려운 작업입니다. R-CNN은 이를 위해 몇단계를 거쳐 임무를 처리합니다. 먼저 가능한 이미지 영역을 찾아내는 리전 프로포잘region proposal 혹은 바운딩 박스bounding box를 만드는 단계가 있습니다. 바운딩 박스를 찾기 위해 셀렉티브 서치selective search 알고리즘을 사용합니다. 가령 색상이나 강도 패턴 등이 비슷한 인접한 픽셀을 합치는 방식입니다. 그런 다음 추출한 바운딩 박스를(대략 2,000여개) CNN의 입력으로 주입하기 위해 강제로 사이즈를 일원화시킵니다. 여기서 사용한 CNN은 미리 훈련된 AlexNet의 변형된 버전입니다. CNN의 마지막 단계에서 서포트 벡터 머신support vector machine을 사용하여 이미지를 분류합니다. 그리고 최종적으로 분류된 오브젝트의 바운딩 박스 좌표를 더 정확히 맞추기 위해 선형 회귀linear regression 모델을 사용합니다.

Fast R-CNN

1*E_P1vAEbGT4HNYjqMtIz4g

R-CNN의 문제점은 모든 바운딩 박스마다 CNN을 돌려야 하고 분류를 위한 SVM, 바운딩 박스를 위한 선형 회귀까지 세가지 모델을 모두 훈련시키기 어렵다는 점입니다. Fast R-CNN은 이 문제들을 해결했습니다. 먼저 바운딩 박스들 사이에 겹치는 영역이 많은데 이들을 따로 따로 CNN을 통과시키는 것은 비용 낭비라고 생각했습니다. 여기에서 RoIPoolRegion of Interest Pooling의 개념을 도입하여 셀렉티브 서치에서 찾은 바운딩 박스 정보를 CNN을 통과하면서 유지시키고 최종 CNN 특성 맵으로 부터 해당 영역을 추출하여 풀링pooling합니다. 이렇게 하면 바운딩 박스마다 CNN을 돌리는 시간을 획기적으로 단축할 수 있습니다. 또한 SVM와 선형 회귀 모델을 모두 하나의 네트워크에 포함시켜 훈련을 시킵니다. SVM 대신 CNN 뒤에 소프트맥스softmax를 놓고, 선형 회귀 대신 소프트맥스 레이어와 동일하게 CNN에 뒤에 따로 추가했습니다.

Faster R-CNN

Fast R-CNN에서 남은 한가지 성능의 병목은 바운딩 박스를 만드는 리전 프로포잘 단계입니다. Faster R-CNN은 리전 프로포잘 단계를 CNN안에 넣어서 마지막 문제를 해결했습니다. CNN을 통과한 특성 맵에서 슬라이딩 윈도우를 이용해 각 지점anchor마다 가능한 바운딩 박스의 좌표와 이 바운딩 박스의 점수를 계산합니다. 대부분 너무 홀쭉하거나 넓은 물체는 많지 않으므로 2:1, 1:1, 1:2 등의 몇가지 타입으로도 좋다고 합니다. Faster R-CNN은 작년에 마이크로소프트에서 내놓은 대표적인 컴퓨터 비전 연구 결과 중 하나입니다.

Mask R-CNN

1*BiRpf-ogjxARQf5LxI17Jw

그리고 올해 초 페이스북 AI 팀이 분할된 이미지를 마스킹하는 Mask R-CNN을 내놓았습니다. Faster R-CNN에 각 픽셀이 오브젝트에 해당하는 것인지 아닌지를 마스킹하는 네트워크(CNN)를 추가한 것입니다. 이를 바이너리 마스크binary mask라고 합니다. 페이스북 팀은 정확한 픽셀 위치를 추출하기 위해 CNN을 통과하면서 RoIPool 영역의 위치에 생기는 소숫점 오차를 2D 선형보간법bilinear interpolation을 통해 감소시켰다고 합니다. 이를 RoIAlign이라고 합니다. 그래서 아래와 같은 멋진 마스킹 이미지가 만들어 집니다.

1*6CClgIKH8zhZjmcftfNoEQ

그런데 아직 감이 잘 안잡히시나요? 조금도 걱정하지 마세요. R-CNN에서 Faster R-CNN까지 자세히 설명해 주시는 아래 이진원님의 동영상을 보시면 해결됩니다! 🙂

Chainer 2.0 & CuPy

파이토치PyTorch와 같이 다이나믹 컴퓨테이션 그래프를 지원하는 체이너Chainer가 2.0 버전을 릴리즈했다는 소식입니다. 2.0 버전에서 깃허브 주소를 바꾸었으며 강화학습, 분산, 비전에 관한 패키지를 분리하였습니다. 자세한 내용은 체이너 문서와 깃허브 릴리즈 노트를 참고하세요.

$ pip install chainer

또한 넘파이NumPy 스타일의 행렬 연산을 GPU를 사용하여 처리할 수 있는 CuPy를 체이너에서 분리하여 공개하였습니다(즉 체이너에서 GPU를 사용하려면 cupy를 설치해야 합니다). 넘파이를 쓰듯 CuPy를 써서 자기만의 연산을 만든다면 재미있을 것 같습니다. CuPy도 pip를 사용하여 쉽게 설치할 수 있습니다.

$ pip install cupy

파이토치도 더욱 많이 넘파이 스타일을 지원하려고 준비중이며 윈도우즈 지원도 곧 가능할 것 같습니다.

Microsoft CNTK 2.0 Release

마이크로소프트가 CNTK 2.0(Cognitive Toolkit) 버전이 정식 출시되었다고 블로그를 통해 알렸습니다. CNTK 2.0 버전은 파이썬과 C++, 자바 API를 지원하며 윈도우즈와 리눅스 설치 바이너리를 제공하고 있습니다. 2.0 버전에서는 케라스Keras를 지원하는 기능이 추가되었습니다. 아마도 텐서플로우나 파이토치 등을 따라 가려면 서드파티에 대해 더욱 적극적으로 대응할 것 같습니다. 자세한 내용은 깃허브문서를 참고해 주세요.

바이너리가 PyPI에 등록되어 있지는 않지만 pip 명령을 사용하여 간단히 설치할 수 있습니다. 파이썬 2.7, 3.4, 3.5, 3.6 버전을 지원합니다. 특이한 점은 마이크로소프트에서 만든 1bit-SGD 기능을 지원하는 바이너리가 별도로 빌드되어 있다는 점입니다.

$ pip install ~.whl
  • 리눅스
2.7 CPU-Only https://cntk.ai/PythonWheel/CPU-Only/cntk-2.0-cp27-cp27mu-linux_x86_64.whl
GPU https://cntk.ai/PythonWheel/GPU/cntk-2.0-cp27-cp27mu-linux_x86_64.whl
GPU-1bit-SGD https://cntk.ai/PythonWheel/GPU-1bit-SGD/cntk-2.0-cp27-cp27mu-linux_x86_64.whl
3.4 CPU-Only https://cntk.ai/PythonWheel/CPU-Only/cntk-2.0-cp34-cp34m-linux_x86_64.whl
GPU https://cntk.ai/PythonWheel/GPU/cntk-2.0-cp34-cp34m-linux_x86_64.whl
GPU-1bit-SGD https://cntk.ai/PythonWheel/GPU-1bit-SGD/cntk-2.0-cp34-cp34m-linux_x86_64.whl
3.5 CPU-Only https://cntk.ai/PythonWheel/CPU-Only/cntk-2.0-cp35-cp35m-linux_x86_64.whl
GPU https://cntk.ai/PythonWheel/GPU/cntk-2.0-cp35-cp35m-linux_x86_64.whl
GPU-1bit-SGD https://cntk.ai/PythonWheel/GPU-1bit-SGD/cntk-2.0-cp35-cp35m-linux_x86_64.whl
3.6 CPU-Only https://cntk.ai/PythonWheel/CPU-Only/cntk-2.0-cp36-cp36m-linux_x86_64.whl
GPU https://cntk.ai/PythonWheel/GPU/cntk-2.0-cp36-cp36m-linux_x86_64.whl
GPU-1bit-SGD https://cntk.ai/PythonWheel/GPU-1bit-SGD/cntk-2.0-cp36-cp36m-linux_x86_64.whl
  • 윈도우즈
2.7 CPU-Only https://cntk.ai/PythonWheel/CPU-Only/cntk-2.0-cp27-cp27m-win_amd64.whl
GPU https://cntk.ai/PythonWheel/GPU/cntk-2.0-cp27-cp27m-win_amd64.whl
GPU-1bit-SGD https://cntk.ai/PythonWheel/GPU-1bit-SGD/cntk-2.0-cp27-cp27m-win_amd64.whl
3.4 CPU-Only https://cntk.ai/PythonWheel/CPU-Only/cntk-2.0-cp34-cp34m-win_amd64.whl
GPU https://cntk.ai/PythonWheel/GPU/cntk-2.0-cp34-cp34m-win_amd64.whl
GPU-1bit-SGD https://cntk.ai/PythonWheel/GPU-1bit-SGD/cntk-2.0-cp34-cp34m-win_amd64.whl
3.5 CPU-Only https://cntk.ai/PythonWheel/CPU-Only/cntk-2.0-cp35-cp35m-win_amd64.whl
GPU https://cntk.ai/PythonWheel/GPU/cntk-2.0-cp35-cp35m-win_amd64.whl
GPU-1bit-SGD https://cntk.ai/PythonWheel/GPU-1bit-SGD/cntk-2.0-cp35-cp35m-win_amd64.whl
3.6 CPU-Only https://cntk.ai/PythonWheel/CPU-Only/cntk-2.0-cp36-cp36m-win_amd64.whl
GPU https://cntk.ai/PythonWheel/GPU/cntk-2.0-cp36-cp36m-win_amd64.whl
GPU-1bit-SGD https://cntk.ai/PythonWheel/GPU-1bit-SGD/cntk-2.0-cp36-cp36m-win_amd64.whl

Keras Cheat Sheet

keras-cheatsheet

일전에 데이터캠프(datacamp.com)에서 만든 치트 시트 시리즈를 소개했었습니다. scikit-learn, numpy, pandas, scipy, matplotlib에 이어 이제는 케라스(Keras)의 치트 시트도 나왔습니다! 🙂

최근에는 케라스에 MXNetCNTK를 백엔드로 지원하기 위한 작업이 진행되고 있습니다. 이렇게 되면 래퍼(wrapper) 라이브러리의 지존이 되겠군요. 케라스 책으로는 처음 팩트(packtpub)에서 ‘Deep Learning with Keras‘가 출간되었습니다. 이 책도 읽고 나서 간단히 리뷰해보도록 하겠습니다.

TensorFlow 1.2.0 RC1 Release

텐서플로우 1.2.0 RC1이 릴리즈되었습니다. 1.0 버전 이후에도 여전히 빠른 속도로 버전 업그레이드가 되고 있네요. 이번 버전에서 바뀐 자세한 내용은 이전 포스트와 릴리즈 노트를 참고하세요.

1.2.0 RC1 버전이 이미 PyPI에 등록되어 있기 때문에 pip 명령으로 간단하게 설치할 수 있습니다. 텐서플로우 바이너리는 64bit 용이며, 윈도우즈에서는 파이썬 3.5 버전만을 지원합니다.

$ pip install --upgrade tensorflow

$ pip install --upgrade tensorflow-gpu

Automatic Batching

스크린샷 2017-05-26 오후 4.49.42

다이나믹 컴퓨테이션 그래프를 만들어주는 대표적인 딥러닝 프레임워크인 DyNet에서 미니배치 자동화 기능을 선보였습니다. DyNet 레파지토리에 있는 샘플 예제페이퍼로 설명하고 있습니다. 입력 데이터가 모두 균일한 크기일 때는 미니 배치 처리를 하는 것이 큰 일이 아니지만 그렇지 않은 경우에는 코드 구조를 복잡하게 만듭니다. “배치는 개발자의 책임이 아니라 프레임워크의 몫이다!”라고 이 페이퍼에서 말합니다. 🙂

위 왼쪽 그림을 보면 입력의 길이가 4개, 2개, 3개로 나뉘어진 입력 시퀀스를 오른쪽의 그림과 같이 알아서(!) 배치로 구성해 실행해 줍니다. 엔지니어는 왼쪽의 그림을 생각하면서 작성을 하되 손실이나 예측 값을 받을 그릇을 스칼라 변수가 아니라 리스트 변수로 넉넉히 여유를 잡아주면 됩니다. 배치로 처리해서 리스트에 담는 것은 프레임워크가 책임집니다. 아마도 이런 자동 배칭 기능은 정적 그래프를 지원하는 텐서플로우에는 꽤 아픈 곳을 찌르는 일이 될 것 같습니다. DyNet의 작업이 공개되자 파이토치(PyTorch)도 기능을 추가한다는 소식입니다.

(페이퍼 저자 중 한 사람인 Yoav Goldberg 교수가 최근에 NLP 책을 출간했습니다. 한번 읽어 보고 싶네요. ㅠ.ㅠ)

PyCon 2017

스크린샷 2017-05-22 오후 12.01.28

지난 주 캘리포니아 구글 마운틴뷰에서 구글 IO 2017이 열렸습니다. 많은 사람들의 관심이 구글 IO에 집중될 때 바로 그 위 오레건 주에서는 파이콘 2017이 같이 시작됐습니다. ^^ 파이콘이 구글 IO처럼 라이브 스트림되지는 못하지만 벌써 유투브에 튜토리얼과 토크 동영상이 올라왔습니다! 파이콘 유투브 채널에서 데이터 사이언스와 관련있는 것을 추려 보았습니다. (파이콘 코리아 2017도 8월에 열립니다)

TensorFlow 1.2.0 RC0 Release

텐서플로우 1.2.0 RC0 버전이 릴리즈되었습니다. 주의해야할 사항은 버전 1.1.0에서 변경된 RNNCell이 다시 변경된 점입니다.

1.1.0 버전에서는 이전처럼 MultiRNNCell([lstm] * 5) 쓰면 가중치를 공유하지 못한다고 에러가 발생했습니다. 그래서 1.1.0 버전에서 RNN 코드를 MultiRNNCell([LSTMCell(...) for _ in range(5)]) 와 같이 써야했습니다. 텐서플로 첫걸음의 RNN 코드도 이를 반영하여 변경되었습니다. 이번 1.2.0 버전에서는 두 가지 경우를 모두 허용합니다. 전자의 경우 동일한 가중치가 공용되고 후자의 경우 각각의 가중치를 가지게 됩니다. 따라서 텐서플로우 1.0.1 버전에서 바로 1.2.0 으로 업그레이드할 때 코드의 동작방식이 완전히 달라지므로 주의해야 합니다.

입력 파이프라인을 위한 tf.contrib.data API 가 추가되었고 텐서보드의 새 버전이 포함되었다고 합니다. 그외 이번 버전에서 바뀐 자세한 내용은 릴리즈 노트를 참고하세요.

1.2.0 RC0 버전이 이미 PyPI에 등록되어 있기 때문에 pip 명령으로 간단하게 설치할 수 있습니다. 텐서플로우 바이너리는 64bit 용이며, 윈도우즈에서는 파이썬 3.5 버전만을 지원합니다.

$ pip install --upgrade tensorflow

$ pip install --upgrade tensorflow-gpu