본문 바로가기

분류 전체보기640

9.2 Pipelining Pipelining이란?하나의 명령어를 여러 단계로 분할하여 처리 속도를 높이는 방식이다.   이렇게 i가 1 ~ 7인 경우에 R1 * R2 + R4 를 하는 연산이 있다고 했을 때 이 경우 Pipelining을 이용하면 아래와 같이 각 세그먼트가 넘어갈 때마다 다음 값들이 순서대로 다음 연산을 대기하는 것을 볼 수 있다.   Time diagram  즉, Segment 개수 만큼 빨라진다는 것이다. 2024. 11. 24.
9.1 Parallel processing(Instruction Level Parallelism) Instruction Level Parallelism이란?한 프로그램에서 독립적인 여러 명령어를 동시에 실행하는 것을 말한다.  Processor Register가 명령어 실행에 필요한 데이터를 저장하고, 각 기능 유닛으로 데이터를 전달하게된다. 병렬적으로 데이터를 전달해서 유닛에서는 다양한 연산을 동시에 수행할 수 있다. 2024. 11. 24.
AC-GAN Introduction & Background이전에 설명한 CGAN에서 C를 충분하게 활용하지 못한다는 문제가 있었다. 즉, 조건부 생성이 제대로된 건지 알 수 없다. 따라서, ACGAN에서는 이러한 문제를 해결하고자 Auxiliary Classifier를 이용해서 C에 해당하는 이미지가 제대로 생성된건지 확인하는 과정을 추가하였다.   1. 구조적 요소 추가: Auxiliary Classifier: 기존 GAN의 구조에 Auxiliary Classifier를 추가해서 특정 클래스에 맞는 이미지를 생성할 수 있도록 한다. 2. 특화된 손실 함수 사용: Ls & Lc: 기존 GAN과 다른 Loss Function을 이용해서 더 정확하고 품질 높은 이미지를 생성한다. 3. 변동성 평가지표 도입: Incept.. 2024. 11. 22.
State hoisting이 뭐지? 우선, state에 대해서 알아보자. State: UI의 현재 상태를 나타내는 데이터이다. 예를 들어, 화면에 표시되는 숫자 값이 있다면 그 숫자가 State이고, 버튼 클릭에 따라 값이 변경되면 State의 값이 업데이트되어 UI도 변경된 것이다.  State 선언var count by remember { mutableStateOf(0) } state는 위의 형태와 같이 선언이 되는데 mutableStateOf는 state의 값이 변경될 때, 관련 UI가 다시 렌더링되도록 만드는 함수이다. 또한 ,remember는 UI가 렌더링 되더라도 state의 값이 변경되지 않고 유지되도록 만드는 것이다.       Stateful과 Stateless Stateful: 상태가 스스로 관리하는 방식이다. 쉽게 말해.. 2024. 11. 20.
13-3장 동적 할당 영역을 배열처럼 쓰기 이전에 malloc을 이용해서 Heap 영역에 있는 메모리를 동적 할당 받는 것을 해봤다. 이전에는 4byte(int)만 할당 받았지만, 이번에는 4byte를 5개 받아서 즉 int arr[5]와 같은 효과를 내는 메모리를 동적할당 받아보자. #include #include int main(void){ int* pi; pi = (int*)malloc(5 * sizeof(int)); if (pi == NULL) { printf("메모리 할당 오류\n"); exit(1); } *pi = 1; // pi[0] = 1; *(pi + 1) = 2; // pi[1] = 2; *(pi + 2) = 3; // pi[2] = 3; *(pi + 3.. 2024. 11. 19.
13-2장 malloc()과 free() maclloc(): 동적 메모리를 할당할 때 사용 int *pi; //stack 영역에서 할당pi = (int *)malloc(sizeof(int)) //반환은 void* 타입으로 ❓ 왜 malloc은 void*로 반환을 하는가? 사용자가 어떤 타입의 메모리를 할당하는지 모르기 때문에 메모리의 주소를 반환할 때 특정 타입에 한정해서 반환하지 않고, 범용적으로 사용할 수 있는 포인터 타입인 void*를 이용하는 것이다.  ❓ 왜 malloc 반환 값을 int*로 타입 캐스팅을 하는가? malloc이 범용적인 포인터 타입 void*를 반환하기 때문에 그 타입을 명시적으로 변경해주기 위해서 타입 캐스팅을 한다. 타입 캐스팅을 하면 가독성과 안정성을 높일 수 있다.   값 입력, 연산, printf, scanf.. 2024. 11. 19.
13-1장 동적 메모리 할당란? 메모리를 할당하는 방법에는 정적(static)과 동적(dynamic) 2가지 방법이 있다.  기본적으로 우리가 변수를 통해서 메모리를 할당하는 것 정적 메모리 할당이다. 정적 메모리 할당은 이미 프로그램이 시작되기 전에 결정되는 것이다. 즉, 더 큰 입력은 받아드리지 못하고 더 작은 입력은 메모리 공간이 낭비된다.  따라서, 우리는 동적 메모리 할당을 사용해서 우리가 원하는 메모리 공간을 확보해서 좀더 효율적으로 사용해야한다.  동적 메모리를 할당 받을 때는 Heap 영역에서 할당 받는다. 2024. 11. 19.
12-8장 파일 포인터 파일 포인터: 파일 내에서 읽거나 쓰기를 시작할 위치를 나타낸다.   파일 포인터에는 순차 접근, 임의 접근이 있다.순차 접근: 데이터를 파일의 처음부터 순차적으로 읽거나 기록하는 것이다.임의 접근: 임의 접근 방법은 파일의 어느 위치에서든 읽기와 쓰기가 가능하다.     파일 포인터 함수 - fseek: 파일 포인터의 위치를 변경하는 함수이다. int seek(FILE *fp, long offset, int origin); 위를 쉽게 해석해보면, "파일 포인터를  특정 지점(origin)에서 특정 값(offset)만큼 이동해라"라는 의미이다.  Origin과 관련된 상수  사용 예시fseek(fp, 0L, SEEK_SET);// 파일의 처음으로 이동fseek(fp, 0L, SEEK_END);// 파일의.. 2024. 11. 19.
12-7장 이진 파일의 생성과 fread, fwrite size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream): 메모리에서 지정된 주소(ptr)로부터 데이터를 읽어, 크기(size)와 개수(count)만큼 파일 스트림(열어놓은 파일)에 이진 형식으로 저장한다.    #include int main(void){ FILE* fp = NULL; int a = 10; fp = fopen("binary.bin", "rb"); //바이너리로 오픈 if (fp == NULL) { fprintf(stderr, "원본 파일 apple.txt를 열 수 없습니다.\n"); exit(1); .. 2024. 11. 18.
12-6장 형식화된 입출력(fscanf, fprintf) fscanf: 파일에 있는 데이터를 원하는 형식으로 입력 받는 방법  score.txt파일이 있다고 했을 때 텍스트 파일에서 데이터를 정해진 형식으로 읽어오자. score.txt유재석 80 90 75이광수 59 90 87송지효 86 45 90  #include int main(){ FILE* fp = NULL; cahr name[20]; int kor, eng, mat; double avg; fp = fopen("score.txt", "r"); if (fp == NULL) { fprintf(stderr, "원본 파일 score.txt를 열 수 없습니다.\n"); exit(1); } //파일로부터 입력 받기 fscanf(fp,.. 2024. 11. 18.
12-5장 문자열 입출력 함수(fgets, fputs) fgets(입력할 문자열, 문자열의 크기, 파일 포인터): 특정 파일에서 한 문장을 읽어오는 것 #include #include int main(void) { FILE *fp; char str[100]; // 파일 열기 fp = fopen("file.txt", "r"); if (fp == NULL) { fprintf(stderr, "파일 file.txt를 열 수 없습니다.\n"); exit(0); } // 파일에서 한 줄씩 읽어서 출력 printf("파일 내용을 출력합니다:\n"); while (fgets(str, sizeof(str), fp) != NULL) { // 파일에서 한 줄 읽기 printf("%s", st.. 2024. 11. 18.
12-4장 문자 단위 입력출력 함수(fgetc, fputc) fgetc(fp): fgetc를 사용하면 특정 파일에서 문자 한개를 읽어 올 수 있다.  #include int main(void){ FILE* fp = NULL; int c; fp = fopen("apple.txt", "r"); if (fp == NULL) { fprintf(stderr, "원본 파일 apple.txt를 열 수 없습니다.\n"); exit(1); } c = fgetc(fp) //문자 하나 읽어오기 fclose(fp); return 0;}  ❓ 파일에서 문자를 읽었는데 왜 정수형에 저장을 할까? 파일에서 문자를 읽을 경우,.. 2024. 11. 18.
12-3장 파일열기와 닫기(fopen, fclose) 파일을 쓰기 전에 파일을 저장한 것을 열어야하는데, 단순하게 어떤 파일 열어라고 하면 컴퓨터는 알아듣지 못한다. 따라서 아래의 과정을 통해서 파일을 열고, 파일에 대한 작업이 끝나면 파일을 닫는 것까지 배워보자.    ❓ 만약에 write 모드로 했는데 현재 디렉토리에 해당 파일이 없다면? 현재 디렉토리에 파일이 없다면 해당 파일 명으로 된 새 파일을 자동으로 만들고 그 파일에 텍스트를 작성한다, 2024. 11. 18.
12-2장 파일 파일은 왜 필요할까?RAM(메모리)는 전원이 켜져 있을 때만 데이터를 유지하며, 전원이 꺼지면 그 안의 데이터는 모두 사라진다. 따라서 이러한 문제를 해결하기 위해서 하드 디스크에 저장해서 전원이 꺼지더라도 데이터를 보존해야한다. 그러기 위해서는 파일을 하드디스크에 저장해야하기 때문에 파일이 필요하다,  파일파일은 일련의 연속된 byte이다.모든 파일 데이터들은 결국은 바이트로 바꾸어서 파일에 저장된다.이 byte들을 어떻게 해석하냐는 전적으로 프로그래머의 책임이다.  파일의 유형1. 텍스트 파일정의: 사람이 읽을 수 있는 형식으로 데이터를 저장하는 파일이다. 아스키 코드를 이용해서 저장한다.  구조: 텍스트 파일은 각 줄이 \n으로 구분되어 있으며, 데이터가 문장 형식으로 저장된다. 예시: .txt, .. 2024. 11. 18.
12-1장 스트림, 버퍼, 표준 입출력 스트림 1. 스트림입력과 출력을 바이트들의 흐름으로 생각하는 것이다. 쉽게 말해서, 데이터를 프로그램과 외부 장치(예: 파일, 콘솔) 간에 주고받기 위한 추상화된 데이터 통로이다. 2. 버퍼버퍼는 스트림을 통해 데이터를 주고받을 때 일정량의 데이터를 임시로 저장해 두는 메모리 공간이다. 버퍼 통해 입출력이 필요할 때마다 장치에 직접 액세스하는 대신 일정 크기만큼 모아서 전송함으로써 시스템의 성능을 최적화합니다.  3. 스트림과 버퍼의 관계스트림이 데이터를 전송하기 위한 경로라면, 버퍼는 그 데이터를 임시 저장하는 장소이다. 스트림을 사용해서 데이터를 읽거나 쓸 때, 버퍼를 이용해 전송 속도와 효율성을 높일 수 있다.  즉, 프로그램에서 스트림을 통해 데이터를 주고 받을 때, 이 데이터를 직접 스트림으로 보내기 .. 2024. 11. 18.
8.8 Reduced Instruction Set Computer (RISC) RISC (Reduced Instruction Set Computer)란?: RISC는 명령어들을 단순화하여 효율성과 성능을 극대화하려는 CPU 설계 방식이다.   RISC의 주요 특징 명령어 개수 감소 (Relatively few instructions):주소 지정 모드 감소 (Relatively few addressing modes):메모리 접근 제한 (Memory access limited to load and store instructions):CPU 레지스터 내 연산 (All operations done within the registers):고정 길이 명령어 (Fixed length instruction format):단일 사이클 명령어 실행 (Single cycle instruction ex.. 2024. 11. 17.
8.7 Program control Program control instruction: 어느 위치의 명령어를 수행하게 할 것인지를 제어하는 명령어이다. 즉, 프로그램의 흐름을 변경하기 위해 프로그램 카운터(Program Counter, PC) 값을 수정하는 명령어이다. 예시로는 Branch, Skip, Call, Return등이 있다.  Status Bit ConditionsC(Carry) : 연산 시 마지막 자리 올림수 C₈이 1이면 설정S(Sign) : 결과의 최상위 비트 F₇이 1이면 설정(부호를 나타낸다.)Z(Zero) : 산술 논리 연산 (ALU)의 결과가 모두 0이면 설정V(Overflow) : 올바은 범위를 초과했을 때 설정 - XOR(C₇, C₈​) = 1 -> 즉, 마지막 Carry와 그 전 Carry의 값이 다르면,  O.. 2024. 11. 17.
8.6 Data transfer and manipulation Data Transfer Instructions: 데이터 전달 명령어는 다양한 주소 지정 모드(Addressing Modes)에서 사용     Data Manipulation Instructions: 데이터의 연산 및 변환 2024. 11. 17.
8.5 Addressing modes Addressing mode의 종류이름설명예시Implied Mode명령어 자체가 데이터를 암시적으로 포함하며, 별도의 주소 지정이 필요하지 않음.ADD X : AC Immediate Mode명령어에 데이터 값이 직접 포함되어 있음.ADD R1, #5 (5는 즉시값)Register Mode데이터가 CPU의 레지스터에 저장되어 있음.ADD R1, R2Register Indirect Mode레지스터에 저장된 주소를 사용해 메모리에서 데이터를 읽음.ADD R1, (R2)Auto-increment Mode데이터 접근 후 레지스터 값이 자동으로 증가함.MOV R1, (R2)+Auto-decrement Mode레지스터 값을 감소시킨 후 데이터를 접근함.MOV R1, -(R2)Direct Address Mode명령어에.. 2024. 11. 17.
8.4 Instruction formats CPU 구조에 따른 명령어 형식1. Single Accumulator Organization: 대부분의 연산이 AC와 Memory 사이에서 이루어지는 구조이다. 데이터를 처리할 때 항상 AC에 값을 적재하고 결과를 다시 AC에 저장한다.   ADD X ➡️ AC    2. General Register Organization: CPU에 여러개의 General 레지스터가 있는 구조이다. 연산은 주로 레지스터 끼리 이루어지며, 메모리 접근이 줄어든다.ADD R1, R2, R3 ➡️ R1 ← R2 + R3ADD R1, R2 ➡️ R1 ← R1 + R2   3. Stack Organization: Stack을 사용해서 데이터를 저장하고 연산을 하는 구조이다. 명령어는 암묵적으로 Stack의 최상위 두 값을 이용.. 2024. 11. 17.
8.3 Stack organization Stack은 메모리 접근을 편리하게 하기 위한 하나의 방식이다.  Stack에 대한 기본적인 설명 Stack의 PUSH(쓰기)와 POP(읽기)   [PUSH]   [POP]   주소를 참조하는 것들PC명령어의 주소를 저장 AR피연산자의 주소를 저장 SPStack을 접근하고자하는 메모리의 주소  RPN (Reverse Polish Notation)RPN이라는건 연산자(+, -, *, / 등)를 피연산자(숫자나 변수) 뒤에 쓰는 후위 표기법이다.  이 방식은 Stack을 활용하여 수식을 계산하는 데 매우 적합하다.   왜 RPN을 사용하는가?일반적인 연산과는 다르게 우선순위를 고려할 필요없다. 즉, ()가 필요없다.따라서, 연산자 순서가 정해져있기 때문에 스택을 이용해 계산 과정을 쉽게 구현할 수 있다. 표.. 2024. 11. 17.
8.2 General register organization 공용 ALU와 레지스터 세트 Register selection과 ALU Operations     레지스터 연산 예시 2024. 11. 17.
8.1 Introduction(생략) 해당 부분은 5장과 7장에 대한 간단한 요약 설명이므로 생략 2024. 11. 17.
[기본 용어 설명] Latent Space(잠재 공간)와 latent vector(잠재 벡터) 잠재 공간: 잠재공간이란 데이터를 표현할 때 주요 특징을 모아놓은 추상적인 공간으로 이해할 수 있다. 즉, 복잡한 데이터를 낮은 차원에서 표현하여 주요 특징을 간결하게 담고 있는 공간이다. 하나의 데이터만 한정해서가 아니라 여러 데이터의 특징들이 잠재 공간에 들어갈 수 있다. 쉽게 말해서, 얼굴 이미지 데이터를 학습한 잠재 공간이 있다고 가정하면 코, 눈, 입의 위치나 크기 같은 중요한 특징들이 요약되어 표현된다.  잠재 벡터: 잠재공간의 하나의 지점(벡터)이다. 즉, 하나의 이미지의 모든 특징을 압축한 것이 바로 잠재 벡터이다.      https://www.youtube.com/watch?app=desktop&v=gJ86ixUx6MU 2024. 11. 16.
[기본 용어 정리] 밀도추정(Density Estimation) 밀도 추정이란?우선 밀도가 뭔지부터 알아보자. 밀도란 물리, 수학에서 말하는 밀도와는 좀 다르다. 확률/통계에서 말하는 밀도란 확률 밀도를 의미한다. 즉, 분포를 의미한다. 이제 밀도 추정에 대해서 알아보자. 밀도 추정(Density Estimation)은 여러 데이터 x에서 확률 밀도 함수(분포) P(x)를 예측하는 것이 밀도 추정이다.  [밀도 추정 방법] 모수적 밀도 추정(Parametric Density Estimation)미리 확률 밀도 함수(분포)에 대한 모델을 정해놓고 데이터들로부터 확률 밀도 함수(분포)의 파라미터(θ)를 추정하는 방식이다. 모수적 밀도 추정의 대표적인 예로는 MLE(최대 우도 추정)가 있다. 다만, 이렇게 확률 밀도 함수(분포)가 정해져있는 경우는 현실에서 많지 않기 때문.. 2024. 11. 16.
[기본 용어 설명] Generative approach vs Discriminative approach Generative approach: 주어진 데이터가 특정 결과에 속할 가능성을 구할 뿐만 아니라, 새로운 데이터를 생성할 수도 있는 접근 방식이다. 최종적으로 P(x | y)를 구하여 클래스 y에 따른 데이터 x의 분포를 예측하는 것이다. 또한, 클래스 y가 주어지지 않는 P(x) 즉, x의 분포를 예측하는 것은 VAE, GAN이 있다.  위의 Generative 이미지에 대해서 설명하자면, 빨간색 y와 파란색 y는 각각 다른 y인데, 이 각각의 해당하는 클래스 y에 따른 데이터 분포 x를 예측한다라는 의미이다.  장점데이터 생성 가능: 학습된 분포를 바탕으로 새로운 데이터를 생성할 수 있어, 비지도 학습이나 데이터 증강에 유용합니다.데이터 분포에 대한 심층적 이해: 입력 데이터와 결과 간의 전체 분포.. 2024. 11. 16.
[기본 용어 설명] MLE(Maximum Likelihood Estimation) - 최대 우도 추정 사전 확률 P(θ | D)에서 우도는 P(D | θ)이다. 즉, 우도란 매개변수가 특정한 값일 때 데이터 D가 나올 확률을 의미한다. 최대 우도 추정이라는 것은 결국 데이터 D가 많이 관찰되는 매개변수 θ를 찾는 것이다.  즉, 우리가 가진 데이터를 가장 잘 설명할 수 있는 매개변수 θ(분포를 결정하는 값)를 찾는 방법이다.  MLE를 구하기 위해서는 로그 우도 함수를 사용해야한다.   (1) --- 모든 x가 동시에 발생했을 때의 모든 우도를 구하는 것이기 때문에 결합 확률을 이용해 모든 우도를 곱한다. (2), (3) --- 연산을 좀더 간단하게 말들기 위해서 로그를 사용해서 로그의 기본 성질인 곱을 합으로 바꿀 수 있는 특징을 사용했다.  (4) --- 시그마로 모든 합을 표현 (오른쪽 수식) --.. 2024. 11. 16.
[기본 용어 설명] 베이즈 정리를 통한 사전 확률(Prior)과 사후 확률(Posterior), 우도(Likelihood) 우선 베이즈 정리를 알기 전 결합 확률(joint prbability)와 조건부 확률(condition probability)에 대해서 알아야한다. 결합 확률 - P(x, y)결합 확률이란 x사건과 y사건이 동시에 일어날 확률을 의미한다.  조건부 확률 - P(x | y)조건부 확률이란 y사건이 일어난 후 x사건이 일어날 확률을 의미한다.  결합 확률과 조건부 확률의 관계 - P(x, y) = P(x| y)P(y)결합 확률은 조건부 확률과 사건 x가 일어날 확률을 곱한 식으로 나타낼 수 있다.    베이즈 정리 이러한 관계를 이용해서  베이즈 정리를 정의할 수 있다. 일반적으로 P(x, y)와 P(y, x)의 확률이 같기때문에 아래의 식이 성립된다.  위 식을 P(y|x)에 대해서 정리를 하면 아래와 같.. 2024. 11. 15.
ColorPickerApp - state hoisting으로 3개의 slider의 값을 하나의 색으로 조합하기 따라서 코드를 설명하자면, 1. state 선언: 데이터 변화에 따라 UI를 변경하기 위해서 사용 2. 상위 Component에서 하위 Component에 state 전달 3.  하위 Component인 ColorPicker에서 slider를 통해서 값을 변경 4. 값이 변경되면 상위 Component의 state 값도 변경 + 동시에, 모든 UI 다시 랜더링 5. 모든 UI가 다시 랜더링 되면서, ColorInfoIntoText의 값도 함께 변경된다.   이런식으로 state가 변경되면 다시 랜더링되면서 모든 ui도 함게 변한다. 2024. 11. 13.
[이전 논문] CGAN CGAN이란? CGAN(Conditional GAN)은 생성 모델 G와 감별 모델 D의 입력에 조건 C를 추가하였다. C는 클래스 레이블, 속성 정보 등 데이터 생성에 필요한 추가 정보로, 생성 모델 G는 노이즈 z와 조건 C를 함께 입력받아 C에 맞는 데이터를 생성한다. 감별 모델 D는 입력 데이터가 진짜인지 가짜인지 판단한다이렇게 CGAN은 조건에 따라 데이터를 생성하도록 설정함으로써 GAN의 출력을 제어할 수 있게 된다." 💡C를 통해서 어떻게 조건부 생성을 할 수 있게 되는 것인가? 위 이미지로 설명을 해보겠다. 우선 C라는 조건은 노이즈 벡터를 샘플링할 때와 이미지 셋에서 샘플링할 때 주어진다. z는 C라는 정보를 토대로 샘플링을 하겠지만 원할하게 하지 못한다. 하지만 이미지 셋에서 샘.. 2024. 11. 12.