Skip to content

Code

tiny_mlp.hpp

/**
 * @file tiny_mlp.hpp
 * @brief Multi-Layer Perceptron (MLP) — convenience wrapper around Sequential.
 */

#pragma once

#include "tiny_sequential.hpp"
#include "tiny_dense.hpp"

#ifdef __cplusplus

#include <initializer_list>

namespace tiny
{

class MLP : public Sequential
{
public:
    MLP(std::initializer_list<int> dims,
        ActType hidden_act = ActType::RELU,
        bool    use_softmax = true,
        bool    use_bias    = true);

    int in_features()  const { return in_feat_; }
    int out_features() const { return out_feat_; }

private:
    int in_feat_;
    int out_feat_;
};

} // namespace tiny

#endif // __cplusplus

tiny_mlp.cpp

/**
 * @file tiny_mlp.cpp
 * @brief MLP model implementation.
 */

#include "tiny_mlp.hpp"

#ifdef __cplusplus

namespace tiny
{

MLP::MLP(std::initializer_list<int> dims,
         ActType hidden_act,
         bool    use_softmax,
         bool    use_bias)
{
    const int *d  = dims.begin();
    int        nd = (int)dims.size();

    in_feat_  = d[0];
    out_feat_ = d[nd - 1];

    for (int i = 0; i < nd - 1; i++)
    {
        add(new Dense(d[i], d[i + 1], use_bias));

        if (i < nd - 2)
            add(new ActivationLayer(hidden_act));
        else if (use_softmax)
            add(new ActivationLayer(ActType::SOFTMAX));
    }
}

} // namespace tiny

#endif // __cplusplus