스마트 포인터

프로그래밍/C/C++ 2014. 11. 28. 03:31

동적 메모리 할당 과 해제에서 개발자의 실수로 메모리 누수(memory leak) 등이 발생하는 확률이 높다.

프로그램 규모가 커질수록 클래스의 내부 멤버들이 많아지고, 이를 동적 메모리로 할당해서 관리하면,

new와 delete를 자주 사용하게 된다. new로 할당받은 객체속 메모리는 반드시 delete로 해제하여야 한다.

그렇지 않으면 메모리 누수가 발생하게 된다.


C++11 표준에서 소개하는 스마트 포인터를 사용하면 편리하게 메모리 누수를 관리할 수 있다.


예제1. 스마트포인터 auto_ptr 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <memory>
#include <string>
using namespace std;
 
class food
{
    string name; // 이름
    int price; // 가격
 
public:
  // 생성자
    food(string _name, int _price){        
        this->name = _name;
        this->price = _price;
        cout << "생성자 호출" << endl;
    }
  // 소멸자
    ~food() {
        cout << "소멸자 호출" << endl;
    }
  
  // 정보 출력
    void printData() {
        cout << "name = " << this->name << ", price = " << this->price << endl;
    }
};
 
int main()
{
    auto_ptr<food> test(new food("apple", 30));
    test->printData();
    return 0;
}


결과


스마트 포인터 auto_ptr를 이용한 동적메모리 할당에서는 개발자가 따로 delete를 하지 않아도 

소멸자를 호출하면서 할당된 메모리를 자동으로 해제한다.


만약 동일 객체를 두 개의 포인터로 가리키게 하면 두 개의 포인터 각각의 메모리를 해제하였을 때,

중복으로 메모리를 해제하는 경우가 발생해 오류가 발생하게 된다.


메모리를 자동으로 해제해 주는 auto_ptr를 사용하면 편리하지만 한편으로는 개발자에게 매우 위엄한 상황이

발생되기도 한다. 엄밀히 말하면 C++11 표준에서는 auto_ptr 사용을 권고하지 않는다. 그렇다면 해결책이 없는것일까?


이 경우 unique_ptr를 사용하면 된다.


unique_ptr는 C++11 표준에서 사용할 수 있는 스마트 포인터이다.

unique_ptr는 auto_ptr와 유사하게 가리키는 객체의 소유권을 그대로 강조하지만, 메모리 중복 해제로

인한 런타임 오류가 발생하지는 않는다. 컴파일러가 미리 이런 오류를 처리해 준다.


unique_ptr를 사용하여 어느 정도 스마트 포인터의 요구 사항을 충족하긴 했지만, 

하나의 객체를 여러 스마트 포인터로 가리키길 원할 수 있다.

이 경우 컴파일 타임이나, 런타임에서 오류 없는 스마트 포인터를 C++11에서 제공한다.

shared_ptr라는 스마트 포인터를 사용하면 된다.




'프로그래밍 > C/C++' 카테고리의 다른 글

c++ strtok  (0) 2014.12.13
메모리 관리 함수(memset, memcpy, memmove)  (0) 2014.10.24
C++ 파일 입출력  (0) 2014.02.24
함수 주요 형태(_stdcall, _cdecl, _fastcall)  (0) 2014.02.24
비트 연산자  (0) 2014.02.12

우분투 관리자 권한 얻기(su)

카테고리 없음 2014. 11. 21. 15:41

우분투 터미널에서 관리자 권한을 얻는 방법은 터미널

 

$ sudo passwd root 

를 입력한 뒤 새로운 root 비밀번호를 입력한다.


입력한뒤 터미널 창에서 

$ su

를 입력하면 압호를 요구한다.

이때 위에서 작성한 암호를 입력하면 프롬프트가 #으로 변경된다.


ubuntu cuda toolkit 6.5 우분투 cuda toolkit

카테고리 없음 2014. 11. 20. 20:28
sudo apt-get remove nvidia-cuda-*  # remove old nvidia-cuda packages

sudo dpkg -i cuda-repo-ubuntu1404_6.5-14_amd64.deb 

sudo apt-get update

sudo apt-get install cuda


리눅스(우분투) tar.gz 압축 해제

카테고리 없음 2014. 11. 17. 22:44

<압축 풀기>

1. tar.gz 압축 풀기

   $ gunzip 파일이름.tar.gz     // tar.gz 에서 gz를 압축 해제함

   $ tar vcf 파일이름.tar         // tar를 압축 해제 (x : 압축 풀기, v : 압축푼 상태 확인, f : 파일 이름)


2. tar.gz 한번에 압축 풀기

    $ tar xvzf 파일이름.tar.gz


<압축 하기>

