일관성이 없어서 모든 글을 수정 중.
카테고리, 글 내용, 저질 게시물 삭제 등 예정.
뭔가 새로운 분야였지만...
막상.. 어찌 응용을 해야할지 ㅡ_ㅡ;;......
이것과 시스템은 어떻게 연결 할 수 있을까 ㅡ_ㅡ.........
#include#include #include #include #include "NumberSet.h" TRAININGSET g_trainingSet[MAX_DATA]; // 트레이닝 데이터 // 전체 뉴런 개수 설정 #define INPUT_NEURON 32 #define HIDDEN_NEURON 20 #define OUTPUT_NEURON 10 // 인풋에서 히든, 히든에서 출력 레이어 그래프 (바이어스도 포함) double g_weight_i2h[INPUT_NEURON+1][HIDDEN_NEURON]; double g_weight_h2o[HIDDEN_NEURON+1][OUTPUT_NEURON]; /* 내부 그래프용 노드 */ double g_inputs[INPUT_NEURON] = {0,}; double g_hidden[HIDDEN_NEURON] = {0,}; double g_desire[OUTPUT_NEURON] = {0,}; double g_output[OUTPUT_NEURON] = {0,}; /* Unit Errors */ double g_err_output[OUTPUT_NEURON] = {0,}; double g_err_hidden[HIDDEN_NEURON] = {0,}; // 학습률 - c값 #define LEARN_RATE 0.2 // 시그모이드 함수 & 편미분 함수 double sigmoid( double val ) { return (1.0 / (1.0 + exp(-val))); } double sigmoidDerivative( double val ) { return ( val * (1.0 - val) ); } // 랜덤한 가중치 부여 void RandomWeight( void ) { int hidden, input, out; #define RAND_WEIGHT (((float)rand() / (float)RAND_MAX) - 0.5) for (input=0; input < INPUT_NEURON+1; input++) for (hidden=0; hidden < HIDDEN_NEURON; hidden++) g_weight_i2h[input][hidden] = RAND_WEIGHT; for (hidden = 0 ; hidden < HIDDEN_NEURON+1 ; hidden++) for (out = 0 ; out < OUTPUT_NEURON ; out++) g_weight_h2o[hidden][out] = RAND_WEIGHT; } // 각 뉴럴의 실제 계산 및 전달 (현재 뉴럴의 최종 아웃풋이 g_output에 저장됨) void feedForward( void ) { double sum; int input, hidden, out; // 인풋에서 히든레이어 계산 for (hidden=0; hidden < HIDDEN_NEURON; hidden++) { // 각 뉴런의 inputs * weight의 총 합을 계산 for (sum=.0, input=0; input < INPUT_NEURON; input++) sum += g_inputs[input] * g_weight_i2h[input][hidden]; sum += g_weight_i2h[INPUT_NEURON][hidden]; // 바이어스 g_hidden[hidden] = sigmoid(sum); // 시그모이드 함수 적용 } // 히든에서 출력레이어 계산 for (out=0; out < OUTPUT_NEURON; out++) { // 각 뉴런의 hidden * weight의 총 합을 계산 for (sum=.0,hidden=0; hidden < HIDDEN_NEURON; hidden++) sum += g_hidden[hidden] * g_weight_h2o[hidden][out]; sum += g_weight_h2o[HIDDEN_NEURON][out]; // 바이어스 g_output[out] = sigmoid( sum ); // 시그모이드 함수 적용 } } // 오차 수집후 가중치 조율 void backPropagate( void ) { int input, hidden, out; // 출력의 에러 콜렉팅 for (out=0; out < OUTPUT_NEURON; out++) // Desire 값과 실제 나온 값의 차를 결과의 미분값으로 곱함 g_err_output[out] = (g_desire[out] - g_output[out]) * sigmoidDerivative(g_output[out]); // 히든의 에러 콜렉팅 for (hidden=0; hidden < HIDDEN_NEURON; hidden++) { g_err_hidden[hidden] = .0; // 먼저 출력의 에러를 가중치를 곱하여 모두 합산 for (out=0; out < OUTPUT_NEURON; out++) g_err_hidden[hidden] += g_err_output[out] * g_weight_h2o[hidden][out]; // 출력에서와 같은 방식으로 합산된것을 히든의 결과값의 미분값을 넣음 g_err_hidden[hidden] *= sigmoidDerivative( g_hidden[hidden] ); } // 출력의 가중치 조정 for (out=0; out < OUTPUT_NEURON; out++) { // 새로운 가중치는 출력의 에러에 히든의 값을 곱하여 LEARN RATE 만큼 적용하여 더함 for (hidden=0; hidden < HIDDEN_NEURON; hidden++) g_weight_h2o[hidden][out] += LEARN_RATE * g_err_output[out] * g_hidden[hidden]; g_weight_h2o[HIDDEN_NEURON][out] += LEARN_RATE * g_err_output[out]; // 바이어스 } // 히든의 가중치 조정 for (hidden=0; hidden < HIDDEN_NEURON; hidden++) { // 출력과 동일 히든의 에러에 실제넣은값을 곱하여 LEARN RATE 만큼 적용하여 더함 for (input=0; input < INPUT_NEURON; input++) g_weight_i2h[input][hidden] += LEARN_RATE * g_err_hidden[hidden] * g_inputs[input]; g_weight_i2h[INPUT_NEURON][hidden] += LEARN_RATE * g_err_hidden[hidden]; // 바이어스 } } // 가장 정답에 가까운거 집어내기 int select( double *array ) { int i, index=0; double max = array[index]; for (i=1; i < OUTPUT_NEURON; i++) // 답은 찾아야 할테니.. if (array[i] > max) max = array[i], index = i; return index; } // 실제 프로그램 시작 int main(void) { double err; int i,j, training=0, loop=0; unsigned int temp; char test[33] = " 11 1 11 1 1 1 1 1 1111"; // 임의의 문자.. srand( (unsigned) time(NULL) ); RandomWeight(); // 랜덤한 가중치 부여 // 트레이닝 데이터 초기화 for (i=0; i<10; i++) { for (j=0; j 0; i--) swap(&g_trainingSet[i], &g_trainingSet[rand()%i]); for (i=0,temp=g_trainingSet[training].data; i >=1) g_inputs[i] = temp & MASK1; // 인풋 비트 연결 for (i=0; i >= 1) g_inputs[i] = temp & MASK1; // 입력값 연결 feedForward(); printf("실제값: %d, 추정값: %d\n", 2, select(g_output)); return 0; }
NumberSet.h
Neural Net.hwp
인공지능.exe