# Cranium
**Repository Path**: customize_iot_deco/Cranium
## Basic Information
- **Project Name**: Cranium
- **Description**: C99实现的精简神经网络库
- **Primary Language**: C
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-09-06
- **Last Updated**: 2026-02-17
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
[](https://travis-ci.org/100/Cranium)
[](https://github.com/100/Cranium/blob/master/LICENSE)
## *Cranium* is a portable, header-only, feedforward artificial neural network library written in vanilla C99.
#### It supports fully-connected networks of arbitrary depth and structure, and should be reasonably fast as it uses a matrix-based approach to calculations. It is particularly suitable for low-resource machines or environments in which additional dependencies cannot be installed.
#### Cranium supports CBLAS integration. Simply uncomment line 7 in ```matrix.h``` to enable the BLAS ```sgemm``` function for fast matrix multiplication.
#### Check out the detailed documentation [here](https://100.github.io/Cranium/) for information on individual structures and functions.
## Features
* **Activation functions**
* sigmoid
* ReLU
* tanh
* softmax (*classification*)
* linear (*regression*)
* **Loss functions**
* Cross-entropy loss (*classification*)
* Mean squared error (*regression*)
* **Optimization algorithms**
* Batch Gradient Descent
* Stochastic Gradient Descent
* Mini-Batch Stochastic Gradient Descent
* **L2 Regularization**
* **Learning rate annealing**
* **Simple momentum**
* **Fan-in weight initialization**
* **CBLAS support for fast matrix multiplication**
* **Serializable networks**
## Usage
Since Cranium is header-only, simply copy the ```src``` directory into your project, and ```#include "src/cranium.h"``` to begin using it.
Its only required compiler dependency is from the `````` header, so compile with ```-lm```.
If you are using CBLAS, you will also need to compile with ```-lcblas``` and include, via ```-I```, the path to wherever your particular machine's BLAS implementation is. Common ones include [OpenBLAS](http://www.openblas.net/) and [ATLAS](http://math-atlas.sourceforge.net/).
It has been tested to work perfectly fine with any level of gcc optimization, so feel free to use them.
## Example
```c
#include "cranium.h"
/*
This basic example program is the skeleton of a classification problem.
The training data should be in matrix form, where each row is a data point, and
each column is a feature.
The training classes should be in matrix form, where the ith row corresponds to
the ith training example, and each column is a 1 if it is of that class, and
0 otherwise. Each example may only be of 1 class.
*/
// create training data and target values (data collection not shown)
int rows, features, classes;
float** training;
float** classes;
// create datasets to hold the data
DataSet* trainingData = createDataSet(rows, features, training);
DataSet* trainingClasses = createDataSet(rows, classes, classes);
// create network with 2 input neurons, 1 hidden layer with sigmoid
// activation function and 5 neurons, and 2 output neurons with softmax
// activation function
srand(time(NULL));
size_t hiddenSize[] = {5};
Activation hiddenActivation[] = {sigmoid};
Network* net = createNetwork(2, 1, hiddenSize, hiddenActivation, 2, softmax);
// train network with cross-entropy loss using Mini-Batch SGD
ParameterSet params;
params.network = net;
params.data = trainingData;
params.classes = trainingClasses;
params.lossFunction = CROSS_ENTROPY_LOSS;
params.batchSize = 20;
params.learningRate = .01;
params.searchTime = 5000;
params.regularizationStrength = .001;
params.momentumFactor = .9;
params.maxIters = 10000;
params.shuffle = 1;
params.verbose = 1;
optimize(params);
// test accuracy of network after training
printf("Accuracy is %f\n", accuracy(net, trainingData, trainingClasses));
// get network's predictions on input data after training
forwardPass(net, trainingData);
int* predictions = predict(net);
free(predictions);
// save network to a file
saveNetwork(net, "network");
// free network and data
destroyNetwork(net);
destroyDataSet(trainingData);
destroyDataSet(trainingClasses);
// load previous network from file
Network* previousNet = readNetwork("network");
destroyNetwork(previousNet);
```
## Building and Testing
To run tests, look in the ```tests``` folder.
The ```Makefile``` has commands to run each batch of unit tests, or all of them at once.
## Contributing
Feel free to send a pull request if you want to add any features or if you find a bug.
Check the issues tab for some potential things to do.