NeuralNet 1.0
Loading...
Searching...
No Matches
Flatten.hpp
1#pragma once
2
3#include <cereal/access.hpp>
4#include <cereal/archives/binary.hpp>
5#include <cereal/archives/portable_binary.hpp>
6#include <cereal/cereal.hpp>
7#include <cereal/types/base_class.hpp>
8#include <cereal/types/polymorphic.hpp>
9#include <tuple>
10
11#include "Layer.hpp"
12#include "utils/Functions.hpp"
13#include "utils/Serialize.hpp"
14
15namespace NeuralNet {
16class Flatten : public Layer {
17 public:
26 Flatten(std::tuple<int, int> inputShape)
27 : Layer(inputShape), inputShape(inputShape) {
28 type = LayerType::FLATTEN;
29 };
30
34 std::string getSlug() const override { return slug; }
35
42 Eigen::MatrixXd flatten(
43 std::vector<std::vector<std::vector<double>>> inputs) {
44 int rows = std::get<0>(inputShape);
45 int cols = std::get<1>(inputShape);
46
47 // Flatten the vectors
48 std::vector<double> flatInputs;
49 for (const std::vector<std::vector<double>> &input : inputs) {
50 std::vector<double> flattenedInput = flatten2DVector(input, rows, cols);
51 flatInputs.insert(flatInputs.end(), flattenedInput.begin(),
52 flattenedInput.end());
53 }
54
55 const int numRows = inputs.size();
56 const int numCols = rows * cols;
57 return Eigen::Map<
58 Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>>(
59 flatInputs.data(), numRows, numCols);
60 };
61
62 void feedInputs(std::vector<std::vector<std::vector<double>>> inputs,
63 bool training) override {
64 Eigen::MatrixXd flattenedInputs = flatten(inputs);
65 this->setOutputs(flattenedInputs);
66 };
67
68 Eigen::MatrixXd feedInputs(Eigen::MatrixXd inputs, bool training) override {
69 this->setOutputs(inputs);
70 return outputs;
71 };
72
73 ~Flatten(){};
74
75 private:
76 // non-public serialization
77 friend class cereal::access;
78
79 std::tuple<int, int> inputShape;
80 std::string slug = "fltn";
81
82 template <class Archive>
83 void serialize(Archive &ar) {
84 ar(cereal::base_class<Layer>(this), inputShape);
85 }
86
87 Eigen::MatrixXd computeOutputs(Eigen::MatrixXd inputs,
88 bool training) override {
89 return outputs;
90 }
91
92 Flatten(){}; // Necessary for serializations
93};
94} // namespace NeuralNet
95
96namespace cereal {
97template <class Archive>
98struct specialize<Archive, NeuralNet::Flatten,
99 cereal::specialization::member_serialize> {};
100} // namespace cereal
101
102CEREAL_REGISTER_TYPE(NeuralNet::Flatten);
103
104CEREAL_REGISTER_POLYMORPHIC_RELATION(NeuralNet::Layer, NeuralNet::Flatten);
Definition Flatten.hpp:16
Flatten(std::tuple< int, int > inputShape)
Construct a new Flatten object.
Definition Flatten.hpp:26
Eigen::MatrixXd flatten(std::vector< std::vector< std::vector< double > > > inputs)
This method flattens a 3D vector into a 2D Eigen::MatrixXd.
Definition Flatten.hpp:42
Eigen::MatrixXd feedInputs(Eigen::MatrixXd inputs, bool training) override
This method is used to feed the inputs to the layer.
Definition Flatten.hpp:68
void feedInputs(std::vector< std::vector< std::vector< double > > > inputs, bool training) override
This method is used to feed the inputs to the layer.
Definition Flatten.hpp:62
std::string getSlug() const override
Flatten layer's slug.
Definition Flatten.hpp:34
Definition Layer.hpp:26
void setOutputs(Eigen::MatrixXd outputs)
Definition Layer.hpp:143