지노랩 /JinoLab

3. C 언어 단일 입력·단일 출력 퍼셉트론 본문

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

3. C 언어 단일 입력·단일 출력 퍼셉트론

지노랩/JinoLab 2025. 7. 29. 12:40

 

1. 프로젝트 생성

  1. IDE(또는 터미널)에서 새 콘솔 애플리케이션 프로젝트를 만듭니다.
    • 예: “SimpleNN”
  2. 기존 프로젝트를 복제(clone)해서 사용해도 좋습니다.
  3. 생성 후, 기본으로 잡혀 있는 main.c 외에 두 개의 파일을 추가합니다.
    • simple_nn.h (헤더 파일)
    • simple_nn.c (구현 파일)

2. 헤더 파일: simple_nn.h

#ifndef SIMPLE_NN_H
#define SIMPLE_NN_H

/**
 * @brief 단일 입력·단일 출력 퍼셉트론 예측 함수
 * @param input  관측값 (e.g., 온도)
 * @param weight 가중치
 * @return 예측값 (input × weight)
 */
double predict(double input, double weight);

#endif // SIMPLE_NN_H
  • #ifndef·#define 가드로 중복 포함을 방지합니다.
  • predict() 함수 원형(prototype)을 선언했습니다.

3. 구현 파일: simple_nn.c

#include "simple_nn.h"

double predict(double input, double weight) {
    // 가장 기본적인 순전파: 입력 × 가중치
    return input * weight;
}
  • simple_nn.h를 #include 하여 함수 원형을 참조합니다.
  • predict()는 단 한 줄로 이루어진, 가장 단순한 퍼셉트론 연산입니다.

4. 메인 파일: main.c

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

int main(void) {
    // 샘플 입력 데이터: 온도 배열
    double temperatures[] = {12.0, 23.0, 50.0, -10.0, 16.0};
    const int   N           = sizeof(temperatures) / sizeof(temperatures[0]);
    double       weight      = 1.5;  // 가중치 예시

    // 첫 세 개 값으로 테스트
    for (int i = 0; i < 3 && i < N; i++) {
        double y_pred = predict(temperatures[i], weight);
        printf("입력: %.1f°C, 예측값: %.2f\n", temperatures[i], y_pred);
    }

    return 0;
}
  • temperatures 배열에 5개의 샘플 데이터를 담았습니다.
  • weight는 1.5로 설정.
  • for 루프를 돌며 predict() 호출 후 결과를 출력합니다.

5. 빌드 & 실행

  1. 빌드
  2. gcc -o SimpleNN main.c simple_nn.c
  3. 실행
  4. ./SimpleNN
  5. 출력 예시
  6. 입력: 12.0°C, 예측값: 18.00 입력: 23.0°C, 예측값: 34.50 입력: 50.0°C, 예측값: 75.00

6. 요약 및 확장 방향

  • 핵심 연산: y_pred = input × weight
  • **퍼셉트론(perceptron)**의 가장 기초 형태로, 내부 활성화 함수 없이 선형 모델과 동일한 구조
  • 이 예제를 바탕으로 다음을 시도해 보세요:
    1. 경사하강법으로 weight 학습하기
    2. 활성화 함수(예: 시그모이드) 추가
    3. 다층 퍼셉트론(MLP) 구조로 확장

이처럼 작은 예제로부터 출발해, 하나씩 기능을 더해 나가면 여러분만의 신경망 라이브러리를 만들어 볼 수 있습니다. 다음 포스팅에서는 “경사하강법”과 “비선형 활성화 함수”를 적용해 보겠습니다. 앞으로도 꾸준히 따라와 주세요!