16template<std::
size_t in, std::
size_t out>
19 Eigen::Matrix<float_t, out, in> weights_;
20 Eigen::Matrix<float_t, out, 1> bias_;
23 Eigen::Matrix<float_t, out, in> weightsChange_;
24 Eigen::Matrix<float_t, out, 1> biasChange_;
31 weightsChange_.setZero();
32 biasChange_.setZero();
50 bool tryConvertToONNX(onnx::GraphProto* graph, std::string input, std::string output)
const override;
53 std::string
str()
const override;
55 Eigen::Matrix<float_t, out, in>
weights(){
return weights_; }
56 Eigen::Matrix<float_t, in, 1>
bias(){
return bias_; }
59template <std::
size_t in, std::
size_t out>
63 return weights_ * input + bias_;
66template <std::
size_t in, std::
size_t out>
68 biasChange_ = biasChange_ + error;
69 weightsChange_ = weightsChange_ + error * input_.transpose();
70 return weights_.transpose() * error;
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();
82template <std::
size_t in, std::
size_t out>
84 onnx::TensorProto* w = graph->add_initializer();
85 w->set_name(input +
"_weight");
86 w->set_data_type(onnx::TensorProto::FLOAT);
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));
93 onnx::TensorProto* b = graph->add_initializer();
94 b->set_name(input +
"_bias");
95 b->set_data_type(onnx::TensorProto::FLOAT);
97 b->set_raw_data(bias_.data(), bias_.size() *
sizeof(
float_t));
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");
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);
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();
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