반응형

퍼셉트론이란 1957년에 고안된 알고리즘으로 신경망(딥러닝)의 기원이 되는 알고리즘이다.

 

퍼셉트론은 다수의 신호를 입력받아 하나의 신호를 출력한다.

(여기서 신호는 흐른다/안 흐른다 (1이나 0)의 값만을 가질 수 있다.)

 

2개의 입력신호를 받는 퍼셉트론의 예

 

X1과 X2는 입력신호, y는 출력신호, w1, w2는 가중치를 뜻하고 아래 식의 theta는 임계값을 나타낸다.

그리고 그림의 원을 뉴런 혹은 노드라고 부르고 입력신호가 뉴런에 보내질 때는 각각 고유한

가중치가 곱해진다.

 

[식.1]

 

 

그럼 퍼셉트론을 활용한 간단한 문제들을 보자.

 

AND 게이트의 진리표

위의 표는 AND게이트의 진리표를 나타낸 표이다.

이 AND게이트를 퍼셉트론으로 표현해보자.

 

입력은 x1, x2 가 존재하고 출력은 y로 존재한다.

이를 만족하는 매개변수 조합은 무수히 많겠지만 몇가지 예를 통해 이해해보도록 하겠다.

 

(w1, w2, theta) 가 (0.5, 0.5, 0.7) 이라고 가정해보자.

 

첫번째로 x1=0, x2=0 일때

w1x1 + w2x2 = 0 이므로 만족한다.

 

다음 x1=1, x2=0 일때

w1x1 + w2x2 = 0.5  이므로 이는 임계값(theta)보다 작으므로 만족하고

따라서 x1=0, x2=1 일때도 역시 만족할 것이다.

 

마지막으로 x1=1, x2=1 일때

w1x1 + w2x2 = 1 이므로 이는 임계값보다 큰 값이 되고 따라서 1이 출력되도록 된다.

 

따라서 (w1, w2, theta) 를 (0.5, 0.5, 0.7) 로 설정하는 것은 AND게이트를 잘 표현한 것이다.

 

 

 

위의 내용을 구현해보자.

def AND(x1, x2):
    w1, w2, theta = 0.5, 0.5, 0.7
    tmp = x1*w1 + x2*w2
    if tmp <= theta:
        return 0
    elif tmp > theta:
        return 1
    
    
print(AND(0,0))
print(AND(0,1))
print(AND(1,0))
print(AND(1,1))

이와 같이 나타낼 수 있을 것이고 출력결과

 

0

0

0

1

 

이 출력되는 것을 확인할 수 있을 것이다.

 

 

 

 

다음으로 위의 [식.1] 을 조금 변형시켜 보도록 하자.

[식.1]의 theta를 (-b) 로 치환시켜보도록 하자.

 

[식.2]

위와 같이 표현할 수 있다.

 

[식.1]과 [식.2] 는 표기방식만 바꿨을 뿐 같은 내용이고 [식.1]에서 theta를 임계값으로 표현하였는데

이제부터 이를 [식.2] 처럼 표시하고 여기서 b를 편향 이라고 하자.

w1과 w2는 여전히 가중치를 의미한다.

 

즉 w1과 w2는 각 입력신호가 결과에 주는 영향력(중요도)을 조절하는 매개변수이고

편향은 뉴련이 얼마나 쉽게 활성화하느냐를 조정하는 매개변수이다.

 

 

NAND 게이트의 진리표
OR 게이트의 진리표

그리고 위와 같은 내용으로 NAND 게이트와 OR게이트가 표현 가능하다.

def NAND(x1, x2):
    x=np.array([x1, x2])
    w=np.array([-0.5, -0.5])
    b=0.7
    
    tmp=np.sum(w*x)+b
    if tmp<=0:
        return 0
    else:
        return 1
    
def OR(x1, x2):
    x=np.array([x1, x2])
    w=np.array([0.5, 0.5])
    b=-0.2
    tmp = np.sum(w*x)+b
    
    if(tmp<=0):
        return 0
    else:
        return 1 

 

 

하지만

위의 경우에는 한계가 존재한다.

 

XOR게이트에 대하여 생각해보자.

XOR게이트의 진리표

 

지금까지 본 퍼셉트론으로는 XOR게이트를 구현할 수 없다.

