Train and Test image set실세계의 사물은 크기도 다양하고 색깔도 다양하다. 이 설계에서는 다음의 두 가지 사항을 고려하여 학습 및 시험 이미지를 위와 같이 정하였다.1.크키가 큰 이미지라 하더라도 망막에 맺히고 인식되는 크기는 황반을 벗어나지 못하기 때문에 입력으로 주어지는 원래 이미지 크기는 10x10 으로 제한한다.2.사물을 인식하는 것은 색보다는 물체의 윤곽선이나 생김새가 더 큰 역할을 수행하므로 색 감지를 제외한 패턴 인식에 대해서만 생각해보도록 한다.설계1.사람이 패턴을 보고, 그 패턴이 어떤 의미를 포함하는지 인지하는 과정은 일반적으로 다음의 과정을 따른다.A.눈에 물체의 상이 맺히면 망막의 수용체들이 자극을 받는다.B.자극받은 수용체들은 시신경으로 신경자극을 전달한다.C.시신경으로부터 전달받은 자극은 LGN으로 들어가서 정규화되어 다시 뇌의 다른 부분으로 전달된다.D.후두엽으로부터 전달된 정보는 뇌의 각 부분을 거치면서 망막에 맺힌 이미지에 대한 정보를 추출하고 인지하게 된다.2.뉴런들이 신경자극에 대해 어떤 반응을 일으킴으로써 사물을 인지하게 되는지에 대해서 다음과 같은 가설을 생각해볼 수 있다.3.이러한 가설이 타당하다면, Test image 가 시각정보로 들어왔을 때, 이 Neural network group에 속한 Neural network 들이 도출한 결론들의 결과는 다음과 같은 모양을 이룰 것이다.
주어진 문제CMM 문제를 D&C 로 설계하기Divide the given problem into small problems.주어진 n 개의 행렬에 대해 1~k 번째 행렬까지 곱한 행렬과 그 나머지를 곱한 행렬의 곱으로 문제를 나눈다.나뉜 행렬을 곱한 총 연산횟수를 반환하는 CMM_DnC()라는 함수가 있다고 할 때, 나뉘어 계산된 행렬 과 를 곱셈한 총 연산 횟수는 다음과 같다.A 에서 언급한 k 의 위치를 변경해가면서 어떤 행렬을 기준으로 두 그룹으로 나누었을 때 연산결과가 가장 작을지를 반복하며 검색한다.Conquer those steps.행렬들의 곱셈연산 자체가 Combine 의 역할을 수행하고 있으므로 특별히 Combine 단계가 존재하지 않는다.Source codeint CMM_DnC(int dim[], int start, int end) {int smallest = INT_MAX;int tmp = 0;if( start == end ) smallest = 0; // in case of one matrix,else if( start == end-1 ) // in case of two matrices,smallest = dim[start] * dim[start+1] * dim[end+1];else {for( int i = 0 ; i < end-start ; i++) {tmp = CMM_DnC(dim, start, start+i) + CMM_DnC(dim, start+i+1, end)+ dim[start] * dim[start+1+i] * dim[end+1];if( tmp < smallest ) smallest = tmp;}}return smallest;}Disadvantage of this approach.이처럼 Divide & Conquer approach 로 CMM problem 의 solution 을 구하면,이라는 행렬을 구하기 위해 굉장한 중첩 연산이 필요하게된다. 행렬 하나를 위해 를 나눌 수 있는 경우의 수가 많다는 것을 의미한다.예시를 계산이 필요한 횟수.행렬들을 위와 같이 나누는 경우에도 중첩되는 연산의 수가 충분히 가시적이며, 만약 과 같은 경우 앞쪽의 괄호를 다시 Divide 하게 된다면 또 의 연산횟수가 급격히 늘어나게 된다.Alternative approach.이와 같이 Recursive definition 을 가지고 중첩되는 연산을 갖는 문제의 경우 Dynamic Programming approach 를 사용하여 문제를 해결하도록 시도할 수 있다.Solve the problem with DPD&C 에서 정의했던 대로 주어진 n 개의 행렬을 1~k 번째 행렬까지 곱한 행렬과 그 나머지를 곱한 행렬의 곱으로 문제를 나눈 후 나누어 계산된 행렬들의 연산횟수를 테이블에 저장한다.테이블의 각 원소들을 채워나가기 위해 필요한 값들은 그 테이블에 저장되어있는 값을 가져와서 계산한다.예시( M0 * M1 )( M2 * M3 * M4 * M5 ) 왼쪽과 같은 경우 왼쪽 괄호의 곱셈으로 나온 행렬과오른쪽 괄호의 곱셈으로 나온 행렬 두행렬을 곱하는 방법은 이전에 생성된 테이블값인T[ 0, 1 ] + T[ 2, 5 ] + row of M0 * row of M2 * col of M5 가 최소라고 할 수 있다.Base Tableint table[MATRIX_NUMBER][MATRIX_NUMBER] = {{0 , 999, 999, 999, 999, 999},{-1 , 0, 999, 999, 999, 999},{-1 ,-1,0, 999, 999, 999},{-1 ,-1,-1,0, 999, 999},{-1 ,-1,-1,-1, 0, 999},{-1 ,-1,-1,-1, -1, 0}};Source codeint dim[] = {3, 9, 5, 2, 7, 10, 4}, row, col;//[3 9] x [9 5] x [5 2] x [2 7] x [7 10] x [10 4]void CMM( int table[][MATRIX_NUMBER], int dim[] ) {int value, row, interval, k;// To find table[ row ][ row + interval ]for(interval = 1 ; interval < MATRIX_NUMBER ; interval++) {for(row = 0 ; row < MATRIX_NUMBER - interval ; row++) {for(k = row ; k < row + interval ; k++) {value = table[row][k] + table[k+1][row+interval]+ dim[row]*dim[k+1]*dim[row+interval+1];// About the minimumimun value,if(minimum( table[row][row+interval] , value ) == value)// separate k th matrix from other matricesnu afterward.table[row+interval][row] = k+1;table[row][row+interval] = minimum( table[row][row+interval] , value );}}}}실행 결과Find out the given problem meets the principle of optimality.주어진 문제에서 곱셈연산의 수가 최소가 되려면, 주어진 n 개의 행렬을 index k 에 의해 나누었을 때 얻을 수 있는 두 행렬의 곱셈연산이 최소가 되는 것을 찾을 수 있어야 한다. 즉 가장 작게 나뉘어진 두 행렬의 곱셈연산의 수가 최소가 되어야 한다는 의미이다. 그렇게 되기 위해서는 괄호안에 묶여있는 행렬들의 곱을 다시 divide 하여 얻게 되는 두 행렬의 곱셈 연산이 역시 최소가 되어야 한다는 것이다.Solution 을 얻기 위해 나누었던 Subproblem 들에 대한 subsolution 들이 항목 A 의 내용과 같이 최적화 원칙을 만족하므로 이 문제는 DP 로 해결하는 것이 D&C로 해결하는 것보다 더 낫다고 말할 수 있다.
주어진 문제Dynamic Programming 기법을 사용한 All pair shortest distance의 재귀에서 행렬이 하나만 있어도 그 다음 단계의 행렬을 만드는 것에 영향을 주지 않고 만들 수 있는 이유?재귀 함수부분// VERTEX_NUMBER = 5, int k 의 최초값은 VERTEX_NUMBER 로 시작.void SPTable_recursive(int arr[][VERTEX_NUMBER], int k) {int bypass_vertex = VERTEX_NUMBER - k; // 경유하는 vertex.if( k < 1 ) print(arr);else {for( int i = 0 ; i < VERTEX_NUMBER ; i++)for( int j = 0 ; j < VERTEX_NUMBER ; j++)if( i != j )arr[i][j] = min(arr[i][j] , arr[i][bypass_vertex] + arr[bypass_vertex][j] );SPTable_recursive(arr, k-1); // recursive call 부분.}}설명1*************01*************01*************0k = 1 k = 2k = 31*************01*************0k = 4 k = 5행렬을 만들 때의 전제는 이전 단계의 행렬이 만들어져서 다음단계의 행렬을 만들 때는 각 단계에서의 k 부분만 생각하면 된다는 것을 기본 전제로 한다.색칠된 부분의 값은 각 단계에서는 값이 변하지 않는다.예시1*************0K = 2k = 2 의 [ 3 , 2 ] 의 경우 경로가 3 – 2 – 2 가 되는데 참조해야 할 원소들의 값이 [ 3 , 2 ] 와 [ 2 , 2 ] 이므로 원래의 값이 들어가는 것을 알 수 있다.그 외의 원소들은 각 단계에서 색칠된 부분만을 참조하여 값이 정해진다.예시1*************0K = 4k = 4 의 [ 3 , 5 ] 를 구하는 경우 참조해야 할 원소들의 값은[ 3 , 4 ] 와 [ 4 , 5 ] 가 되는데 이 두 값은 k = 4 테이블에서 모두 색칠되어있는 부분에 속하는 것을 알 수 있다.다음 단계의 행렬을 만드는 데 이전단계의 행렬을 참조하여 만드는 것이 다음 단계의 행렬에 영항을 미치지 않은 이유를 이것에서 설명할 수 있다. 즉 다음 단계의 행렬을 만들 때 사용하는 원소들은 현재 단계에서는 절대로 변하지 않는 값들이고, 변하는 값들도 현재 단계에서는 참조되지 않는 값들이기 때문에 다음 단계의 행렬을 만드는데 전혀 영향을 주지 않는다.