MLask 1.0.0
A custom c++ deep learning library
Loading...
Searching...
No Matches
FullyConnectedLayer.hpp
Go to the documentation of this file.
1#pragma once
2#include "Layer.hpp"
3#include "Eigen/Dense"
4#include <Eigen/Core>
5#include <cstddef>
6#include <iomanip>
7namespace mlask{
8
16template<std::size_t in, std::size_t out>
18private:
19 Eigen::Matrix<float_t, out, in> weights_;
20 Eigen::Matrix<float_t, out, 1> bias_;
21 vectorIn input_;
22
23 Eigen::Matrix<float_t, out, in> weightsChange_;
24 Eigen::Matrix<float_t, out, 1> biasChange_;
25 std::size_t epochs_;
26public:
29 weights_.setRandom();
30 bias_.setRandom();
31 weightsChange_.setZero();
32 biasChange_.setZero();
33 epochs_ = 0;
34 in_ = in;
35 out_ = out;
36 }
38 vectorOut forward(vectorIn input) override;
40 vectorIn backward(vectorOut error) override;
42 void fit(float_t learning_rate) override;
43
50 bool tryConvertToONNX(onnx::GraphProto* graph, std::string input, std::string output) const override;
51
52 /* @brief Returns a string representation of the layer */
53 std::string str() const override;
54 /* getters */
55 Eigen::Matrix<float_t, out, in> weights(){ return weights_; }
56 Eigen::Matrix<float_t, in, 1> bias(){ return bias_; }
57};
58
59template <std::size_t in, std::size_t out>
61 epochs_ += 1;
62 input_ = input;
63 return weights_ * input + bias_;
64}
65
66template <std::size_t in, std::size_t out>
68 biasChange_ = biasChange_ + error;
69 weightsChange_ = weightsChange_ + error * input_.transpose();
70 return weights_.transpose() * error;
71}
72
73template <std::size_t in, std::size_t out>
75 weights_ = weights_ - (weightsChange_ / epochs_ * learning_rate);
76 bias_ = bias_ - (biasChange_ / epochs_ * learning_rate);
77 weightsChange_.setZero();
78 biasChange_.setZero();
79 epochs_ = 0;
80}
81
82template <std::size_t in, std::size_t out>
83bool FullyConnectedLayer<in, out>::tryConvertToONNX(onnx::GraphProto* graph, std::string input, std::string output)const{
84 onnx::TensorProto* w = graph->add_initializer();
85 w->set_name(input + "_weight");
86 w->set_data_type(onnx::TensorProto::FLOAT);
87 w->add_dims(in);
88 w->add_dims(out);
89 constexpr int weightsLayout = (in > 1) ? Eigen::RowMajor : Eigen::ColMajor;
90 Eigen::Matrix<float, out, in, weightsLayout | Eigen::DontAlign> onnxWeights = weights_;
91 w->set_raw_data(onnxWeights.data(), onnxWeights.size() * sizeof(float_t));
92
93 onnx::TensorProto* b = graph->add_initializer();
94 b->set_name(input + "_bias");
95 b->set_data_type(onnx::TensorProto::FLOAT);
96 b->add_dims(out);
97 b->set_raw_data(bias_.data(), bias_.size() * sizeof(float_t));
98
99 onnx::NodeProto* matmul_node = graph->add_node();
100 matmul_node->set_op_type("MatMul");
101 matmul_node->add_input(input);
102 matmul_node->add_input(input + "_weight");
103 matmul_node->add_output(input + "_result");
104
105 onnx::NodeProto* add_node = graph->add_node();
106 add_node->set_op_type("Add");
107 add_node->add_input(input + "_result");
108 add_node->add_input(input + "_bias");
109 add_node->add_output(output);
110 return true;
111}
112
113template<std::size_t in, std::size_t out>
115 std::stringstream weights_stream;
116 weights_stream << std::fixed << std::setprecision(3) << weights_;
117 std::stringstream bias_stream;
118 bias_stream << std::fixed << std::setprecision(3) << bias_;
119 return "FullyConnectedLayer: " + std::to_string(in) + " -> " + std::to_string(out) + "\nWeights:\n" + weights_stream.str() + "\nBias:\n" + bias_stream.str();
120}
121}
Class representing fully connected layer.
Definition FullyConnectedLayer.hpp:17
FullyConnectedLayer()
A constructor for fully connected layer, initializes weights and biases with random values,...
Definition FullyConnectedLayer.hpp:28
vectorIn backward(vectorOut error) override
A backtrack for backpropagation algorithm.
Definition FullyConnectedLayer.hpp:67
Eigen::Matrix< float_t, in, 1 > bias()
Definition FullyConnectedLayer.hpp:56
vectorOut forward(vectorIn input) override
A function defining moving foraward in neural network.
Definition FullyConnectedLayer.hpp:60
void fit(float_t learning_rate) override
A function that updates weights and biases.
Definition FullyConnectedLayer.hpp:74
std::string str() const override
Returns a string representation of the layer.
Definition FullyConnectedLayer.hpp:114
bool tryConvertToONNX(onnx::GraphProto *graph, std::string input, std::string output) const override
A function that tries to convert the layer to ONNX format, returns true if successful,...
Definition FullyConnectedLayer.hpp:83
Eigen::Matrix< float_t, out, in > weights()
Definition FullyConnectedLayer.hpp:55
Base class for all layers in the neural network.
Definition Layer.hpp:10
std::size_t in_
Definition Layer.hpp:12
std::size_t out_
Definition Layer.hpp:13
Definition LeakyRelu.hpp:4
Eigen::Matrix< float_t, Eigen::Dynamic, 1 > vectorOut
Definition types.hpp:17
float float_t
Definition types.hpp:12
Eigen::Matrix< float_t, Eigen::Dynamic, 1 > vectorIn
Definition types.hpp:16