원형 연결 리스트개념단순 연결리스트는 마지막 노드는 NULL을 가리켰다. 이 마지막 노드를 다시 첫 번째 노드를 가리키게 하면 그게 바로 원형 연결 리스트이다.여기서 새 노드를 머리에 추가해 보겠다. 그러면 리스트는 다음의 형태가 된다. 이번엔 반대로 꼬리에 추가해보면 다음과 같다.두 경우를 비교해보면 머리에 추가하든 꼬리에 추가하든 둘 다 2가 저장된 노드를 가리킨다는 것을 알 수 있다. 이러한 특성 때문에 head를 없애고 tail만 둔 변형된 연결 리스트가 나왔다. 형태는 아래와 같다.(보통 원형 연결 리스트라고 하면 변형된 원형 연결 리스트를 뜻함)여기서 꼬리를 가리키는 포인터 변수는 tail이고, 머리를 가리키는 포인터 변수는 tail->next이다. 이로 인해 머리와 꼬리에 새로운 노드를 추가..
단순 연결 리스트리스트의 ADT와 구현리스트의 구현데이터 조회데이터 조회로 쓰이는 함수는 LFirst와 LNext이다. LFirst함수는 다음과 같다.1234567891011int LFirst(List * plist, LData * pdata){ if(plist->head->next == NULL) //더미 노드가 널을 가리키면 데이터가 없음 return FALSE; plist->before = plist->head; //before은 더미 노드를 가리킴 plist->cur = plist->head->next; //cur은 첫 번째 노드를 가리킴 *pdata = plist->cur->data; //첫 번째 데이터를 전달 return TRUE;}Colored by Color Scriptercs위 함수가 호..
단순 연결 리스트단순 연결리스트란 한 쪽 방향으로만 연결 조회 삭제 등이 가능한 자료구조를 말한다. 보통 자료를 저장하는 도구로는 배열이 대표적이지만 배열은 크기가 정적이기 때문에 처음에 선언한 크기보다 더 많은 양을 저장하기 어렵다. 그래서 동적으로 저장 가능한 연결 리스트가 나온 것이다. 연결 리스트의 ADT와 구현연결 리스트의 ADT정의● 리스트 초기화 ● 데이터 저장● 데이터 조회● 데이터 삭제● 리스트 정렬 이제 이 5개의 기능을 함수로 제시만 하고 구현하지 않으면 된다. 12345678910void ListInit(List * plist);void LInsert(List * plist, LData data); int LFirst(List * plist, LData * pdata);int LNe..
합성곱 계층합성곱 연산합성곱 계층에서의 합성곱 연산을 처리합니다. 합성곱 연산은 이미지 처리에서 말하는 필터 연산에 해당합니다.(문헌에서는 필터를 커널이라고 칭하기도 합니다.) 합성곱 연산은 필터의 윈도우(window)를 일정 간격으로 이동해가며 입력 데이터에 적용합니다. 아래 그림에서 보듯 입력과 필터에서 대응하는 원소끼리 곱한 후 그총합을 구합니다.(이 계산을 단일 곱셈-누산(fused multiply-add,FMA)라고 합니다.)완전연결 신경망에서는 가중치 매개변수와 편향이 존재하는데, 여기서 가중치가 필터의 매개변수입니다. 그리고 편향은 필터를 적용 후의 데이터에 더하면 됩니다.(편향은 항상 1x1만 존재) 패딩(padding)합성곱 연산을 수행하기 전에 입력 데이터 주변을 특정 값(예컨대 0)으..
CNN의 전체 구조일반적인 신경망은 인접하는 계층의 모든 뉴런과 결합되어 있습니다. 이를 완전연결이라고 하며, 완전히 연결된 계층을 Affine 계층으로 구현했습니다.CNN의 구조는 완전연결계층(Fuuly-Connected Layer)과는 다른점이 있습니다. 완전연결계층에서는 Affine계층으로 구현했지만, CNN에서는 아래의 그림처럼 합성곱 계층과 폴링 계층이 추가됩니다. 그리고 출력에 가까운 층에서는 다시 Affine-ReLU 구성을 사용할 수 있습니다. 마지막 계층에서는 Affine-Softmax 조합을 그대로 사용합니다. 합성곱 신경망(CNN)합성공 신경망(CNN)은 음성 인식이나 이미지 인식에서 주로 사용하는데, 특히 이미지 인식 분야에서는 딥러닝을 활용한 기법이 거의 다 CNN을 기초로 합니다..
하노이 타워(The Tower of Hanoi)하노이 타워를 재귀를 이용해 코드로 구현해 볼 것이다. 하노이 타워의 패턴우선 원반이 3개인 경우를 설명해 보겠다.(젤 작은 원반이 번호도 작음) 1. 원반1을 A에서 C로 이동2. 원반2을(를) A에서 B로 이동3. 원반1을 C에서 B로 이동4. 원반3을(를) A에서 C로 이동5. 원반1을 B에서 A로 이동6. 원반2을(를) B에서 C로 이동7. 원반1을 A에서 C로 이동 위 과정의 패턴들이 원반의 수가 몇 개가 되든 계속 반복된다. 아래는 원반이 4개인 경우를 그림으로 표현한 것이다.여기서 원반 1,2,3을 A에서 B로 그리고 B에서 C로 이동시키는 과정이 없는 이유는 앞에서 이미 3개를 다른 막대로 옮기는 과정을 실행했기 때문이다. 따라서 위 내용들을 ..
오버피팅오버피팅이란 신경망이 훈련 데이터에만 지나치게 적응되어 그 외에 데이터에는 제대로 적응하지 못하는 상태를 말합니다. 기계학습은 범용 능력을 지향하기 때문에 훈련 데이터에서만 잘 작동하는 모델은 필요가 없습니다. 오버피팅은 주로 다음 두 경우에 일어납니다. 매개변수가 많고 표현력이 높은 모델훈련 데이터가 적음 가중치 감소가중치 감소는 학습 과정에서 큰 가중치에 대해서는 그에 상응하는 큰 페널티를 부과하여 오버피팅을 억제하는 방법입니다.(L2 법칙 많이 사용) 원래 오버피팅은 가중치 매개변수의 값이 커서 발생하는 경우가 많기 때문입니다. 가중치 감소를 시키는 원리는 손실 함수에 가중치의 L2노름을 더하는 것입니다. 가중치 감소 전(Overfiting)가중치 감소 후 훈련 데이터와 시험 데이터와의 차이..
가중치 초기화은닉층의 활성화 분포은닉층의 활성화값(활성화 함수의 출력 데이터)의 분포를 관찰하면 중요한 정보를 얻을 수 있습니다. 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253import numpy as npimport matplotlib.pyplot as plt def sigmoid(x): return 1 / (1 + np.exp(-x)) def ReLU(x): return np.maximum(0, x) def tanh(x): return np.tanh(x) input_data = np.random.randn(1000, 100) # 1000개의 데이터node_num = 100..