지노랩 /JinoLab

6. 3가지 입력(온도·습도·공기질)으로 하나의 출력(행복/슬픔 지수) 본문

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

6. 3가지 입력(온도·습도·공기질)으로 하나의 출력(행복/슬픔 지수)

지노랩/JinoLab 2025. 8. 1. 09:50

 

1. 네트워크 구조

flowchart LR
    Temp[온도 x₀] --> Mult0[× w₀] --> Sum[+] 
    Humi[습도 x₁] --> Mult1[× w₁] --> Sum
    AQ[공기질 x₂] --> Mult2[× w₂] --> Sum --> y_pred
  • 입력:
    • x0x_0: 온도
    • x1x_1: 습도
    • x2x_2: 공기질
  • 가중치:
    • w0w_0: 온도 가중치
    • w1w_1: 습도 가중치
    • w2w_2: 공기질 가중치
  • 출력 (ypredy_{\text{pred}})는 다음과 같이 계산합니다.ypred=x0w0+x1w1+x2w2 y_{\text{pred}} = x_0 w_0 + x_1 w_1 + x_2 w_2이때 xiwi\displaystyle x_i w_i 각 항은 “단일 입력·단일 출력” 네트워크의 예측값이며, 이들을 모두 더한 것이 바로 가중합(weighted sum) 결과입니다.

2. 의사코드(Pseudocode)

function weighted_sum_predict(inputs[3], weights[3]) → double:
    sum = 0
    for i from 0 to 2:
        sum += inputs[i] * weights[i]
    return sum
  • inputs[i]: i번째 입력값
  • weights[i]: i번째 가중치
  • sum에 모든 xiwix_i w_i를 누적하여 최종 예측값 반환

3. C 언어 구현

헤더 파일: simple_nn.h

#ifndef SIMPLE_NN_H
#define SIMPLE_NN_H

/**
 * @brief 다중 입력·단일 출력 퍼셉트론 예측 함수
 * @param inputs     입력값 배열 (크기 n_inputs)
 * @param weights    가중치 배열 (크기 n_inputs)
 * @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) {
    // 예시 입력값: 온도, 습도, 공기질
    double features[N_FEATURES] = {25.0, 60.0,  80.0};

    // 각 특성별 가중치: 온도, 습도, 공기질 순
    double weights[N_FEATURES]  = { 0.8,  0.1,  0.3};

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

    // 해석: 예) y_pred > 임계치 → “행복” / ≤ 임계치 → “슬픔”
    printf("예측값 (행복지수): %.2f\n", y_pred);

    return 0;
}

4. 빌드 & 실행

gcc -o SimpleNN main.c simple_nn.c
./SimpleNN

출력 예시:

예측값 (행복지수): 34.30

5. 응용 및 확장

  1. 편향(bias) 추가

  1. 활성화 함수 도입
    • ReLU, Sigmoid, Tanh 등으로 비선형성 부여
  2. 다층 퍼셉트론(MLP)
    • 은닉층(hidden layer)과 역전파(backpropagation) 구현
  3. 배치 처리(Batch Processing)
    • 여러 데이터 포인트를 한 번에 예측하도록 일반화

위 기본 구조를 바탕으로, 실제 딥러닝 프레임워크에서 사용하는 원리(가중치 학습·역전파 등)를 단계적으로 구현해 보세요. 다음 포스팅에서는 활성화 함수와 **경사하강법(Gradient Descent)**을 적용하는 과정을 다룹니다.