34 lines
2.9 KiB
Markdown
34 lines
2.9 KiB
Markdown
# nn - Neural Networks in C
|
|
|
|
This repository implements various neural networks in C, focusing mainly on targetting embedded systems or creating hardware accelerators (FPGA-Based, ASIC, etc.) \
|
|
This project was created as part of my independent study course, where I am currently researching the design of hardware accelerators for high-performance workloads
|
|
|
|
### current implementations (project index)
|
|
`snn.c` - A simple feedforward neural network written in ~150loc. Depends on c native libraries and [GSL](https://www.gnu.org/software/gsl/) \
|
|
`cnn.c` - Implements a fully featured cnn library in ~600loc. Depends solely on C native libraries \
|
|
`cnn-hls.c` - The version of `cnn.c` with HLS specific optimizations (Pragmas, Systolic Array Mutliplication, etc.); aims at being synthesized through Vitus HLS to create a FPGA Based CNN Accelerator \
|
|
`mnist.c` - Driver code for `cnn.c` which trains on the [MNIST](https://yann.lecun.com/exdb/mnist/) dataset
|
|
|
|
### usage
|
|
`mnist.c` is a great example of how the library is used, but basic usage boils down to a few simple things: \
|
|
|
|
1) Importing `cnn.c` into your code
|
|
2) Creating a network and creating layers:
|
|
```c
|
|
// an example of a lenet-5 inspired 8 layer network
|
|
Network* network = create_network(8);
|
|
network->layers[0] = create_input(IMG_HEIGHT, IMG_WIDTH, 1);
|
|
network->layers[1] = create_conv(IMG_HEIGHT, IMG_WIDTH, 1, 6, 5, 1, 2);
|
|
network->layers[2] = create_maxpool(network->layers[1]->height, network->layers[1]->width, network->layers[1]->channels, 2, 2);
|
|
network->layers[3] = create_conv(network->layers[2]->height, network->layers[2]->width, network->layers[2]->channels, 16, 5, 1, 0);
|
|
network->layers[4] = create_maxpool(network->layers[3]->height, network->layers[3]->width, network->layers[3]->channels, 2, 2);
|
|
network->layers[5] = create_fc(120, network->layers[4]->height * network->layers[4]->width * network->layers[4]->channels, a_sigmoid);
|
|
network->layers[6] = create_fc(84, 120, a_sigmoid);
|
|
network->layers[7] = create_fc(NUM_CLASSES, 84, a_softmax);
|
|
```
|
|
3) Forward and backpropogation through the Network!
|
|
|
|
## Project Overview and Explanation
|
|
### Abstract
|
|
For my project, I propose an implementation of a Convolutional Neural Network based handwritten digital classifier using the MNIST dataset on a Field Programmable Gate Array (FPGA). I utilize High Level Synthesis (HLS) tool called Vitus HLS developed by [AMD/Xilinx](https://www.xilinx.com/products/boards-and-kits.html) in order to implement the accelerator through C, eliminating the need to write any code in HDL Languages such as Verilog/VHDL. To reduce any performance losses, I implement a systolic array based architecture and utilize techniques such as pipelining, loop unrolling, and memory partitioning. Through this project, I aim to highlight the potential of FPGAs to offer reduced power consumption and latency for machine learning tasks, creating a more sustainable computing environment.
|