지노랩 /JinoLab

7. 다중 입력·단일 출력 퍼셉트론을 C 언어로 본문

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

7. 다중 입력·단일 출력 퍼셉트론을 C 언어로

지노랩/JinoLab 2025. 8. 2. 09:52

 

1. 네트워크 아키텍처

입력 벡터: [x₀(온도), x₁(습도), x₂(공기질)]
가중치 벡터: [w₀,       w₁,       w₂      ]
                ↓          ↓          ↓
            x₀·w₀      x₁·w₁      x₂·w₂
                ↘          ↓          ↙
                 ─────────⊕─────────
                          ↓
                   y_pred = ∑ xᵢ·wᵢ  
  • 입력(features): 온도(x₀), 습도(x₁), 공기질(x₂)
  • 가중치(weights): 각 특성별 중요도를 나타내는 파라미터 w₀, w₁, w₂
  • 출력(prediction): 가중합(weighted sum)ypred=x0w0+x1w1+x2w2 y_{\text{pred}} = x_0 w_0 + x_1 w_1 + x_2 w_2

2. 의사코드(Pseudocode)

function weighted_sum(inputs[ ], weights[ ], n):
    sum = 0
    for i = 0 to n-1:
        sum += inputs[i] * weights[i]
    return sum
  • inputs[i]: i번째 입력
  • weights[i]: i번째 가중치
  • n: 입력(가중치) 개수

3. C 언어 구현

헤더 파일: simple_nn.h

#ifndef SIMPLE_NN_H
#define SIMPLE_NN_H

/**
 * @brief 다중 입력·단일 출력 퍼셉트론 예측 함수
 * @param inputs    입력 배열
 * @param weights   가중치 배열
 * @param n_inputs  배열 길이 (입력 개수)
 * @return          예측값 (가중합)
 */
double weighted_sum_predict(const double *inputs,
                            const double *weights,
                            int n_inputs);

#endif // SIMPLE_NN_H

구현 파일: simple_nn.c

#include "simple_nn.h"

double weighted_sum_predict(const double *inputs,
                            const double *weights,
                            int n_inputs) {
    double sum = 0.0;
    for (int i = 0; i < n_inputs; i++) {
        sum += inputs[i] * weights[i];
    }
    return sum;
}

메인 파일: main.c

#include <stdio.h>
#include "simple_nn.h"

// 입력(특성) 개수
#define N_FEATURES 3

int main(void) {
    // 3가지 특성(온도, 습도, 공기질)의 첫 번째 샘플
    double features[N_FEATURES] = {28.0, 65.0,  75.0};
    // 각 특성에 대응하는 가중치
    double weights [N_FEATURES] = { 0.5,  0.2,  0.8};

    // 예측 수행
    double y_pred = weighted_sum_predict(features, weights, N_FEATURES);

    // 결과 출력
    printf("예측 결과 (행복지수) : %.2f\n", y_pred);

    return 0;
}

4. 빌드 & 실행

gcc -o SimpleNN main.c simple_nn.c
./SimpleNN
예측 결과 (행복지수) : 77.10

5. 코드 설명 및 팁

  1. 헤더 파일 분리
    • 함수 원형을 선언해 모듈화
  2. 가중합 연산
    • for 루프로 각 입력·가중치 곱을 누적
  3. 상수화
    • #define N_FEATURES로 입력 개수를 상수화해 유지보수성 향상
  4. 확장 아이디어
    • 편향(bias) 추가: sum += b
    • 활성화 함수(ReLU, Sigmoid) 적용: y = f(sum)
    • 다층 퍼셉트론(MLP) 구조로 확대

6. 다음 단계

  • 역전파(Backpropagation) 구현해 가중치 학습하기
  • 배치 처리(Batch Processing) 로 다수의 샘플에 한 번에 예측 적용
  • 다양한 활성화 함수정규화 기법 실습

이 튜토리얼을 시작으로, 직접 C 언어로 신경망의 핵심 알고리즘을 구현하고 실험해 보세요. 다음 포스팅에서는 역전파 알고리즘과 학습 과정을 상세히 다룹니다!