pycharm으로 원격 디버깅 하기

Published / by greennuri

https://www.jetbrains.com/help/pycharm/remote-debugging.html

https://www.jetbrains.com/help/pycharm/remote-debugging-with-pycharm.html#remote-interpreter

jetbrain의 pycharm은 여러가지 기능이 많은데 그중에

최근에 알게된 원격 디버깅을 잠시 소개

이 기능은 쓰고 있는 컴퓨터의 파이썬이 아니라

원격지에 있는 (아마 주로 서버) 파이선을 이용해서 디버깅을 수행 할 수 있게 해주는 기능이다.

상용 방법은 간단하다

prefenrence -> project -> project interpreter에서
project interpreter에서 원격지에 있는 인터프리터를 설정 하면되는데

이 설정과 ssh tunneling을 활용하면 상당히 편리하다

나중에 좀더 고칠 예정..

액티베이션 함수 정리 링크

Published / by greennuri

기계학습에서 학습을 위해서 코스트 함수를 정의하고
그 값이 작게 하기 위해서 최적화를 수행한다

일반적으로 가장 기본이 SGD(stochastic Gradient Descent)인데, SGD를 쓰는 이유는 지도학습에서 입력 되는 모든 데이터를 가지고 만든 커브에서 최적화를 하기위해 Gradient Descent(경사하강법)을 쓰면 되지만, 모든 데이터를 다 메모리에 올리고 코스트를 구하는건 엄청난 물리적으로 어렵다(100만 이상 이미지에서 10103에 네트워크 깊이만큼 용량이 커지면, 요즘 나오는 그래픽카드에 다 올리는건 어렵다… 용량이 넘사벽.. )

그래서 보통 딥러닝 학습을 할때 mini-batch를 수행한다.
mini-batch는 학습 하고자 하는 전체 데이터를 샘플링해서 모집단을 충분히 반영 가능한 작은 데이터를 추출해서 학습을 반복 수행한다.

SGD는 미니배치 단위로 GD(경사하강법)을 수행한다. 전체 데이터에 대한 GD(경사 하강법)에 비하면 오차가 있지만, 미니배치를 반복 수행하면서 전체 데이터로 만들어 지는 GD값에 수렴한다고 한다.(cs231n 3,6,7강 참고)

그런데 SGD는 1-st order optimization(1차 미분 최적화)중에서 가장 간단해서, local minima, saddle point라는 함점에 빠지기 쉽다.

그래서 이러한 함정에서 빠져 나오기 위해 관성(momentum)을 적용한 것이 momentum Optimizer이고, momentum 적용을 다른 방법으로 적용한게 Nesterov 모멘텀 (Nesterov Momentum)이다.

