https://github.com/matteodonati/MNIST_classification_in_C
GitHub - matteodonati/MNIST_classification_in_C: Simple tool, written entirely in C, which allows MNIST digits classification us
Simple tool, written entirely in C, which allows MNIST digits classification using multilayer perceptrons. - matteodonati/MNIST_classification_in_C
github.com
먼저 사용한 소스파일은 위의 오픈 소스를 사용하였다.
정말 쉽게 설명이 되어있는데,
testing, training 폴더에 MNIST PNG 파일을 넣분배하여 학습시킨다.
위와 같은 파일 구조를 가지고있으며, make 명령어만 입력하면 MNIST_classification_in_C 실행파일이 생성된다.
말나온김에 make에 대해 정리해보자
Makefile이란?
make를 통해 컴파일을 자동화시키기 위해 만든 프로그램이며, 쉘스크립트에서 일일이 매번 모든 코드를 치기힘드므로 한번 만들어놓으면 make 명령어 하나만으로 자동으로 타겟 파일을 컴파일할 수 있다.
기본적인 구성요소는 아래와 같다.
- 타겟(Target): 만들어지거나 갱신될 파일입니다. 예를 들어, 최종 실행 파일이나 객체 파일이 될 수 있습니다.
- 종속성(Dependencies): 타겟이 빌드되기 위해 필요한 파일들입니다. 예를 들어, 소스 코드 파일이나 헤더 파일이 될 수 있습니다.
- 명령어(Commands): 타겟을 생성하거나 갱신하기 위해 수행해야 하는 작업들입니다. 보통 셸 명령어로 작성됩니다.
내가 실습에서 사용했던 Makefile은 위와같다.
MNIST_classification_in_C이 만들고자 하는 타겟 파일이며, main.c, images_handler.c, neural_network_handler.c 파일이 종속성 파일들이라고 볼 수 있다.
아래 빨간 글씨가 명령어인데, gcc는 GNU C언어 컴파일러로 보면되고, -pg는 이후 다시 설명하겠다.
나머지 두 옵션인 lm과 o는 아래와 같다.
- -lm: 수학 라이브러리(libm)를 링크하기 위한 옵션입니다. 이 옵션이 포함된 이유는 코드에서 수학 함수들이 사용되었기 때문일 가능성이 큽니다.
- -o MNIST_classification_in_C: 컴파일 결과로 나오는 실행 파일의 이름을 "MNIST_classification_in_C"로 지정합니다.
결과적으로 Makefile의 역할은 Makefile은 main.c, images_handler.c, neural_network_handler.c 세 개의 C 소스 파일을 컴파일하여 MNIST_classification_in_C라는 이름의 실행 파일을 생성한다는것이다.
실행파일 MNIST_classification_in_C
그리고 이 파일을 실행하면 아래와 같은 결과를 확인할 수 있는데, 각 폴더의 사진을 읽고, 학습시킨후 test하여 accuracy를 파악하는 것을 알 수 있다.
최적화에 중점을 두기 위해 딥러닝 모델의 구조는 따로 여기서 설명하진 않겠다.
Reading ./dataset/training/0/ files.
Reading ./dataset/training/1/ files.
Reading ./dataset/training/2/ files.
Reading ./dataset/training/3/ files.
Reading ./dataset/training/4/ files.
Reading ./dataset/training/5/ files.
Reading ./dataset/training/6/ files.
Reading ./dataset/training/7/ files.
Reading ./dataset/training/8/ files.
Reading ./dataset/training/9/ files.
Reading ./dataset/testing/0/ files.
Reading ./dataset/testing/1/ files.
Reading ./dataset/testing/2/ files.
Reading ./dataset/testing/3/ files.
Reading ./dataset/testing/4/ files.
Reading ./dataset/testing/5/ files.
Reading ./dataset/testing/6/ files.
Reading ./dataset/testing/7/ files.
Reading ./dataset/testing/8/ files.
Reading ./dataset/testing/9/ files.
Shuffling samples.
Training.
Epoch: 1/10, accuracy: 0.759783, loss: 1.746183
Epoch: 2/10, accuracy: 0.861150, loss: 0.689133
Epoch: 3/10, accuracy: 0.883467, loss: 0.566282
Epoch: 4/10, accuracy: 0.896183, loss: 0.498846
Epoch: 5/10, accuracy: 0.905183, loss: 0.453839
Epoch: 6/10, accuracy: 0.912250, loss: 0.420292
Epoch: 7/10, accuracy: 0.917500, loss: 0.393635
Epoch: 8/10, accuracy: 0.922050, loss: 0.371836
Epoch: 9/10, accuracy: 0.925733, loss: 0.353492
Epoch: 10/10, accuracy: 0.929567, loss: 0.337611
Testing.
Accuracy: 0.926500, loss: 0.354491
그리고 실행파일의 명령어는 아래와 같은데,
$ ./MNIST_classification_in_C -l 1 -n 64 -e 10 -lr 0.001
각 옵션의 의미는 아래와 같다.
- -l 옵션: 숨겨진 레이어(hidden layers)의 개수를 설정합니다.
예: -l 3은 3개의 숨겨진 레이어를 사용함을 의미합니다. - -n 옵션: 각 숨겨진 레이어에 있는 뉴런(neurons)의 개수를 설정합니다.
예: -n 64은 각 숨겨진 레이어에 64개의 뉴런이 있음을 의미합니다. - -e 옵션: 학습 에포크(training epochs)의 수를 설정합니다. 에포크는 전체 데이터셋이 학습 알고리즘을 통해 한 번 훈련되는 과정입니다.
예: -e 50은 모델을 50번의 에포크 동안 훈련함을 의미합니다. - -lr 옵션: 학습 과정에서 사용되는 학습률(learning rate)을 설정합니다. 학습률은 모델이 학습할 때 가중치를 업데이트하는 크기를 결정합니다.
예: -lr 0.01은 학습률이 0.01로 설정됨을 의미합니다.
길이가 애매해서 grof내용은 다음으로 옮기겠다.
'임베디드 딥러닝' 카테고리의 다른 글
[임베디드 딥러닝] gprof 프로파일러를 이용해 딥러닝 최적화하기 - 3 (0) | 2024.08.28 |
---|---|
[임베디드 딥러닝] gprof 프로파일러를 이용해 딥러닝 최적화하기 - 2 (0) | 2024.08.28 |
[임베디드 딥러닝] 아두이노Nano에서 손글씨 인식모델 만들기 - 2 (4) | 2024.08.27 |
[임베디드 딥러닝] 아두이노Nano에서 손글씨 인식모델 만들기 - 1 (0) | 2024.08.16 |
[임베디드 딥러닝] Tensorflow Lite (2) | 2024.08.16 |