2018-03-29 22:33:19 +03:00
|
|
|
![](img/logo.PNG)
|
2018-03-27 05:09:24 +03:00
|
|
|
|
2018-03-31 02:52:20 +03:00
|
|
|
Tinn (Tiny Neural Network) is a 200 line dependency free neural network library written in C99.
|
2018-03-27 05:09:24 +03:00
|
|
|
|
2018-04-11 19:18:06 +03:00
|
|
|
For a demo on how to learn hand written digits, get some training data:
|
2018-03-30 23:10:23 +03:00
|
|
|
|
|
|
|
wget http://archive.ics.uci.edu/ml/machine-learning-databases/semeion/semeion.data
|
|
|
|
|
2018-04-11 04:50:31 +03:00
|
|
|
And if you're on Linux / MacOS just build and run Tinn with the test file:
|
2018-03-27 05:09:24 +03:00
|
|
|
|
2018-03-29 08:08:19 +03:00
|
|
|
make; ./tinn
|
2018-03-30 23:12:51 +03:00
|
|
|
|
|
|
|
If you're on Windows it's:
|
|
|
|
|
|
|
|
mingw32-make & tinn.exe
|
2018-04-11 04:37:19 +03:00
|
|
|
|
|
|
|
The training data consists of hand written digits written both slowly and quickly.
|
|
|
|
Each line in the data set corresponds to one handwritten digit. Each digit is 16x16 pixels in size
|
|
|
|
giving 256 inputs to the neural network.
|
|
|
|
|
2018-04-11 05:48:22 +03:00
|
|
|
At the end of the line 10 digits signify the hand written digit:
|
2018-04-11 04:37:19 +03:00
|
|
|
|
|
|
|
0: 1 0 0 0 0 0 0 0 0 0
|
|
|
|
1: 0 1 0 0 0 0 0 0 0 0
|
|
|
|
2: 0 0 1 0 0 0 0 0 0 0
|
|
|
|
3: 0 0 0 1 0 0 0 0 0 0
|
|
|
|
4: 0 0 0 0 1 0 0 0 0 0
|
|
|
|
...
|
|
|
|
9: 0 0 0 0 0 0 0 0 0 1
|
|
|
|
|
|
|
|
This gives 10 outputs to the neural network. The test program will output the
|
|
|
|
accuracy for each digit. Expect above 99% accuracy for the correct digit, and
|
2018-04-11 05:48:22 +03:00
|
|
|
less that 0.1% accuracy for the other digits.
|
2018-04-11 04:46:22 +03:00
|
|
|
|
2018-04-11 19:23:23 +03:00
|
|
|
# Features
|
|
|
|
|
|
|
|
* Portable - Runs on Windows, MacOS, Linux, and embedded chips like ARM, AVR, and Microchip
|
|
|
|
|
|
|
|
* Sigmoidal activation.
|
|
|
|
|
|
|
|
* One hidden layer.
|
|
|
|
|
2018-04-11 05:12:35 +03:00
|
|
|
# Tips
|
|
|
|
|
|
|
|
* Tinn will never use more than the C standard library.
|
|
|
|
|
|
|
|
* Tinn is great for embedded systems. Train a model on your powerful desktop and load
|
|
|
|
it onto a microcontroller and use the analog to digital converter to predict real time events.
|
|
|
|
|
|
|
|
* The Tinn source code will always be less than 200 lines. Functions externed in the Tinn header
|
|
|
|
are protected with the _xt_ namespace standing for _externed tinn_.
|
|
|
|
|
|
|
|
* Tinn can easily be multi-threaded with a bit of ingenuity but the master branch will remain
|
|
|
|
single threaded to aid development for embedded systems.
|
|
|
|
|
|
|
|
* Tinn does not seed the random number generator. Do not forget to do so yourself.
|
|
|
|
|
|
|
|
* Always shuffle your input data. Shuffle again after every training iteration.
|
|
|
|
|
|
|
|
* Get greater training accuracy by annealing your learning rate. For instance, multiply
|
|
|
|
your learning rate by 0.99 every training iteration. This will zero in on a good learning minima.
|
|
|
|
|
2018-04-11 04:46:22 +03:00
|
|
|
# Disclaimer
|
|
|
|
|
2018-04-11 05:51:35 +03:00
|
|
|
Tinn is a practice in minimalism.
|
|
|
|
|
2018-04-11 04:46:22 +03:00
|
|
|
Tinn is not a fully featured neural network C library like Kann, or Genann:
|
|
|
|
|
|
|
|
https://github.com/attractivechaos/kann
|
|
|
|
|
|
|
|
https://github.com/codeplea/genann
|