3. tar.gz 압축하기

    $ tar cvf 파일이름.tar 파일1    // 파일1의 폴더나 파일을 파일이름.tar로 묶음(압축하는것은 아님)

    $ gzip 파일이름.tar               // 파일이름.tar을  파일이름.tar.gz  로 압축한다.(압축완료)


4. tar.gz 한번에 압축하기

    $ tar cvzf 파일이름.tar.gz 파일1   // 파일1의 폴더나 파일을 파일이름.tar.gz로 묶어서 압축한다.



Multinomial Logistic Regression(다항 기호 논리학 회귀)

수학 2014. 11. 17. 19:26

통계학에서, Multinomial Logistic Regression(다항 기호 논리학 회귀)는 분류하는 방법중 하나로써, 다차원 

문제를 논리적으로 일반화 시킨다. 


독립 변수들의 집합이 주어졌을때, 절대적 분산, 종속 변수의 다른 결과를 예측하는데 사용하는 모델이다.

'수학' 카테고리의 다른 글

최소자승법(Least Sequence Method)  (0) 2015.05.23
내리막 경사법(gradient descent method)  (0) 2014.11.03
베이즈 정리(베이지언 확률)  (0) 2014.10.24
분산과 표준편차 구하기  (0) 2014.10.17
고유값, 고유벡터  (0) 2014.10.14

딥러닝 김정희

카테고리 없음 2014. 11. 17. 17:40

우분투 환경변수 추가

카테고리 없음 2014. 11. 11. 18:48

home 디렉토리에서 

$ vi ~/.bash_profile, nano ~/.bash_profile

vi ~/.profilenano ~/.profile


$ nano ~/.bashrc

파이썬 argparse

프로그래밍 2014. 11. 8. 21:51

파이썬 argparse 


# parse 선언

 parser = argparse.ArgmentParser(description = 'description')


# parse 인수 추가

 parser = add_argment('dirname', type = valid_dirname)


# parse_args() 메소드를 통해 ArgmentParser 인수 분석

 args = parser_parse_args()


'프로그래밍' 카테고리의 다른 글

안드로이드 가상 머신 지니모션(Genymotion) 설치  (0) 2015.04.09
멀티 스레드  (0) 2014.12.13
[STL] List  (0) 2014.03.06
[STL] Vector  (0) 2014.03.05
PHP document  (0) 2014.02.23

SVM(Support Vector Machine)

패턴인식 & 기계학습 2014. 11. 4. 20:11

SVM(Support Vector Machine)에 대해 알아보자.

이전에는 신경망을 통해 2차원 데이터 셋을 분류해본 적이 있다. (신경망 참조)

[그림 1]을 보면 신경망 모델의 한계를 볼수 있다. 1번을 초기로 설정한뒤 점차 오류를 줄여가는 과정에서

2번에 도달하였을 경우 신경망은 오류함수가 0을 가지게 되므로 종료한다. 하지만 3번의 경우가 2번의 경우보다

더 데이터를 더 잘 분류한 경우가 될 것이다.


   [그림 1] 신경망 모델의 한계


학습의 입장에서 보면 2번과 3번 모두 데이터를 잘 분류한 결과가 되지만, 만약에 데이터가 새로 들어올 가능성을

고려한다면 2번의 경우 오류가 생길수 있는 확률이 3번의 경우보다 높다. 분류기 성능으로 본다면 3번의 경우가

좀더 잘 분류된 경우가 될 것이다.


이처럼 SVM은 오류를 최소화 하여 분류하는 것으로 부터 한발짝 더 나아가 분류된 데이터 셋을 고려해

여백(margin)을 최대화 하여 일반화 능력을 극대화 시키는 것을 말한다. 즉, SVM은 최대 여백을 구한다.

첫번째 선형적으로 데이터를 분류할 경우를 고려해 선형 SVM에 대해 정리한다.


1. 선형 SVM

[그림 1]과 같이 이진 분류를 결정하는 초평면 식은 다음과 같이 표현할 수 있다.



[그림 2]를 보면 w가 고정되있을때, b의 값에 따라 직선의 위치가 변화하는것을 관찰할 수 있다.



  [그림 2] w와 b에 따른 분류기의 위치 변화


속이 찬 샘플들(직선에 가까운 것들)은 서포트 벡터(support vector)라고 부른다. 이 벡터들은 직선의 위치에 

직접적인 영향을 끼친다. 결정 직선에서 서포트 벡터 x까지 거리가 1(즉, |d(x)|=1)이 되도록 적당히 크기 조절을

하면 여백을 다음과 같이 쓸 수 있다.



모든 샘플들의 집합을 올바르게 분류한다는 가정 하에 최대 여백을 갖는 초평면(Hyperplane)을 찾으면 된다.



