The main processing class of a neural network. Performs calculations for all layers. More...
#include <Layers_Processor.h>
Classes | |
struct | Thread_Data |
Data that should be passed to each processing thread. Contains unique per-thread data and some parent data including pointer to the Layers_Processor. More... | |
Public Member Functions | |
int | Propagate () |
Propagates network input through all layers and calculates network output. Used in training and operation modes. | |
int | Back_Propagate () |
Propagates network input through all layers from last to the first and calculates next weights vectors for all neurons. Used in training mode. | |
Layers_Processor (int threads_count, Neural_Net *net) | |
Constructor, takes in the number of threads to run in parallel. Usually values equal to or a bit higher than physical CPUs/cores count should be used for optimal performance. | |
~Layers_Processor () | |
Destructor, frees all resources and gracefully closes all running threads (could take some additional milliseconds because it waits on threads to complete). | |
Protected Member Functions | |
void | Process (Thread_Data *data) |
Method representing each running separate thread inside Layers_Processor class. Takes in thread setup data. | |
void | Stop_Threads (Self_Lock &cage) |
Thread stopper with infinite wait for thread close of each running thread. Takes in Self_Lock object that will be used to pause calling thread until all threads are finished. | |
Protected Attributes | |
int | threads_count_ |
Shows how many threads are used for processing current set of layers. | |
std::vector< Thread_Data > | thread_data_ |
Holds Thread_Data information on all threads that are under Layers_Processor control. | |
Neural_Net * | net_ |
Pointer to parent Neural_Net object. | |
Self_Lock | cage_ |
Described in Thread_Data::lock. |
The main processing class of a neural network. Performs calculations for all layers.
Its role is to make computations performed on neural network layers parallel - distribute tasks equally between multiple processors (cores) by using multiple processing threads.
Current algorithm is the following: if an object was constructed with number of cores = N then N neurons of each layer will be processed in parallel. When the first thread finished calculation of neuron 1 it chooses the next neuron to calculate simply by doing 1 + N (current neuron + N increment). Nth thread is doing the same, it processes Nth neuron then increments index by N thus choosing the next neuron with index N+N.
All threads start processing each layer with different neuron indexes (1,2,...,N) and because increment is N there is no overlapping (all threads calculate different neurons, there is no case when multiple threads are calculating the same neuron). Please note that index in this example is 1-based.