Dropout Layer

Implemented rng::uniform and rng::binomial for single values, vectors and matrices. implemeted dropout layers and tested it. Also fixed the validation code. Before it used y one place, now it uses y_test as it should.
This commit is contained in:
2026-05-21 15:38:49 +02:00
parent be2c193341
commit eb0a49591e
14 changed files with 395 additions and 116 deletions
@@ -0,0 +1,58 @@
#pragma once
#include "core/omp_config.h"
#include "utils/vector.h"
#include "utils/matrix.h"
#include "random/random.h"
namespace neural_networks{
template <typename T>
struct Dropout_Layer{
// Store rate, we invert it as for example for dropout
// of 0.1 we need a success rate of 0.9
T rate = T{0};
utils::Matrix<T> binary_mask;
utils::Matrix<T> _inputs;
utils::Matrix<T> outputs;
utils::Matrix<T> dinputs;
// Default Constructor
Dropout_Layer() = default;
// Constructor
Dropout_Layer(const T rate){
this->rate = T{1} - rate;
}
void forward(const utils::Matrix<T>& inputs){
// Save input values
_inputs = inputs;
// Generate binary_mask
binary_mask = rng::binomial<T>(inputs.rows(), inputs.cols(), 1, rate);
// Scale binary_mask
binary_mask = numerics::div(binary_mask, rate);
// Apply binary mask to output values
outputs = numerics::mul(binary_mask, inputs);
}
void backward(const utils::Matrix<T>& dvalues){
dinputs = numerics::mul(dvalues, binary_mask);
}
};
} // end namespace neural_networks
@@ -6,6 +6,7 @@
#include "layers/Dense_Layer.h"
#include "layers/Dropout_Layer.h"
#include "activation_functions/Activation_ReLU.h"