본문 바로가기

분류 전체보기640

Lab_01: Tensor Manipulation PyTorch로  Tensor 생성하기1차원 Tensort = torch.FloatTensor([0,1,2,3,4,5,6])# tensor([0., 1., 2., 3., 4., 5., 6.]) 2차원 Tensort = torch.FloatTensor([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])# tensor([[ 1., 2., 3.],# [ 4., 5., 6.],# [ 7., 8., 9.],# [10., 11., 12.]])   Multiplication vs Matrix Multiplicat.. 2025. 1. 3.
1.7 기계 학습 유형 지도 학습: 입력 데이터와 각 데이터의 클래스가 동시에 주어지는 것  비지도 학습: 입력데이터만 주어지는 것  강화 학습: 행동에 대한 보상으로 적절한 목표로 나아게 만드는 것  준지도 학습: 입력 데이터와 일부 입력 데이터에 대한 클래스만 주어지는 것 2024. 12. 24.
1.5 모델 선택 ❓모델의 용량이란? 모델의 용량이란 학습능력과 구조, 표현력, 일반화 능력 등을 의미한다. 따라서 모델의 용량이 작다는 것은 모델이 복잡한 패턴나 관계를 학습하는 것을 어려워하고, 단순한 구조를 가지는 것을 의미한다. 또한 모델의 용량이 크다는 것은 모델이 복잡한 패턴나 관계를 학습할 수 있고, 복잡한 구조를 가지는 것을 의미한다. 과소 적합과 과잉 적합위의 그림에서 1차, 2차는 모델의 용량이 작아서 직선 또는 2차원 곡선의 데이터만 수용할 수 있다. 이러한 경우를 과소 적합이라고 한다. 12차는 모델의 용량이 너무 커서 아주 작음 잡음까지 수용해버린다. 따라서, 훈련집합에는 완벽하게 모델이 대응할 수 있지만, 새로운 테스트 집합이 들어오면 아래와 같이 대응하지 못하게 된다. 이러한 경우를 과잉 적합이.. 2024. 12. 24.
1.4 간단한 기계 학습의 예 위의 그림은 직선 모델을 사용해서 회귀 문제를 푸는데, 이러한 기계 학습 알고리즘은 선형 회귀라고 한다.  선형 회귀는 직선 모델을 사용하기 때문에 추정해야 할 매개변수는 w, b이다. 이 매개변수를 묶어서 θ(세타)라고 하고 아래 처럼 표기한다. θ = (w₁, b₁)ᵀ    처음에는 난수로 w와 b를 결정하지만, 점점 개선해서 θ₁를 θ₂로 개선하고, θ₂를 θ₃로 개선하여 최적의 매개변수인 θ ^(세타 햇)에 도달해야 한다. 이렇게 개선을 하기 위해서는 동력이 필요한데 수학에서는 이를 목적 함수라고 한다. 이 목적 함수를 수식으로 나타내면 아래와 같다. 위의 식을 해석해보면, (예측 함수 - 실제 목표 값)²의 평균을 의미한다. 즉, 예측 함수의 평균 제곱의 오차를 의미한다.   따라서, 우리의 목.. 2024. 12. 24.
1.2 특징 공간에 대한 이해 💡 특징 공간: 데이터의 특성을 나타내는 변수들로 이루어진 공간2차원 특징 공간1차원 특징 공간과 다르게 2차원 특징 공간은 두개의 x축을 통해서 y축을 예측하는 것이다. 따라서, 2차원에서의 특징 벡터 x는 (x₁, x₂)ᵀ 방식으로 표현할 수 있다. 이를 바탕으로 키, 몸무게에 대한 장타율을 나타내면 아래와 같다.   다차원 특징 공간2차원 뿐만 아니라 그 이상 차원에서도 특징 벡터를 표현할 수 있는데 다차원에서의 특징 벡터 x는 (x₁, x₂, x, x, ..., xd)ᵀ 방식으로 표현할 수 있다.     특징 공간 변환과 표현 학습위와 같이 직선으로 분류할 수 없던 특징 공간을 분류할 수 있게 변환하는 것이 특징 공간 변환이라고 한다. 이렇게 변환을 통해서 좋은 특징 공간을 자동으로 찾아내는 것.. 2024. 12. 23.
1.1 기계 학습이란 💡 기계학습: 임의의 입력 값(x)에 대한 결과(y)를 예측하는 것  회귀와 분류회귀란? 입력데이터 x를 기반으로 출력 데이터 y를 가질 수 있는 연속적인 수치 값(실숫값)을 예측하는 데 사용한다.예를 들면, 주택 크기에 따라 집값을 예측하는 것이다.  분류란? 입력 데이터 x를 기반으로 출력 데이터 y가 어떤 이산적인(연속적이지 않은) 클래스 값을 가지는지 예측하는데 사용된다.예를 들면, 사진 속 동물이 개, 고양이, 새 중에 무엇인지 분류하는 것이다.    기계 학습에서의 x와 y기계 학습에서 x는 특징을 나타내고, y는 목표값을 나타낸다. 물론, x와 y는 스칼라가 아니라 벡터이다. 즉, 여러 개이다.따라서, 이런 집합을 훈련 집합이라고 부르고 아래와 같이 표기한다.    모델을 수식(직선)으로데.. 2024. 12. 23.
14-6장 main 함수의 인수 지금까지의 main함수는 인수가 없는 void를 갖고 잇는 함수였다. 이번에는 외부로부터 입력을 받을 수 있는 main()함수 형태를 살펴보자. //[외부로부터 입력을 받는 main()]int main(int argc, char* argv[]){} argc명령어가 가지는 인수들의 개수 argv[]명령어가 가지는 인수들을 문자열 형태로 전달main에 인수가 아래와 같이 전달되었다고 가정해보자. C:\cprogram> mycopy src dst 위에서 인수는 mycopy, src, dst를 말한다. 따라서, argc는 3이고, argv = [mycopy, src, dst]이다. 2024. 12. 3.
[Visualization] Matplotlib의 고급 기능(Subplots, annotate, Fommator, Locator) In [101]:import numpy as npimport pandas as pdimport matplotlib as mplimport matplotlib.pyplot as pltfrom matplotlib.gridspec import GridSpecfrom matplotlib.ticker import NullLocator, NullFormatter, MaxNLocator, FuncFormatterimport warningswarnings.filterwarnings(action='ignore')Subplot¶: 하나의 그림(캔버스)안에 여러 개의 plot을 넣는 것[plt.subplot]¶개별 subplot을 생성(행, 열, 위치)로 subplot 위치를 지정사용하기 간단하지만, plot간의 세부 설정.. 2024. 12. 2.
[Visualization] Colormap In [30]:import numpy as npimport pandas as pdimport matplotlib as mplimport matplotlib.pyplot as pltfrom matplotlib.colors import ListedColormapimport warningswarnings.filterwarnings(action='ignore')Qualitative (질적), Sequential (연속적), Diverging (분기적)¶Qualitative (질적): 각각의 구역이 구별 되어야함(독립적)Sequential (연속적): 데이터 값이 증가함에 따라 색상의 농도가 점진적으로 변합니다.Diverging (분기적): 강중심값을 기준으로 색상이 양쪽으로 분기됩니다.In [37]:# 데이터 .. 2024. 12. 2.
[Visualization] Regend In [7]:import numpy as npimport pandas as pdimport matplotlib as mplimport matplotlib.pyplot as pltimport warningswarnings.filterwarnings(action='ignore')Legend(범례)¶: 여러 plot이 한 축에 표현되어 있을 때, 해당 plot을 표시하는 것In [38]:x = np.linspace(0, 10, 1000)plt.plot(x, np.sin(x), '-g', label='sin(x)')plt.plot(x, np.cos(x), ':b', label='cos(x)')plt.axis('equal')plt.legend()Out[38]:In [ ]: Legend(범례) 생성관련¶label이.. 2024. 12. 2.
14-5장 헤더 파일 중복막기(분할 컴파일) 분할 컴파일이란?분할 컴파일은 하나의 프로그램에 여러 파일을 나누어 작성해서 분할로 컴파일을 진행하고 링크를 통해서 하나의 실행파일로 만드는 것을 의미한다.   이렇게 하면, 유지보수 재사용, 디버깅 하기 쉽다는 장점이 있다.   다만, 분할 컴파일. 즉, 파일을 여러 개 만들어서 메인 파일에 여러 파일을 포함(include)할 때, 중복으로 포함하면 예상치 못한 오류가 발생한다. 따라서, 이를 방지 위한 방법으로 사용자가 정의한 헤더파일에 #ifndef 조건부 컴파일 지시자를 사용하는 방법이 있다.  위의 코드를 간단하게 설명하면, main.c에서는 power.h를 #include해서 메인 파일에 포함시킨다. 중복으로 포함하는 것을 방지하기 위해서 power.h는 내부에 조건부 컴파일 지시자(#ifnd.. 2024. 12. 2.
14-4장 #if #if란?: #ifdef에서는 기호 상수의 존재를 확인했지만, #if에서는 기호 상수의 값을 기반으로 분기처하는 조건문이다. 따라서, 논리, 관계 연산자 사용이 가능하다.  관계 연산자#define DEBUG 1#if(DEBUG == 1) printf("디버그 중");#endif 논리 연산자#define VERSION 3.1#if(VERSION > 3.0) printf("버전 3.0이상입니다.");#endif 무조건 무시: 무조건 무시하는 경우는 조거문 내부의 블럭에 주석이 있고, 그 보다 더 큰 블럭 단위를 주석하고 싶을 때 사용한다. 주석 밖에 주석을 하는 경우 주석이 제대로 설정되지 않을 수 있기 때문이다.#if 0 /* 주석 */#endif 무조건 실행#if(DEBUG == 1) .. 2024. 12. 2.
14-3장 #ifdef #ifdef란?: 특정 기호 상수가  존재할 때, 특정 동작을 수행할지 안할지를 분기해주는 조건문이다.  위의 예시와 같이 DEBUG라는 기호 상수가 존재하면, 출력구문을 실행하고, 기호 상수가 존재하지 않으면(주석 처리), 출력문은 존재하지 않고 값만 반환하게 된다. 따라서, 기호 상수를 통해서 테스트 버전일 때와 릴리즈 버전일 때를 나눠서 동작을 설정할 수 있다.   [리눅스와 윈도우 버전확인 예제]#include #define LINUXint main(void){ int n;#ifdef LINUX printf("리눅스 버전입니다. \n"); printf("정수를 입력하시오:"); scanf("%d", &n);#else printf("윈.. 2024. 12. 2.
14-2장 함수 매크로 함수 매크로: 인자를 받아서 함수처럼 동작하는 매크로이다.   함수 매크로의 예시#define SUM(x, y) ((x) + (y))#define AVERAGE(x, y, z) (( (x) + (y) + (z) ) / 3 )#define MAX(x,y) ( (x) > (y) ) ? (x) : (y)#define MIN(x,y) ( (x)   [사용 방법] int v = SUM(3, 4)// v는 7‼️ 함수 매크로 사용시 주의할 점 ‼️ 1. 인자에 괄호 사용하기#define SQUARE(x) x*xint main(){ int v = SQUARE(3+4) //원하는 결과: 49 //실제 결괴 -> 3 + 4 * 3 + 4 = 3 + (4 * 3) + 4 -> 19} 인자에는 괄호를 꼭 사용해야.. 2024. 12. 2.
14-1장 전처리기와 단순 매크로 전처리기란?: # 기호로 시작하는데, 컴퓨터 처리에 있어서 중심적인 처리를 수행하는 부분을 위해 사전 준비적인 계산을 진행하는 것이다.     전처리기의 종류     단순 매크로: 변수처럼 어떠한 값을 특정 단어로 대체하는 것을 의미한다. 즉, 아래와 같이 3.141592를 PI라는 단어로 치환하는 것이다.    💡  #define과 typedef의 차이점 [define]: unsigned char를 uchar로 치환하는 것// define#define uchar unsigned char  [typedef]: unsigned char를 UCHAR로 치환하는 것// typedeftypeof unsigned char UCHAR   서로 같은 기능을 하지만 차이점도 있다. 1. 처리하는 것이 다르다.: ty.. 2024. 12. 2.
[Visualization] Contour Plot(등고선) In [4]:import numpy as npimport matplotlib.tri as triimport pandas as pdimport matplotlib as mplimport matplotlib.pyplot as plt In [5]:npts = 100x = np.random.uniform(-2, 2, npts)y = np.random.uniform(-2, 2, npts)z = x * np.exp(-x**2 - y**2)ngridx = 100ngridy = 100xi = np.linspace(-2.2, 2.2, ngridx)yi = np.linspace(-2.2, 2.2, ngridy)triang = tri.Triangulation(x, y)interpolator = tri.LinearTriInt.. 2024. 11. 26.
[Visualization] Error Bar In [1]:import numpy as npimport pandas as pdimport matplotlib as mplimport matplotlib.pyplot as pltError Bar¶평균과 표준편자를 표시하여 데이터의 전체적인 경향을 요약하여 표시할 때 사용한다.즉, 많은 라벨의 데이터 들이 있을 때 라벨마다의 데이터 분포를 표시할 때 사용한다.In [5]:x = np.linspace(0, 10, 50)dy = 0.8y = np.sin(x) + dy * np.random.randn(50)plt.errorbar(x, y, yerr=dy, fmt='.k')plt.xlabel("Label")plt.ylabel("Distribution of Label")Out[5]:Text(0, 0.5, 'Dist.. 2024. 11. 26.
[Visualization] Scatter Plot(산점도) In [1]:import numpy as npimport pandas as pdimport matplotlib as mplimport matplotlib.pyplot as pltScatter Plot¶위치에 대한 정보를 나타낼 때 사용¶기존 plot을 이용한 ScatterPlot¶In [3]:x = np.linspace(0, 10, 30)y = np.sin(x)plt.plot(x, y, 'o', color = 'black')Out[3]:[]Scatter 메소드를 사용한 ScatterPlot¶In [4]:plt.scatter(x, y, marker='o')Out[4]:In [6]:rng = np.random.RandomState(0)x = rng.randn(100)y = rng.randn(100)color.. 2024. 11. 26.
[Visualization] LinePlot In [11]:import numpy as npimport pandas as pdimport matplotlib as mplimport matplotlib.pyplot as plt기본적인 동작¶In [13]:x = np.linspace(0, 10, 100)In [19]:plt.plot(x, np.sin(x), '--');Matlb Style vs Object-oriented Style¶In [37]:plt.figure()plt.subplot(2, 1, 1) # 2행 1열로 나누어 1번에 그래프를 그린다.plt.plot(x, np.sin(x))plt.subplot(2, 1, 2)plt.plot(x, np.cos(x)) # 2행 1열로 나누어 2번에 그래프를 그린다.Out[37]:[]In [43]:fig, .. 2024. 11. 26.
13-12장 다차원 배열의 동적 할당 ⭐⭐⭐ 동적 할당을 통해서 다중 배열을 만들 수 있다. 첫 번째로 배열 동적 할당을 하고, 동적 할당을 배열 요소에 다음 동적 할당을 받는다. 그림으로 표현하면 다음과 같다.    [2차원]#include #include void fillArr(int **arr, int row, int col) { int i, j; for(i = 0; i   [3차원]#include #include // 3차원 배열에 값 채우는 함수void fill3DArray(int ***arr, int depth, int row, int col) { int i, j, k; for (i = 0; i  [출력]Depth 0:0 1 2 3 4 5 6 7 8 9 Depth 1:10 11 12 13 14 15 1.. 2024. 11. 26.
13-11장 Wild pointer Wild pointer란?초기화 되지 않은 포인터를 의미한다. 초기화 되지 않은 포인터를 사용하면 해당 포인터가 가리키는 주소가 어디인지 모르기 때문에, 잘못하면 이상한 메모리를 참조할 수도 있고, 메모리 할당을 못 받을 수도 있다. 따라서, 아래의 해결 방법을 통해서 해당 문제를 방지해야한다. #include #include int main(void) { int * pi; *pi = 12; // pi는 wild pointer이다. pi = malloc(sizeof(int)); // wild pointer의 해결방안 1 - malloc(동적 할당: heap 영역) // 여기서 동작 할당을 하고 NULL을 확인해야함!!! *pi = 12; int a = 12; pi = &a; // wild po.. 2024. 11. 26.
13-10장 Dangling pointer Dangling pointer: 해제(free)된 메모리 공간의 주소를 갖고있는 포인터  [경우 1]#include #include int main(void) { int * p1; int * p2; p1 = (int *)malloc(sizeof(int)); *p1 = 5; p2 = p1; // p2는 p1과 같은 메모리를 가리킨다 (aliasing) free(p1); // 이때 p2는 dangling pointer가 된다. 즉, p2 를 통해서 메모리를 접근하려고 하는 시도는 예측 불가능한 결과를 초래한다. *p1 = 5; // 이미 해제된 p1을 통해서 메모리를 접근하고자 할 때, p1 또한 dangling pointer이다. 간단한 듯 보이지만, 대부분의 경우는 찾아내기 어렵다. return 0.. 2024. 11. 26.
13-9장 메모리 누수(3)_먼저 할당된 메모리 주소를 해제를 한 경우 #include #include typedef struct _mys { char *A; int B;} mys;char* getBuf(void) { return (char *)malloc(100 * sizeof(char));}int main(void) { char * A; char * B; mys * m = (mys *)malloc(sizeof(mys)); m->A = (char *)malloc(100*sizeof(char)); getBuf(); // getBuf에서 할당한 메모리는 찾을 수 없으므로 해제 불가능하다. free(m); // m을 먼저 해제했으므로 m->A에 접근할 수 없으므로 해제 불가능하다. return 0;}   위 사진처럼 먼저 할당 된 메모리를 해제를 하면, 다음 할당된 메모.. 2024. 11. 26.
13-8장 메모리 누수(2)_이미 해제된 동적 메모리 영역을 다시 해제 하려고하는 경우 #include #include int main(void) { char * A; char * B; A = (char *)malloc(100*sizeof(char)); B = (char *)malloc(100*sizeof(char)); B = A; free(A); // A는 해제 가능하다. free(B); // 원래의 B는 해제 불가능할 뿐 아니라, 이미 해제한 A를 다시 해제하려 고 하고 있다 (double free) return 0;}   위의 사진처럼 B에 A를 할당을 하면 동적할당 받은 2000번지의 메모리 영역에는 접근할 수 없게 되고 free도 하지 못하게된다.  또한 A와 B를 free하면 같은 메모리 영역을 두번 free하는 것이기 때문에 오류가 발생한다. 따라서, 아래와 .. 2024. 11. 26.
13-7장 메모리 누수(1)_fread가 실패해서 free를 실행하지 못하는 경우 메모리 누수란?: 메모리를 할당하고, 해제하지 않은 경우  #include #include char* readBuf(File* file, const int size) { int foo = 0; char* buf = (char*) malloc(size * sizeof(char)); if(buf == NULL) { printf("메모리 할당 오류\n") ; exit(1); } if(fread(buf, sizeof(char), size, file) != size) return NULL; // fread가 실패했다면? return buf;}int main(void) { FILE * fp; char * pc; int size = 80; fp = fopen("tmp.txt", "r"); pc = readBuf(.. 2024. 11. 26.
13-6장 동적 할당에서의 대표적인 오류들 2024. 11. 25.
13-5장 realloc(), memset(), calloc() realloc: 이미 할당 받은 메모리 값의 크기를 변경하는 것 realloc(이미 할당 받아서 사용하던 메모리 주소를 담고 있는 포인터, 변경하고 싶은 전체 크기)  예제#include #include #define SIZE 5int main(void) { int i, cur = 0, curMSize = SIZE; int *p; // 초기 메모리 할당 p = (int *)malloc(sizeof(int) * curMSize); if (p == NULL) { printf("메모리 할당 오류\n"); exit(1); } while (1) { cur++; // 메모리 확장이 필요할 경우 if (.. 2024. 11. 25.
13-4장 구조체 동적 생성 이전에 우리는 구조체 여러 개를 사용하기 위해서는 배열을 사용해서 구조체를 생성했었다. 이제는 동적 할당을 배웠으니, 동적할당을 기반으로 구조체를 동적으로 생성해보자.   [구조체 동적 생성]#include#include#includestruct Movie{ char title[100]; double rate;};int main(){ struct Movie* pi; int size = 0; printf("영화의 개수: "); scanf("%d", &size); pi = malloc(size * sizeof(struct Movie)); if (pi == NULL){ printf("메모리 할당 오류\n"); exit(1); } .. 2024. 11. 25.
9.5 RISC pipeline RISC 아키텍쳐에서는 명령어를 3단계로 나누어 처리한다. 각 단계는 병렬로 실행되며, Pipelining을 통해 처리 속도를 높인다.  I : Instruction Fetch (명령어 가져오기)A : Decode, Read Registers (명령어 해독 및 레지스터 읽기)E : Execute (실행) 1. Data Manipulation Instructions: 데이터 조작 명령(예: 산술 연산, 논리 연산)를 처리한다. I : Instruction Fetch (명령어를 메모리에서 가져오기)A : Decode, ALU operations 명령어 해독 및 실행할 연산 결정필요한 레지스터 값을 읽기ALU를 통해 산술 또는 필요한 레지스터 값을 읽는다.E : Write a register (연산 결과를 레.. 2024. 11. 24.
9.4 Instruction pipeline instruction pipline   위의 Fetch, Decod, Excute를 pipeline으로 만들 수 있는데 오류가 발생할 수 있다.  위의 사진과 같이 EX에서 branch를 수행해야하는데, 아직 다음 명령어가 Fetch되지 않았기 때문에 어떤 명령어로 점프해야하는지 알 수 없다.   따라서, 아래와 같이 다음 Segment를 지연시켜서 EX 다음에 FI가 실행되도록 만들어야한다. Pipelining에서 발생할 수 있는 주요 문제점(Hazards) Structural Hazards (구조적 해저드): 하드웨어 Resource가 부족해서 동시에 실행되는 명령어들이 서로 충돌할 때 발생한다.  Fetch 시킬수 있는 코드가 하나만 있을 때 동시에 FO와 FI가 일어나면 충돌이 일어날 수 있다. .. 2024. 11. 24.