이를 위해 다층 퍼셉트론  의 개념을 사용하게 되는데

이는 퍼셉트론의 층을 쌓는다고 보면 된다.

 

쉽게말해 AND, OR, NAND 게이트를 조합하여 XOR게이트를 표현하는 것이다.

위의 그림과 같이 NOR게이트를 AND와 NAND, OR 게이트를 이용하여 표현할 수 있고

이를 구현하면 아래와 같다.

def XOR(x1,x2):
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(s1,s2)
    return y

print(XOR(0,0))
print(XOR(1,0))
print(XOR(0,1))
print(XOR(1,1))

그리고 실행 결과

 

0

1

1

0

 

이 출력됨을 확인할 수 있을 것이다.

반응형
반응형

우선 이 포스트는

 

https://webnautes.tistory.com/448

 

Windows에 설치된 VirtualBox 6.0을 사용하여 Ubuntu 18.04 설치하기

Windows에 VirtualBox를 설치하여 가상머신을 생성하고 가상 머신에 Ubuntu를 설치하는 방법을 다룹니다. VirtualBox 6.0 이하는 VirtualBox 5.2를 위한 내용입니다. VirtualBox 5.2 VirtualBox는 크로스 플랫폼(c..

webnautes.tistory.com

 

위의 포스트를 참고로 작성하였다.

 

 

 

 

 

 

http://releases.ubuntu.com/16.04/

 

Ubuntu 16.04.6 LTS (Xenial Xerus)

Select an image Ubuntu is distributed on two types of images described below. Desktop image The desktop image allows you to try Ubuntu without changing your computer at all, and at your option to install it permanently later. This type of image is what mos

releases.ubuntu.com

위의 링크를 통해 64bit의 desktop image download

 

 

그리고 윈도우에서 2개의 OS가 실행될 수 있도록 아래 링크에서 VirtualBox를 다운로드 해준다.

 

https://www.virtualbox.org/

 

Oracle VM VirtualBox

Welcome to VirtualBox.org! News Flash New January 14, 2020VirtualBox 6.1.2 released! Oracle today released a 6.1 maintenance release which improves stability and fixes regressions. See the Changelog for details. New January 14, 2020VirtualBox 6.0.16 releas

www.virtualbox.org

 

Window hosts를 클릭하여 다운로드를 진행한다.

다운로드 완료 후 아래와 같이 실행되는 것을 확인할 수 있다.

 

상단부에 파란색 멍게같이 생긴 "새로 만들기" 를 클릭한 후 아래와 같이

설치할 우분투의 이름을 "이름" 부분에 작성하여 준다.

 

 

메모리(RAM)은 2G 정도로 지정해준다.

 

"지금 새 가상 하드 디스크 만들기" 를 진행하도록 한다.

 

 

 

그 다음 화면에서 "VDI" 를 선택하여 진행하도록 한다.

VHD는 마이크로소프트의 가상하드 디스크 기본 파일 포맷이며

VMDK는 VMware 의 가상하드 디스크 기본 파일 포맷이라고 한다.

 

 

다음 화면에서 하드 드라이브를 동적으로 할당할지, 고정된 크기로 할당할지 정하게 된다.

속도를 생각하면 "고정크기", 향후 디스크용량에 대하여 변경할 필요가 있을 것 같으면 "동적할당" 선택

 

그리고 나는 10GB의 크기로 설정하여 고정크기로 생성해 주었다.

 

 

 

 

마지막으로 "설정" 탭의 "고급" 으로 들어가 아래와 같이 "클립보드 공유" 와 "드래그 앤 드롭"을 양방향으로 설정하여 준다.

 

 

그리고 다시 "설정" 탭의 "시스템" 부분에서 아래와 같이 설정하여 준다.

부팅 순서에서 플로피디스크와 광디스크는 사용하지 않을 것 이므로 체크를 해제해주었다.

 

 

"프로세서"탭으로 이동하여 사용할 CPU의 갯수를 지정하여주고 실행제한을 설정하여 준다.

 

 

"가속"탭을 통해 그래픽 부분을 설정하여 준다.

 

 

이제 "저장소" 탭을 이용하여 CD모양의 + 아이콘을 클릭하여 주고 다운받은 우분투의 ISO이미지를 삽입.

 

 

그리고 "오디오" 탭의 오디오 입력 사용하기 를 체크하여 준다.

 

 

 

그럼 이제 "시작"을 눌러주도록 하자.

반응형
반응형

우선 우분투 환경에서 C++파일을 컴파일 해주기 위해 필요한 g++ 프로그램을 다운받는다

$ sudo apt-get install g++

 

그리고 본인이 c++ 파일을 만들기 희망하는 디렉터리로 이동한 후

$ gedit [파일명].cpp

( $ gedit Test.cpp )

위의 코드를 입력하면 gedit창이 뜨게 되는데 여기에 코드를 작성하여 준다.

 

#include <iostream>

using namespace std;

 

int main(void)

{

    cout<<"Hello World!\n"<<endl;

    return 0;

}

 

코드를 작성하였으면 Ctrl+s 를 눌러 저장을 실행하고 이에 따라 위에서 지정한 디렉터리에 Test.cpp파일이 생성됨을

확인할 수 있다.

 

$ g++ [파일명].cpp

( $ g++ Test.cpp )

 

위의 코드를 입력하면 컴파일이 완료된 후 디텍터리에  a.out  이라는 실행파일이 생성되게 된다.

 

그러면 ./a.out  을 통해 실행시켜보자.

 

반응형
반응형

$ sudo apt-get install terminator

 

위의 코드를 입력하면 다운을 시작하게 되고 이를 완료하면

 

$ termintor    을 입력하여 프로그램을 실행한다.

 

* 수평분할 : Ctrl + Shift + O

 

* 수직분할 : Ctrl + Shift +  E

 

* 다음 창 활성화 : Ctrl + Tab   or   Ctrl + Shift + N

 

* 이전 창 활성화 : Ctrl + Shift + Tab  or  Ctrl + Shift + P

 

* 현재 활성화 된 창 닫기 : Ctrl + Shift + W

 

* 터미네이터 종료 : Ctrl + Shift + Q

 

* 전체화면 : F11

반응형
반응형

우선 ctrl+alt+T 를 통해 터미널창을 띄워주도록 한다.

그리고 본인이 C파일을 생성하고자 하는 디렉터리로 이동하여 주도록 한다.

 

디렉터리로 이동하였으면

$ gedit [파일명.c]  를 입력하여 준다.   (ex)  $ gedit Test.c

 

그러면 메모장과 같은 창이 뜨게 되는데 이 부분에 코드를 작성하도록 한다.

 

#include <stdio.h>

 

int main()

{

   printf("Hello World \n");

   return 0;

}

 

그리고 ctrl+s 를 눌러 저장하게 되면 아까 지정한 디렉터리에 C파일이 생성되었음을 확인할 수 있다.

 

그 후 gedit 창을 닫고

$ gcc -o [실행파일명] [소스코드명]       을 입력하여 준다.

$ gcc -o Test Test.c

 

그러면 아까 그 디렉터리에 Test 라는 이름의 실행파일이 생긴것을 확인할 수 있다.

 

그럼 $ ./Test  를 입력하여 그 실행파일을 실행시켜보도록 한다.

 

반응형
반응형

보통 클래스를 선언하고 내용을 작성할때 

 

class Car
{
public:
	int speed;
    ..
    int getSpeed()
    {
    	return speed;
    }
    ..
}

위의 형태로 speed라는 멤버변수를 선언하여주고 getSpeed라는 함수를 이용하여 speed의 값을

받아오도록 했다.

이러한 형태를 함수의 내부정의라고 한다.

 

하지만 위와 같은 경우는 함수의 코드 내용이 길어지게 되면 코드를 이해하는데 굉장히 번거로워 질 수 있다.

 

따라서 우리는 멤버함수의 외부정의를 통하여 코드를 좀 더 가독성있게 정리할 수 있다.

 

class Car
{
private:
	int speed;
    int gear;
    string color;
public:
	int getSpeed();
    void setSpeed(int s);
};

int Car::getSpeed()
{
	return speed;
}

void Car::setSpeed(int s)
{
	speed = s;
}

위와 같은 형태를 함수의 외부정의라고 한다.

 

처음에 보여줬던 코드에서 getSpeed()와 setSpeed(int s) 함수를 외부로 꺼내온 형태를 확인할 수 있다.

 

또한 클래스를 생성할 때 헤더파일을 통해 코드를 간단히 할 수 있다.

 

 

우클릭 -> 추가 -> 클래스   를 통해 클래스를 만들어 줄 수 있다.

 

다음와 같이 클래스 추가 창이 뜨게되면 Car 클래스를 생성해 주도록 한다.

이 과정을 통해 Car라는 클래스가 생성되며 Car.h 라는 헤더파일과 Car.cpp 라는 파일이 생성되게 된다.

 

여기서 Car.h의 헤더파일에는 Car 클래스를 사용하는데 필요한 Car 클래스 선언이 들어간다.

그리고 Car.cpp 에는 멤버함수들의 몸체가 들어가게 된다.

 

 

헤더파일은 간단하게 위와 같다.

멤버변수인 speed 와 gear을 선언하여 주었고 멤버함수은 getSpeed()와 setSpeed(int s)의 함수를

선언만 해주었다.

 

함수의 내용과 정의는 헤더파일 부분에 포함되어 있지 않다.

 

 

위의 사진은 Car.cpp 파일의 내용이다.

헤더파일에서의 멤버함수와 멤버변수를 사용하기에 Car.h 파일을 include 해준다.

그리고 멤버함수의 내용들을 작성해준다.

 

이렇게 함으로서 헤더파일에는 선언의 내용만을 담게되고 cpp파일에는 정의 부분을 담게 되기에

코드를 이해하는데 한결 쉬워질 수 있다.

 

그리고 main문을 위와 같이 작성하여 주면 차의 속도가 출력되는 것을 확인할 수 있다.

 

반응형

'C++' 카테고리의 다른 글

TCP/IP 통신으로 이미지 파일 전송  (0) 2020.10.12
객체지향언어  (0) 2020.01.08
반응형

내 컴퓨터의 속성에서 [설정변경]을 클릭한 후 [고급] 탭의 [환경변수] 를 클릭하여 준다.

그리고 시스템 변수의 PATH 항목에서 opencv의 dll 파일들이 있는 곳의 위치를 지정해준다.

나는 C드라이브에 opencv 디렉토리를 지정하였으므로 

C:\opencv\build\x86\vc11\bin    의 위치로 지정해 주었다.

 

그 후 비주얼 스튜디오를 통해 빈 프로젝트를 만들어주고 프로젝트 설정 창을 띄운다.

 

C/C++ 에서 [추가 포함 디렉토리]를 통해 경로를 지정해주게 되는데 여기에서는 다음과 같이 3개의 경로를 지정해준다.

여기서 [include] 부분까지 진행되는 1개만 설정해줘도 이상은 없다.

 

[링커] 탭의 [일반] 을 통해 [추가 라이브러리 디렉터리] 를 설정해주도록 하게 되는데

여기서는 c:/ opencv / build/ x86 / vc11 / lib 의 경로를 지정해 주었다.

 

마지막으로

[링커]의 [입력] 탭에서 [추가 종속성] 을 통해 다음의 내용을 추가해주자.

 

opencv_calib3d249d.lib
opencv_contrib249d.lib
opencv_core249d.lib
opencv_features2d249d.lib
opencv_flann249d.lib
opencv_gpu249d.lib
opencv_highgui249d.lib
opencv_imgproc249d.lib
opencv_legacy249d.lib
opencv_ml249d.lib
opencv_nonfree249d.lib
opencv_objdetect249d.lib
opencv_ocl249d.lib
opencv_photo249d.lib
opencv_stitching249d.lib
opencv_superres249d.lib
opencv_ts249d.lib
opencv_video249d.lib
opencv_videostab249d.lib

 

이렇게 되면 환경설정이 완료되었고 이미지를 띄워봄으로서 잘 되는지 확인해보자.

 

#include<opencv\highgui.h>

int main(int argc, char** argv)
{
IplImage* img = cvLoadImage("c:/opencv/lena.jpg");
cvNamedWindow("ex1", CV_WINDOW_AUTOSIZE);
cvShowImage("ex1", img);

cvWaitKey(0);

cvReleaseImage(&img);
cvDestroyWindow("ex1");

return 0;
}

반응형
반응형

C++의 가장 큰 특징을 흔히 객체지향언어 라고 표현한다.

 

객체는 어떠한 상태나 특징값을 말한다.

 

예를 들어 자동차 객체의 경우 속성(특징값)은 차종, 색상, 기어, 연비  등이 될 것이다.

자동차 객체의 상태는 출발하기, 멈추기, 감속하기, 가속하기 등이 될 것이다.

 

객체는 어떠한 상태나 특징값을 갖고있다.

 

예를 들어 자동차 객체의 경우 속성(특징값)은 차종, 색상, 기어, 연비 등이 될 것이다.

자동차 객체의 상태는 출발하기, 멈추기, 감속하기, 가속하기 등이 될 것이다.

객체에 값을 보내주는 과정 즉 멤버함수를 호출하는 과정을 "메시지를 전달한다" 고 표현한다.

 

그리고 같은 종류의 객체는 다양하게 존재할 수 있다.

즉 위의 과정에서 객체를 자동차에 비유하였고 상태와 속성을 갖는다고 얘기하였다.

하지만 자동차는 이 세상에 다양하게 존재한다.

경차, 승용차, 승합차, 트럭, 버스...

따라서 이러한 자동차를 모두 만들 수 있는 자동차의 설계도면을 클래스라고 볼 수 있을 것이다.

 

다르게 설명해보면 자동차라는 클래스 안에 승용차, 경차, 승합차 등의 객체가 존재한다고 볼 수 있을 것이다.

 

구조체화 클래스가 헷갈릴 수 있다.

 

영상처리를 할때 사용된 iplimage 구조체를 예를 들자.

iplimage 구조체에는 이미지의 픽셀값을 받아오는 변수, 사이즈를 받아오는 변수, 채널을 받아오는 변수들이

포함되어 있었다.

다시말해 구조체를 통해 속성(특징값) 들을 받아올 수 있었다.

하지만 클래스는 여기에 함수(상태) 가 더해지게 된다.

 

 

#include <iostream>
#include <string>
using namespace std;

class Car{
public:
	int speed;
    int gear;
    string color;
    
    void speedUp(){
    speed += 10;
    }
    
    void speedDown(){
    speed -= 10;
    }
};

int main()
{
	Car myCar;
    
    myCar.speed=100;
    myCar.gear=3;
    myCar.color="red";
    
    myCar.speedUp();
    myCar.speedDown();
    
    return 0;
}

 

위의 내용을 보면 Car이라는 클래스를 만들어 주었고 myCar이라는 객체를 만들어주었다.

그리고 이에 따라 Car의 속성(speed, gear, color)을 지정해주었고 상태또한 멤버함수 호출을 통해 진행하였다.

 

그리고 클래스 내의 변수에 대하여 접근제어를 설정해 주게 되는데 클래스의 멤버변수나 멤버함수에 대하여

Public 으로 설정할지, private으로 설정할지를 결정하는 과정이다.

 

public으로 설정된 멤버변수나 함수는 외부에서 접근이 가능하지만 private의 경우 클래스 내부에서만 접근이 가능하다.

하지만 외부에서도 private 멤어변수를 설정할 수 있도록 할 수 있는데 이때 사용되는 것이 접근자와 설정자이다.

 

 

class Car{
private:
	int speed;
    int gear;
    string color;
    
public:
	int getSpeed(){
    return speed;
    }
    
    void setSpeed(int s){
    speed=s;
    }
    .
    .
    .
}

위의 내용을 확인해보면  private멤버로 speed와 gear을 설정해주지만

public멤버함수로 speed값을 설정해주고 값을 받아오는 과정을 진행할 수 있다.

 

그럼 왜 이렇게 설정자와 접근자로 나누는가.

 

가장 중요한 이유는 정보 은릭으로 클래스의 인터페이스와 구현 부분을 분리하는 것이 좋기 때문이다.

예를들어 gear의 변수를 advanced_gear 로 이름을 변경하고자 할때

접근자를 사용하지 않았다면 모든 gear를 수정해야하지만 접근자를 사용하여 getGear() 을 사용하여 기어의 값을 받아오도록 코딩이 되어있다면 이 부분만 수정해주면 될 것이다.

반응형

'C++' 카테고리의 다른 글

TCP/IP 통신으로 이미지 파일 전송  (0) 2020.10.12
C++ 내부정의, 외부정의, 헤더파일  (0) 2020.01.09

+ Recent posts