그리고 Momentum외 다른 여러가지 방법으로 최적화 방식을 만들어 낸게 adam, rmsprop, adadelta 등등이 있다.
(링크)[http://shuuki4.github.io/deep%20learning/2016/05/20/Gradient-Descent-Algorithm-Overview.html]참고

워낙 설명 잘 된 자료가 많아서.. 링크만 몇개 올림.

(최적화기법의 직관적 이해)[http://darkpgmr.tistory.com/149]

우분투 새로 설치하고 tensorflow 설치하기

Published / by greennuri

기계학습용으로 우분투를 새로 설치하고 tensorflow 설치 하는 과정

차후에 사용하기 위한 내용 요약

이곳에서 우분투를 다운로드

왠만하면 LTS 버젼으로 다운로드 받고, 경우에 따라서 Server나 Desktop 버젼을 다운로드한다.
Server버젼은 Desktop 그러니깐  UI가 없는 버젼. 
Desktop이 설치되어 있더라도 로컬에서 데스크탑으로 쓰지 않으면 그래픽 메모리 손실은 발생하지 않는듯. 

부팅 이미지 만들기

참조 링크

간략 정리
1. iso 이미지를 맥용 이미지로 변환 
    ./hdiutil convert -format UDRW -o ~/desktop/ubuntu.img ~/desktop/download.iso

2. usb를 언마운트
    diskutil unmountDisk /dev/disk[번호]

3. usb에 저장 이미지 업로드 
    sudo dd if=~/desktop/ubuntu.img of=/dev/disk[번호] bs=1m

nvidia 그래픽 드라이브 설치

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
sudo apt-get install nvidia-last

위 절차대로 제대로 깔리면 nvidia-smi 명령어를 실행 시키면 그래픽 카드 종류와 메모리 용량이 표시 됨

리눅스에 개발환경 설치

sudo apt-get install 'Development Tools'
sudo apt-get install python-dev
sudo apt-get install git # git 

anacoda 설치

    우분투에 python이 이미 있는데도 anaconda를 설치 하는 이유는 시스템에 영향을 줘서 시스템이 망가지는것을 방지 하기 위해서...
    anaconda는 이곳에서 (다운로드)]https://www.anaconda.com/download/#macos
    anaconda 설치후 가상 환경 만들기 
    conda create --name $ENVIROMENT_NMAE $PREINSTALL_PACKAGES 
    $ENVIROMENT_NAME : 가상환경 이름 
    $PREINSTALL_PACKAGES : 기본 설치할 패키지명 
    
    conda create --name tf tensorflow-gpu 
    위와 같이 입력 하면 tf라는 이름의 가상환경이 만들어지고 기본으로 tensorflow-gpu가 설치됨. 
    
    conda 가상 환경을 쓰면 좋은 점 [링크](https://graspthegist.com/post/learn-conda-1/)
    

필수 패키지 설치

    필수 패키지를 설치 하기전 가상 환경으로 진입.
    source activate $ENVIROMENT_NAME
    conda install opencv #opencv 설치 
    conda install nltk #nltk 설치
    그외 여러 패키지 설치 

CNN. week1 Edge Detection Example

Published / by greennuri / Leave a Comment

앤드류응 교수의 코세라 강의 CNN 정리.
week 1.
Edge Detection

Edge Detection

CNN에서 가장 처음인 Edge Detection에 대한 설명.

수직 경계선 추출

왼쪽의 임의의 6,6 이미지(그레이)에 3,3 필터를 콘볼루션 시키면 4,4가 나옴.
3,3 필터를 보면 1열이 1이고, 2열이 0이고 3열이 -1, 수직으로 경계선을 추출하기 위한 수직 경계선 추출 필터

좌측에 필터를 적용해서 결과를 오른쪽 행렬에 반영한 결과가 보인다

기계학습 평가 척도. precision recall

Published / by greennuri / Leave a Comment

엄태웅님의 youtube 링크

여기서는 preision, recall에 대한 설명 보다 왜 이런 평가 지표를 쓸가에 대해서 잘은 모르지만 최대한(제 나름) 설명 하려고합니다.

일반적으로 지도학습(대부분 지도학습 이지만 ^^)에서 성능을 평가 하는 척도는 정확도 (accuracy)인데요.

deep learning이나 machine learning 예제로 나오는 코드 보면 거의 대부분 정확도(acc)라는 지수로 모델의 성능이 좋다 나쁘다를 평가 합니다.

cnn쪽에서는 예외적으로 top-1 error, top-5 error을 쓰는데요 우선 그것은 제외하겠습니다.

acc(정확도)는 고양이 사진 100장, 개 사진 100장 이 있고 고양이 사진은 90장, 개 사진은 90장으로 판별 했다고 볼때, 180(맞춘 전체값) / 200(전체 데이터셋 크기) 해서 90%의 값이 나옵니다

acc(정확도)는 전체 데이터 중에서 정답을 맞춘 비율을 의미합니다.

더 자세한 정의는 여기 참고 하세요

그런데, 고양이랑 개 사진은 애호가가 많아서 인터넷에서 엄청 찾을 수 있는데, 좀 드문 수달도 같이 학습 시켜서 고양이 사진 100장, 개 사진 100장, 수달 사진 10장으로 기계학습을 시켜서 고양이 사진 89장, 개 사진 85장, 수달 사진 1장을 제대로 인식 했다고 하면 전체 인식률은

89(고양이) + 85(개) +1(수달) / 210(전체) = 83.333 약 83% 나옵니다

그런데 수달은 10장 중에 1장만 제대로 인식 했는데 전체 정확도는 83%입니다

뭐가 이상하지 않나요?

문제를 더 간단히 해보면

고양이 사진 90장, 수달 사진 10장으로 어떤 모델을 학습하고,  제대로 인식된 고양이 사진이 80장, 수달 사진이 3장 이면 정확도는

80 + 3 / 100 = 83 % 정확도

수달은 10장 중에 3장만 제대로 뽑아 냈는데, 정확도는 83% ???

이러한 경우는 학습 시키는 데이터의 수량이 비슷하지 않아서 생기는 문제입니다. 이러한 경우 정확도가 아닌 다른 평가 척도를 가져와야 하는데 그중 대표적인데 precision, recall, f1입니다. 자세한 설명은 링크를 통해 들어보세요

설명을 워낙 잘 하셔서 링크로 대신합니다.

 

원문

scikit으로 mnist나 iris 같은 데이터를 지도 학습 시킨다고 할때

어떠한 지도학습 모델에 적용 시키느냐에 따라서 성능(acc)이 차이가 나지만,

동일한 지도학습 모델에서도 파라메터 최적화 여부에 따라서 성능이 더 좋아 지기도 합니다.

여기서는 scikit-learn에서 제공하는 grid_search를 통해 학습 모델 최적화에 대해서 얘기 합니다.

from __future__ import print_function

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import classification_report
from sklearn.svm import SVC

print(__doc__)

# Loading the Digits dataset
digits = datasets.load_digits()

# To apply an classifier on this data, we need to flatten the image, to
# turn the data in a (samples, feature) matrix:
n_samples = len(digits.images)
X = digits.images.reshape((n_samples, -1))
y = digits.target

# Split the dataset in two equal parts
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.5, random_state=0)

# Set the parameters by cross-validation
tuned_parameters = [{'kernel': ['rbf'], 'gamma': [1e-3, 1e-4],
                     'C': [1, 10, 100, 1000]},
                    {'kernel': ['linear'], 'C': [1, 10, 100, 1000]}]

scores = ['precision', 'recall']

for score in scores:
    print("# Tuning hyper-parameters for %s" % score)
    print()

    clf = GridSearchCV(SVC(), tuned_parameters, cv=5,
                       scoring='%s_macro' % score)
    clf.fit(X_train, y_train)

    print("Best parameters set found on development set:")
    print()
    print(clf.best_params_)
    print()
    print("Grid scores on development set:")
    print()
    means = clf.cv_results_['mean_test_score']
    stds = clf.cv_results_['std_test_score']
    for mean, std, params in zip(means, stds, clf.cv_results_['params']):
        print("%0.3f (+/-%0.03f) for %r"
              % (mean, std * 2, params))
    print()

    print("Detailed classification report:")
    print()
    print("The model is trained on the full development set.")
    print("The scores are computed on the full evaluation set.")
    print()
    y_true, y_pred = y_test, clf.predict(X_test)
    print(classification_report(y_true, y_pred))
    print()

# Note the problem is too easy: the hyperparameter plateau is too flat and the
# output model is the same for precision and recall with ties in quality.

위 예제는 원문에 있는 코드를 그대로 가져 왔습니다

예제 코드에서는 svm을 최적화 하는 예제

보통 일반적으로 학습을 하려 하면 다음과 같이 수행.

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.5, random_state=0)
#학습 및 평가 데이터셋 분리 
clf = SVC()
clf.fit(X_train, y_train)
#위 코드를 실행 시키면 주어진 데이터에서 알아서 학습을 수행