[식2]를 만족하며 [식3]을 최소화 하는 w를 찾으면 된다. 다르게 보면 조건부 최적화 문제이다.

보통 조건부 최적화 문제는 라그랑주 승수(Lagrange multiplier)를 도입하여 해결한다.

(조건부 최적화 : 조건이 정해진 상태에서 최대, 최소를 구하는 문제)

라그랑주 승수법이 잘 정리된 곳을 있어 소개한다. [http://kipid.tistory.com/50#secId1-1]


[식 3]을 라그랑주 함수 L(..)로 표현하면 [식 4]와 같다. 이때 조건식 마다 라그랑주 승수 αi를 부여하였다.



함수 L을 매개변수 w와 b로 미분한 후 그것을 0으로 놓고 KKT(Karush-kuhn-Tucker)조건식을 유도한뒤

그 결과를 Wolfe 듀얼 문제로 변형하면 [식 5]를 얻는다.



즉, [식 5]를 최대화 하는 문제로 바뀐다. [식 5]를 보면 w와 b가 사라졌음을 볼 수 있다.

따라서 w와 b를 구하는 문제가 아니라 라그랑주 승수 α를 구하는 문제가 되었다. 라그랑주 승수를 구하면

그것으로 w와 b를 구하면 된다. 또한 특징 벡터 xi가 혼자 나타나지 않고 두 개의 특징 벡터의 내적인

xi·xj로 나타난다. 


참조 : 컴퓨터비전(오일석)

'패턴인식 & 기계학습' 카테고리의 다른 글

k-means clustering  (0) 2015.02.27
딥러닝 Deep Learning  (0) 2015.02.27
Heap theory(헵 이론)  (0) 2014.11.04
신경망 이론  (0) 2014.11.04
Boltzmann machine(볼츠만 머신)  (0) 2014.11.04

Heap theory(헵 이론)

패턴인식 & 기계학습 2014. 11. 4. 18:00

1949년 캐나다의 심리학자인 Donald Hebb 은 그의 저서인 'The Organization of Behavior' 에서 '헵의 시냅스'라고 알려진 시냅스의 연결강도 조정을 위한 생리학적 학습 규칙을 기술했는데 이 책은 1949년경의 신경심리학에 대해 폭넓고 깊이있게 기술하고 있다. 그는 이 책의 도입 부분에서 복잡한 두뇌 모델링에 대해 '커넥셔니즘(connectionism)'이란 말을 처음으로 사용하였다 .......... "우리는 어떻게 학습하는가?"에 대한 비교적 간단한 학습이론에 대하여 살펴보자. 중심적인 아이디어는 다음과 같다 .........  두 개의 뉴런 A, B 가 서로 반복적이고 지속적으로 점화(firing)하여 어느 한쪽 또는 양쪽 모두에 어떤 변화를 야기한다면 상호간의 점화의 효율 (weight) 은 점점 커지게 된다. ............ 헵의 학습 규칙은 나중에 개발된 다른 신경망 모델들의 학습 규칙의 토대가 된다 .

Hebb 학습법은 1949 년에 D. Hebb 이 처음 제안하였고, 1988 년 T. McClelland 와 D. Rumelhart 에 의해 확장된 학습 방법으로 순방향 신경망에만 적용될 수 있으며, 이진 또는 연속 활성화 함수가 사용될 수 있다. 초기 연결 강도는 모두 0 에 가까운 작은 값으로 하며, 학습 신호로서 출력을 사용하는 점이 특징이다...........

Hebb의 학습 가설에 근거한 Hebbian 학습 규칙은 가장 오래되고 단순한 형태의 학습 규칙이다. 이 규칙은 만약 연접(synapse) 양쪽의 뉴런이 동시에 또 반복적으로 활성화되었다면 그 두 뉴런 사이의 연결강도가 강화된다는 관찰에 근거한다. 수학적으로는 다음 식으로 나타낼 수 있다.



여기서 xi와 yj는 뉴런 i와 j의 출력이고, 이들은 연접 wij에 의해 연결된다. η는 학습률이다. 또 xi는 연접 wij의 입력도 된다. 연접의 변화가 인접한 두 뉴런의 상태에 의해서만 결정되기 때문에 학습은 국부적으로 일어난다.


출처 : http://www.aistudy.com/neural/hebbian_learning.htm

'패턴인식 & 기계학습' 카테고리의 다른 글

딥러닝 Deep Learning  (0) 2015.02.27
SVM(Support Vector Machine)  (0) 2014.11.04
신경망 이론  (0) 2014.11.04
Boltzmann machine(볼츠만 머신)  (0) 2014.11.04
결정 트리 분기  (0) 2014.10.25