지노랩 /JinoLab

5. 단일 입력·다중 출력 퍼셉트론 구현하기 본문

프로그래밍/C언어를 이용한 Deep Learning

5. 단일 입력·다중 출력 퍼셉트론 구현하기

지노랩/JinoLab 2025. 7. 31. 09:45

단일 입력·다중 출력 퍼셉트론 구현하기

이번 글에서는 하나의 입력값으로 여러 개의 출력값을 동시에 예측하는 신경망 구조를 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. 정리 및 확장 아이디어

  1. 핵심 로직:
  2. outputs[i] = input * weights[i];
  3. 확장 과제:
    • 다차원 입력을 받는 다중 입력·다중 출력 네트워크로 일반화
    • 편향(bias) 추가: outputs[i] = input * weights[i] + bias[i]
    • 활성화 함수 적용: ReLU, Sigmoid 등
    • 경사하강법 구현: 가중치·편향을 데이터에 맞춰 학습

이번 예제를 바탕으로, 보다 복잡한 신경망 구조와 학습 알고리즘을 단계별로 구현해 보세요. 다음 포스팅에서는 다층 퍼셉트론(Multi‑Layer Perceptron)역전파(Backpropagation) 를 소개합니다.