(
const double&x) {
return1.0 / (1.0 + std::exp(-x)); }
67double dsigmoid(
const double&x) {
returnx * (1 - x); }
74double relu(
const double&x) {
returnstd::max(0.0, x); }
81double drelu(
const double&x) {
returnx >= 0.0 ? 1.0 : 0.0; }
88double tanh(
const double&x) {
return2 / (1 + std::exp(-2 * x)) - 1; }
95double dtanh(
const double&x) {
return1 - x * x; }
106double square(
const double&x) {
returnx * x; }
128double (*activation_function)(
const double&);
129double (*dactivation_function)(
const double&);
131std::string activation;
132std::vector<std::valarray<double>> kernel;
141 DenseLayer(
const int&neurons,
conststd::string &activation,
142 conststd::pair<size_t, size_t> &kernel_shape,
143 const bool&random_kernel) {
145 if(activation ==
"sigmoid") {
148}
else if(activation ==
"relu") {
151}
else if(activation ==
"tanh") {
154}
else if(activation ==
"none") {
156activation_function =
158dactivation_function =
162std::cerr <<
"ERROR ("<< __func__ <<
") : ";
163std::cerr <<
"Invalid argument. Expected {none, sigmoid, relu, " 165std::cerr << activation << std::endl;
166std::exit(EXIT_FAILURE);
168this->activation = activation;
169this->neurons = neurons;
183 DenseLayer(
const int&neurons,
conststd::string &activation,
184 conststd::vector<std::valarray<double>> &kernel) {
186 if(activation ==
"sigmoid") {
189}
else if(activation ==
"relu") {
192}
else if(activation ==
"tanh") {
195}
else if(activation ==
"none") {
197activation_function =
199dactivation_function =
203std::cerr <<
"ERROR ("<< __func__ <<
") : ";
204std::cerr <<
"Invalid argument. Expected {none, sigmoid, relu, " 206std::cerr << activation << std::endl;
207std::exit(EXIT_FAILURE);
209this->activation = activation;
210this->neurons = neurons;
211this->kernel = kernel;
249std::vector<neural_network::layers::DenseLayer>
layers;
257 conststd::vector<std::pair<int, std::string>> &config,
258 conststd::vector<std::vector<std::valarray<double>>> &kernels) {
260 if(config.begin()->second !=
"none") {
261std::cerr <<
"ERROR ("<< __func__ <<
") : ";
263<<
"First layer can't have activation other than none got " 264<< config.begin()->second;
265std::cerr << std::endl;
266std::exit(EXIT_FAILURE);
269 if(config.size() <= 1) {
270std::cerr <<
"ERROR ("<< __func__ <<
") : ";
271std::cerr <<
"Invalid size of network, ";
272std::cerr <<
"Atleast two layers are required";
273std::exit(EXIT_FAILURE);
276 for(
size_ti = 0; i < config.size(); i++) {
278config[i].first, config[i].second, kernels[i]));
280std::cout <<
"INFO: Network constructed successfully"<< std::endl;
288std::vector<std::vector<std::valarray<double>>>
290std::vector<std::vector<std::valarray<double>>> details;
291std::vector<std::valarray<double>> current_pass = X;
292details.emplace_back(X);
293 for(
const auto&l :
layers) {
294current_pass =
multiply(current_pass, l.kernel);
295current_pass =
apply_function(current_pass, l.activation_function);
296details.emplace_back(current_pass);
314 conststd::vector<std::pair<int, std::string>> &config) {
316 if(config.begin()->second !=
"none") {
317std::cerr <<
"ERROR ("<< __func__ <<
") : ";
319<<
"First layer can't have activation other than none got " 320<< config.begin()->second;
321std::cerr << std::endl;
322std::exit(EXIT_FAILURE);
325 if(config.size() <= 1) {
326std::cerr <<
"ERROR ("<< __func__ <<
") : ";
327std::cerr <<
"Invalid size of network, ";
328std::cerr <<
"Atleast two layers are required";
329std::exit(EXIT_FAILURE);
334config[0].first, config[0].second,
335{config[0].first, config[0].first},
false));
337 for(
size_ti = 1; i < config.size(); i++) {
339config[i].first, config[i].second,
340{config[i - 1].first, config[i].first},
true));
342std::cout <<
"INFO: Network constructed successfully"<< std::endl;
380std::pair<std::vector<std::vector<std::valarray<double>>>,
381std::vector<std::vector<std::valarray<double>>>>
383 const bool&normalize,
const int&slip_lines = 1) {
384std::ifstream in_file;
385in_file.open(file_name.c_str(), std::ios::in);
387 if(!in_file.is_open()) {
388std::cerr <<
"ERROR ("<< __func__ <<
") : ";
389std::cerr <<
"Unable to open file: "<< file_name << std::endl;
390std::exit(EXIT_FAILURE);
392std::vector<std::vector<std::valarray<double>>> X,
396 for(
inti = 0; i < slip_lines; i++) {
397std::getline(in_file, line,
'\n');
400 while(!in_file.eof() && std::getline(in_file, line,
'\n')) {
401std::valarray<double> x_data,
403std::stringstream ss(line);
405 while(std::getline(ss, token,
',')) {
411y_data.resize(this->layers.back().neurons);
413 if(y_data.size() > 1) {
414y_data[x_data[x_data.size() - 1]] = 1;
418y_data[0] = x_data[x_data.size() - 1];
422y_data.resize(this->layers.back().neurons);
424 if(y_data.size() > 1) {
425y_data[x_data[x_data.size() - 1]] = 1;
429y_data[0] = x_data[x_data.size() - 1];
434X.push_back({x_data});
435Y.push_back({y_data});
443 returnmake_pair(X, Y);
452 conststd::vector<std::valarray<double>> &X) {
465 conststd::vector<std::vector<std::valarray<double>>> &X) {
467std::vector<std::vector<std::valarray<double>>> predicted_batch(
469 for(
size_ti = 0; i < X.size(); i++) {
473 returnpredicted_batch;
485 void fit(
conststd::vector<std::vector<std::valarray<double>>> &X_,
486 conststd::vector<std::vector<std::valarray<double>>> &Y_,
487 const int&epochs = 100,
const double&learning_rate = 0.01,
488 const size_t&batch_size = 32,
const bool&shuffle =
true) {
489std::vector<std::vector<std::valarray<double>>> X = X_, Y = Y_;
491 if(X.size() != Y.size()) {
492std::cerr <<
"ERROR ("<< __func__ <<
") : ";
493std::cerr <<
"X and Y in fit have different sizes"<< std::endl;
494std::exit(EXIT_FAILURE);
496std::cout <<
"INFO: Training Started"<< std::endl;
497 for(
intepoch = 1; epoch <= epochs; epoch++) {
503std::chrono::high_resolution_clock::now();
507 for(
size_tbatch_start = 0; batch_start < X.size();
508batch_start += batch_size) {
509 for(
size_ti = batch_start;
510i < std::min(X.size(), batch_start + batch_size); i++) {
511std::vector<std::valarray<double>> grad, cur_error,
516std::vector<std::vector<std::valarray<double>>> gradients;
517gradients.resize(this->layers.size());
519 for(
size_ti = 0; i < gradients.size(); i++) {
521gradients[i],
get_shape(this->layers[i].kernel));
524cur_error = predicted - Y[i];
533 for(
size_tj = this->layers.size() - 1; j >= 1; j--) {
539this->layers[j].dactivation_function));
546gradients[j] = gradients[j] + grad / double(batch_size);
549 for(
size_tj = this->layers.size() - 1; j >= 1; j--) {
551this->layers[j].kernel = this->layers[j].kernel -
552gradients[j] * learning_rate;
557std::chrono::high_resolution_clock::now();
560std::chrono::duration_cast<std::chrono::microseconds>(stop -
564std::cout.precision(4);
566std::cout <<
"Training: Epoch "<< epoch <<
'/'<< epochs;
567std::cout <<
", Loss: "<< loss;
568std::cout <<
", Accuracy: "<< acc;
569std::cout <<
", Taken time: "<< duration.count() / 1e6
571std::cout << std::endl;
587 void fit_from_csv(
conststd::string &file_name,
const bool&last_label,
588 const int&epochs,
const double&learning_rate,
589 const bool&normalize,
const int&slip_lines = 1,
590 const size_t&batch_size = 32,
591 const bool&shuffle =
true) {
596this->
fit(
data.first,
data.second, epochs, learning_rate, batch_size,
606 void evaluate(
conststd::vector<std::vector<std::valarray<double>>> &X,
607 conststd::vector<std::vector<std::valarray<double>>> &Y) {
608std::cout <<
"INFO: Evaluation Started"<< std::endl;
609 doubleacc = 0, loss = 0;
610 for(
size_ti = 0; i < X.size(); i++) {
612std::vector<std::valarray<double>> pred =
626std::cout <<
"Evaluation: Loss: "<< loss;
627std::cout <<
", Accuracy: "<< acc << std::endl;
639 const bool&normalize,
const int&slip_lines = 1) {
653std::string file_name = _file_name;
655 if(file_name.find(
".model") == file_name.npos) {
656file_name +=
".model";
658std::ofstream out_file;
660out_file.open(file_name.c_str(),
661std::ofstream::out | std::ofstream::trunc);
663 if(!out_file.is_open()) {
664std::cerr <<
"ERROR ("<< __func__ <<
") : ";
665std::cerr <<
"Unable to open file: "<< file_name << std::endl;
666std::exit(EXIT_FAILURE);
708out_file <<
layers.size();
709out_file << std::endl;
710 for(
const auto&layer : this->layers) {
711out_file << layer.neurons <<
' '<< layer.activation << std::endl;
712 const autoshape =
get_shape(layer.kernel);
713out_file << shape.first <<
' '<< shape.second << std::endl;
714 for(
const auto&row : layer.kernel) {
715 for(
const auto&val : row) {
716out_file << val <<
' ';
718out_file << std::endl;
721std::cout <<
"INFO: Model saved successfully with name : ";
722std::cout << file_name << std::endl;
733std::ifstream in_file;
734in_file.open(file_name.c_str());
736 if(!in_file.is_open()) {
737std::cerr <<
"ERROR ("<< __func__ <<
") : ";
738std::cerr <<
"Unable to open file: "<< file_name << std::endl;
739std::exit(EXIT_FAILURE);
741std::vector<std::pair<int, std::string>> config;
742std::vector<std::vector<std::valarray<double>>>
745 size_ttotal_layers = 0;
746in_file >> total_layers;
747 for(
size_ti = 0; i < total_layers; i++) {
749std::string activation;
750 size_tshape_a = 0, shape_b = 0;
751std::vector<std::valarray<double>> kernel;
752in_file >> neurons >> activation >> shape_a >> shape_b;
753 for(
size_tr = 0; r < shape_a; r++) {
754std::valarray<double> row(shape_b);
755 for(
size_tc = 0; c < shape_b; c++) {
758kernel.push_back(row);
760config.emplace_back(make_pair(neurons, activation));
762kernels.emplace_back(kernel);
764std::cout <<
"INFO: Model loaded successfully"<< std::endl;
776<<
"===============================================================" 778std::cout <<
"\t\t+ MODEL SUMMARY +\t\t\n";
780<<
"===============================================================" 782 for(
size_ti = 1; i <=
layers.size(); i++) {
783std::cout << i <<
")";
784std::cout <<
" Neurons : " 785<<
layers[i - 1].neurons;
786std::cout <<
", Activation : " 787<<
layers[i - 1].activation;
788std::cout <<
", kernel Shape : " 790std::cout << std::endl;
793<<
"===============================================================" 818myNN.
fit_from_csv(
"iris.csv",
true, 100, 0.3,
false, 2, 32,
true);
823myNN.single_predict({{6.4, 2.9, 4.3, 1.3}})) == 1);
825myNN.single_predict({{6.2, 3.4, 5.4, 2.3}})) == 2);
NeuralNetwork(NeuralNetwork &&)=default
NeuralNetwork(const NeuralNetwork &model)=default
void fit(const std::vector< std::vector< std::valarray< double > > > &X_, const std::vector< std::vector< std::valarray< double > > > &Y_, const int &epochs=100, const double &learning_rate=0.01, const size_t &batch_size=32, const bool &shuffle=true)
NeuralNetwork & operator=(NeuralNetwork &&)=default
std::vector< std::vector< std::valarray< double > > > __detailed_single_prediction(const std::vector< std::valarray< double > > &X)
void evaluate_from_csv(const std::string &file_name, const bool &last_label, const bool &normalize, const int &slip_lines=1)
std::vector< std::valarray< double > > single_predict(const std::vector< std::valarray< double > > &X)
NeuralNetwork(const std::vector< std::pair< int, std::string > > &config, const std::vector< std::vector< std::valarray< double > > > &kernels)
void save_model(const std::string &_file_name)
void fit_from_csv(const std::string &file_name, const bool &last_label, const int &epochs, const double &learning_rate, const bool &normalize, const int &slip_lines=1, const size_t &batch_size=32, const bool &shuffle=true)
NeuralNetwork & operator=(const NeuralNetwork &model)=default
NeuralNetwork load_model(const std::string &file_name)
NeuralNetwork(const std::vector< std::pair< int, std::string > > &config)
std::pair< std::vector< std::vector< std::valarray< double > > >, std::vector< std::vector< std::valarray< double > > > > get_XY_from_csv(const std::string &file_name, const bool &last_label, const bool &normalize, const int &slip_lines=1)
std::vector< std::vector< std::valarray< double > > > batch_predict(const std::vector< std::vector< std::valarray< double > > > &X)
void evaluate(const std::vector< std::vector< std::valarray< double > > > &X, const std::vector< std::vector< std::valarray< double > > > &Y)
DenseLayer(const int &neurons, const std::string &activation, const std::pair< size_t, size_t > &kernel_shape, const bool &random_kernel)
DenseLayer & operator=(DenseLayer &&)=default
DenseLayer(const DenseLayer &layer)=default
DenseLayer(DenseLayer &&)=default
DenseLayer & operator=(const DenseLayer &layer)=default
DenseLayer(const int &neurons, const std::string &activation, const std::vector< std::valarray< double > > &kernel)
Various activation functions used in Neural network.
This namespace contains layers used in MLP.
std::valarray< T > insert_element(const std::valarray< T > &A, const T &ele)
size_t argmax(const std::vector< std::valarray< T > > &A)
std::vector< std::valarray< T > > multiply(const std::vector< std::valarray< T > > &A, const std::vector< std::valarray< T > > &B)
T sum(const std::vector< std::valarray< T > > &A)
std::vector< std::valarray< T > > transpose(const std::vector< std::valarray< T > > &A)
void unit_matrix_initialization(std::vector< std::valarray< T > > &A, const std::pair< size_t, size_t > &shape)
std::valarray< T > pop_front(const std::valarray< T > &A)
std::pair< size_t, size_t > get_shape(const std::vector< std::valarray< T > > &A)
void uniform_random_initialization(std::vector< std::valarray< T > > &A, const std::pair< size_t, size_t > &shape, const T &low, const T &high)
void zeroes_initialization(std::vector< std::valarray< T > > &A, const std::pair< size_t, size_t > &shape)
std::vector< std::vector< std::valarray< T > > > minmax_scaler(const std::vector< std::vector< std::valarray< T > > > &A, const T &low, const T &high)
std::vector< std::valarray< T > > hadamard_product(const std::vector< std::valarray< T > > &A, const std::vector< std::valarray< T > > &B)
std::vector< std::valarray< T > > apply_function(const std::vector< std::valarray< T > > &A, T(*func)(const T &))
std::valarray< T > pop_back(const std::valarray< T > &A)
void equal_shuffle(std::vector< std::vector< std::valarray< T > > > &A, std::vector< std::vector< std::valarray< T > > > &B)
Neural Network or Multilayer Perceptron.
Various utility functions used in Neural network.
double sigmoid(const double &x)
double dtanh(const double &x)
double identity_function(const double &x)
double tanh(const double &x)
double square(const double &x)
double dsigmoid(const double &x)
double drelu(const double &x)
int main()
Main function.
double relu(const double &x)
Various functions for vectors associated with [NeuralNetwork (aka Multilayer Perceptron)] (https://en...
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4