지노랩 /JinoLab
5. 단일 입력·다중 출력 퍼셉트론 구현하기 본문
단일 입력·다중 출력 퍼셉트론 구현하기
이번 글에서는 하나의 입력값으로 여러 개의 출력값을 동시에 예측하는 신경망 구조를 C 언어로 구현해 보겠습니다. 입력이 스칼라(scalar)인 반면, 가중치와 출력은 1차원 배열(vector)로 다루는 부분에 주목하세요.
1. 아키텍처 이해
flowchart LR
Input[감정 상태: sad]
--> Mult0[× w₀] --> Out0[온도 예측 y₀]
--> Mult1[× w₁] --> Out1[습도 예측 y₁]
--> Mult2[× w₂] --> Out2[공기질 예측 y₂]
- 입력(input): 스칼라 값 sad
- 가중치(weights): 길이 3짜리 배열 {w₀, w₁, w₂}
- 출력(outputs): 길이 3짜리 배열 {y₀, y₁, y₂}
- 계산식:
- y_i = sad × w_i (i = 0,1,2)
2. 헤더 파일: simple_nn.h
#ifndef SIMPLE_NN_H
#define SIMPLE_NN_H
/**
* @brief 단일 입력·다중 출력 퍼셉트론 연산
* @param input 스칼라 입력값
* @param weights 가중치 배열 (크기 n_outputs)
* @param outputs 결과 저장 배열 (크기 n_outputs)
* @param n_outputs 출력 개수
*/
void elementwise_multiply(double input,
const double *weights,
double *outputs,
int n_outputs);
#endif // SIMPLE_NN_H
- 함수 원형 선언으로, 프로젝트 어디서나 불러 쓸 수 있도록 합니다.
3. 구현 파일: simple_nn.c
#include "simple_nn.h"
void elementwise_multiply(double input,
const double *weights,
double *outputs,
int n_outputs) {
for (int i = 0; i < n_outputs; i++) {
outputs[i] = input * weights[i];
}
}
- for 루프를 사용해 각 가중치와 입력값을 곱한 뒤, 대응하는 인덱스의 출력 배열에 저장합니다.
4. 메인 파일 수정: main.c
#include <stdio.h>
#include "simple_nn.h"
// 매크로 정의로 가독성 향상
#define SAD_INPUT 0.9
#define IDX_TEMP_PRED 0 // 온도 예측은 outputs[0]
#define IDX_HUMI_PRED 1 // 습도 예측은 outputs[1]
#define IDX_AQ_PRED 2 // 공기질 예측은 outputs[2]
#define N_OUTPUTS 3 // 출력 개수
int main(void) {
double outputs[N_OUTPUTS]; // 예측값 저장 버퍼
// 순서대로 온도, 습도, 공기질 가중치
double weights[N_OUTPUTS] = {-20.0, 95.0, 21.0};
// 퍼셉트론 연산 호출
elementwise_multiply(SAD_INPUT, weights, outputs, N_OUTPUTS);
// 결과 출력
printf("예측 온도 : %.2f\n", outputs[IDX_TEMP_PRED]);
printf("예측 습도 : %.2f\n", outputs[IDX_HUMI_PRED]);
printf("예측 공기질 : %.2f\n", outputs[IDX_AQ_PRED]);
return 0;
}
- #define으로 입력값, 인덱스, 출력 개수를 상수화해 실수를 방지합니다.
- weights[] 배열을 통해 각 출력별 가중치를 지정했습니다.
5. 빌드 & 실행
gcc -o SimpleNN main.c simple_nn.c
./SimpleNN
출력 예시:
예측 온도 : -18.00
예측 습도 : 85.50
예측 공기질 : 18.90
6. 정리 및 확장 아이디어
- 핵심 로직:
- outputs[i] = input * weights[i];
- 확장 과제:
- 다차원 입력을 받는 다중 입력·다중 출력 네트워크로 일반화
- 편향(bias) 추가: outputs[i] = input * weights[i] + bias[i]
- 활성화 함수 적용: ReLU, Sigmoid 등
- 경사하강법 구현: 가중치·편향을 데이터에 맞춰 학습
이번 예제를 바탕으로, 보다 복잡한 신경망 구조와 학습 알고리즘을 단계별로 구현해 보세요. 다음 포스팅에서는 다층 퍼셉트론(Multi‑Layer Perceptron) 과 역전파(Backpropagation) 를 소개합니다.
'프로그래밍 > C언어를 이용한 Deep Learning' 카테고리의 다른 글
| 7. 다중 입력·단일 출력 퍼셉트론을 C 언어로 (1) | 2025.08.02 |
|---|---|
| 6. 3가지 입력(온도·습도·공기질)으로 하나의 출력(행복/슬픔 지수) (2) | 2025.08.01 |
| 4. 단일 입력·다중 출력(Single Input, Multiple Output) 신경망(perceptron) 구조 (2) | 2025.07.30 |
| 3. C 언어 단일 입력·단일 출력 퍼셉트론 (1) | 2025.07.29 |
| 2. 단일 입력·단일 출력 신경망 구조 (1) | 2025.07.28 |