2025-01-17 00:26:17 -06:00
2025-01-17 00:26:17 -06:00
2025-01-16 22:03:28 -06:00
2025-01-16 22:03:28 -06:00
2025-01-17 00:26:17 -06:00
2024-11-29 12:30:05 -06:00
2025-01-16 22:03:28 -06:00
2025-01-16 22:03:28 -06:00

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
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 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:
// 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);
  1. 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 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.

Description
neural networks in c99
Readme 11 MiB
Languages
C 100%