diff options
| author | 3gg <3gg@shellblade.net> | 2023-12-16 10:21:16 -0800 |
|---|---|---|
| committer | 3gg <3gg@shellblade.net> | 2023-12-16 10:21:16 -0800 |
| commit | 653e98e029a0d0f110b0ac599e50406060bb0f87 (patch) | |
| tree | 6f909215218f6720266bde1b3f49aeddad8b1da3 /src/lib/include | |
| parent | 3df7b6fb0c65295eed4590e6f166d60e89b3c68e (diff) | |
Decouple activations from linear layer.
Diffstat (limited to 'src/lib/include')
| -rw-r--r-- | src/lib/include/neuralnet/matrix.h | 3 | ||||
| -rw-r--r-- | src/lib/include/neuralnet/neuralnet.h | 51 |
2 files changed, 35 insertions, 19 deletions
diff --git a/src/lib/include/neuralnet/matrix.h b/src/lib/include/neuralnet/matrix.h index b7281bf..f80b985 100644 --- a/src/lib/include/neuralnet/matrix.h +++ b/src/lib/include/neuralnet/matrix.h | |||
| @@ -17,6 +17,9 @@ nnMatrix nnMatrixMake(int rows, int cols); | |||
| 17 | /// Delete a matrix and free its internal memory. | 17 | /// Delete a matrix and free its internal memory. |
| 18 | void nnMatrixDel(nnMatrix*); | 18 | void nnMatrixDel(nnMatrix*); |
| 19 | 19 | ||
| 20 | /// Construct a matrix from an array of values. | ||
| 21 | nnMatrix nnMatrixFromArray(int rows, int cols, const R values[]); | ||
| 22 | |||
| 20 | /// Move a matrix. | 23 | /// Move a matrix. |
| 21 | /// | 24 | /// |
| 22 | /// |in| is an empty matrix after the move. | 25 | /// |in| is an empty matrix after the move. |
diff --git a/src/lib/include/neuralnet/neuralnet.h b/src/lib/include/neuralnet/neuralnet.h index 05c9406..f122c2a 100644 --- a/src/lib/include/neuralnet/neuralnet.h +++ b/src/lib/include/neuralnet/neuralnet.h | |||
| @@ -1,32 +1,45 @@ | |||
| 1 | #pragma once | 1 | #pragma once |
| 2 | 2 | ||
| 3 | #include <neuralnet/matrix.h> | ||
| 3 | #include <neuralnet/types.h> | 4 | #include <neuralnet/types.h> |
| 4 | 5 | ||
| 5 | typedef struct nnMatrix nnMatrix; | ||
| 6 | |||
| 7 | typedef struct nnNeuralNetwork nnNeuralNetwork; | 6 | typedef struct nnNeuralNetwork nnNeuralNetwork; |
| 8 | typedef struct nnQueryObject nnQueryObject; | 7 | typedef struct nnQueryObject nnQueryObject; |
| 9 | 8 | ||
| 10 | /// Neuron activation. | 9 | /// Linear layer parameters. |
| 11 | typedef enum nnActivation { | 10 | /// |
| 12 | nnIdentity, | 11 | /// Either one of the following must be set: |
| 12 | /// a) Training: input and output sizes. | ||
| 13 | /// b) Inference: weights + biases. | ||
| 14 | typedef struct nnLinearParams { | ||
| 15 | int input_size; | ||
| 16 | int output_size; | ||
| 17 | nnMatrix weights; | ||
| 18 | nnMatrix biases; | ||
| 19 | } nnLinearParams; | ||
| 20 | |||
| 21 | /// Layer type. | ||
| 22 | typedef enum nnLayerType { | ||
| 23 | nnLinear, | ||
| 13 | nnSigmoid, | 24 | nnSigmoid, |
| 14 | nnRelu, | 25 | nnRelu, |
| 15 | } nnActivation; | 26 | } nnLayerType; |
| 27 | |||
| 28 | /// Neural network layer. | ||
| 29 | typedef struct nnLayer { | ||
| 30 | nnLayerType type; | ||
| 31 | union { | ||
| 32 | nnLinearParams linear; | ||
| 33 | }; | ||
| 34 | } nnLayer; | ||
| 16 | 35 | ||
| 17 | /// Create a network. | 36 | /// Create a network. |
| 18 | nnNeuralNetwork* nnMakeNet( | 37 | nnNeuralNetwork* nnMakeNet( |
| 19 | int num_layers, const int* layer_sizes, const nnActivation* activations); | 38 | const nnLayer* layers, int num_layers, int input_size); |
| 20 | 39 | ||
| 21 | /// Delete the network and free its internal memory. | 40 | /// Delete the network and free its internal memory. |
| 22 | void nnDeleteNet(nnNeuralNetwork**); | 41 | void nnDeleteNet(nnNeuralNetwork**); |
| 23 | 42 | ||
| 24 | /// Set the network's weights. | ||
| 25 | void nnSetWeights(nnNeuralNetwork*, const R* weights); | ||
| 26 | |||
| 27 | /// Set the network's biases. | ||
| 28 | void nnSetBiases(nnNeuralNetwork*, const R* biases); | ||
| 29 | |||
| 30 | /// Query the network. | 43 | /// Query the network. |
| 31 | /// | 44 | /// |
| 32 | /// |input| is a matrix of inputs, one row per input and as many columns as the | 45 | /// |input| is a matrix of inputs, one row per input and as many columns as the |
| @@ -42,10 +55,10 @@ void nnQueryArray( | |||
| 42 | 55 | ||
| 43 | /// Create a query object. | 56 | /// Create a query object. |
| 44 | /// | 57 | /// |
| 45 | /// The query object holds all the internal memory required to query a network. | 58 | /// The query object holds all the internal memory required to query a network |
| 46 | /// Query objects allocate all memory up front so that network queries can run | 59 | /// with batches of the given size. Memory is allocated up front so that network |
| 47 | /// without additional memory allocation. | 60 | /// queries can run without additional memory allocation. |
| 48 | nnQueryObject* nnMakeQueryObject(const nnNeuralNetwork*, int num_inputs); | 61 | nnQueryObject* nnMakeQueryObject(const nnNeuralNetwork*, int batch_size); |
| 49 | 62 | ||
| 50 | /// Delete the query object and free its internal memory. | 63 | /// Delete the query object and free its internal memory. |
| 51 | void nnDeleteQueryObject(nnQueryObject**); | 64 | void nnDeleteQueryObject(nnQueryObject**); |
| @@ -60,7 +73,7 @@ int nnNetInputSize(const nnNeuralNetwork*); | |||
| 60 | int nnNetOutputSize(const nnNeuralNetwork*); | 73 | int nnNetOutputSize(const nnNeuralNetwork*); |
| 61 | 74 | ||
| 62 | /// Return the layer's input size. | 75 | /// Return the layer's input size. |
| 63 | int nnLayerInputSize(const nnMatrix* weights); | 76 | int nnLayerInputSize(const nnNeuralNetwork*, int layer); |
| 64 | 77 | ||
| 65 | /// Return the layer's output size. | 78 | /// Return the layer's output size. |
| 66 | int nnLayerOutputSize(const nnMatrix* weights); | 79 | int nnLayerOutputSize(const nnNeuralNetwork*, int layer); |