위 코드에서 나오는 정확도(acc)는 svc 모델의 초기값을 기반으로 나온 정확도

이걸 grid_search를 통해 다음과 같이 최적화 시킴

# Set the parameters by cross-validation
tuned_parameters = [{'kernel': ['rbf'], 'gamma': [1e-3, 1e-4],
                     'C': [1, 10, 100, 1000]},
                    {'kernel': ['linear'], 'C': [1, 10, 100, 1000]}]

scores = ['precision', 'recall']

for score in scores:
    print("# Tuning hyper-parameters for %s" % score)
    print()

    clf = GridSearchCV(SVC(), tuned_parameters, cv=5,
                       scoring='%s_macro' % score)
    clf.fit(X_train, y_train)

    print("Best parameters set found on development set:")
    print()
    print(clf.best_params_)
    print()
    print("Grid scores on development set:")
    print()
    means = clf.cv_results_['mean_test_score']
    stds = clf.cv_results_['std_test_score']
    for mean, std, params in zip(means, stds, clf.cv_results_['params']):
        print("%0.3f (+/-%0.03f) for %r"
              % (mean, std * 2, params))
    print()

    print("Detailed classification report:")
    print()
    print("The model is trained on the full development set.")
    print("The scores are computed on the full evaluation set.")
    print()
    y_true, y_pred = y_test, clf.predict(X_test)
    print(classification_report(y_true, y_pred))
    print()

tunes_parameters 변수에 해당 모델(여기서는 svc)에서 최적화 시킬 파라메터를 정의 한다.

scores 변수에는 precision, recall 어느 지수를 기준으로 최적화 할지를 지정한것.

위 코드를 수행 하면 precision 기준 최적화 한 셋트(tunes_parameters에 나온 파라메터를 다 대입해서 수행)와 recall 기준 최적화 한 셋트를 수행

grid_search는 위의 그림 중 왼쪽에 해당, 모델을 이루고 있는 하이퍼 파라메터를 그림과 같이 그리드를 구성하고 각각 지점에서 성능을 측정한다.

그리고 scikit_learn에서 최적화 알고리즘중 하나인 random_search는 위 그림 중 오른쪽에 나타난데로, 하이퍼파라메터들을 랜덤하게 골라서 최적화를 수행한다.

 

 

 

jhbot 서비스 약관

Published / by greennuri / Leave a Comment

본 이용 약관에 따라 귀하와 jhbot 간의 계약(‘계약’)이 체결됩니다. 계약을 주의해서 읽어 보시기 바랍니다. 계약 내용을 이해하고 승인함을 확인하려면 ‘동의’를 클릭하십시오.

A. jhbot 서비스 소개

본 계약은 귀하의 jhbot 서비스(‘서비스’) 사용을 규율합니다. 본 서비스를 통해 귀하는jhbot 내 서비스(‘콘텐츠’)를 획득 또는 구독할 수 있습니다.jhbot 서비스는 귀하의 거주 국가(‘본국’)에서 사용할 수 있습니다. 귀하는jhbot 서비스를 사용하려면 호환되는 하드웨어 및 소프트웨어(최신 버전 권장 또는 필수)와 함께 인터넷 연결(요금이 부과될 수 있음)이 필요합니다. jhbot 서비스의 성능은 이러한 요인에 영향을 받을 수 있습니다.

B. jhbot 서비스 사용

귀하는 jhbot 서비스를 무료로 취득할 수 있습니다.

jhbot  서비스를 사용하고 콘텐츠에 액세스하려면 Facebook ID가 필요합니다.

개인 정보

jhbot 서비스 사용에는jhbot의 개인정보 취급방침이 적용됩니다.