23 #ifndef SRC_MLNN_MULTILAYERNEURALNETWORK_HPP_
24 #define SRC_MLNN_MULTILAYERNEURALNETWORK_HPP_
26 #include <types/MatrixTypes.hpp>
32 #include <boost/archive/text_iarchive.hpp>
33 #include <boost/archive/text_oarchive.hpp>
37 namespace serialization {
46 using namespace activation_function;
47 using namespace cost_function;
48 using namespace fully_connected;
49 using namespace convolution;
50 using namespace regularisation;
57 template <
typename eT>
58 class MultiLayerNeuralNetwork {
82 template <
typename LayerType>
84 layers.push_back(std::shared_ptr <LayerType> (layer_ptr_));
93 template <
typename LayerType>
94 std::shared_ptr<LayerType>
getLayer(
size_t index_){
95 assert(index_ < layers.size());
97 return std::dynamic_pointer_cast< LayerType >( layers[index_] );
105 std::shared_ptr<Layer<eT> >
getLayer(
size_t index_){
106 assert(index_ < layers.size());
108 return layers[index_];
116 assert(number_of_layers_ <= layers.size());
118 for (
size_t i=0; i <number_of_layers_; i++)
129 assert (layer_number_ < layers.size());
131 if (layer_number_ < 0)
132 layer_number_ = layers.size() -1;
134 return layers[layer_number_]->inputsSize();
142 assert (layer_number_ < layers.size());
144 if (layer_number_ < 0)
145 layer_number_ = layers.size() -1;
147 return layers[layer_number_]->outputsSize();
155 assert (layer_number_ < layers.size());
157 if (layer_number_ < 0)
158 layer_number_ = layers.size() -1;
160 return layers[layer_number_]->batchSize();
168 template<
typename omT>
171 for (
size_t i = 0; i < layers.size(); i++)
172 layers[i]->
template setOptimization<omT> ();
181 void update(eT alpha_, eT decay_ = 0.0f) {
183 eT alpha_batch = alpha_/layers[0]->batch_size;
185 for (
size_t i = 0; i < layers.size(); i++) {
186 layers[i]->update(alpha_batch, decay_);
195 for (
size_t i = 0; i < layers.size(); i++)
196 layers[i]->resetGrads();
205 if ((
size_t)(layers[0]->s[
'x'])->cols() == batch_size_)
209 for (
size_t i = 0; i < layers.size(); i++) {
210 layers[i]->resizeBatch(batch_size_);
218 return layers.back()->s[
'y'];
226 assert(layer_nr_ < layers.size());
227 return layers[layer_nr_]->s[
'y'];
241 mic::types::Matrix<eT> predicted_classes = predictions_->colwiseReturnMaxIndices();
242 mic::types::Matrix<eT> target_classes = targets_->colwiseReturnMaxIndices();
245 eT *p = predicted_classes.data();
246 eT *t = target_classes.data();
250 for(i=0; i< (size_t) predicted_classes.size(); i++) {
266 os_ <<
"[" << obj_.name <<
"]:\n";
268 for (
size_t i = 0; i < obj_.layers.size(); i++)
269 os_ << (*obj_.layers[i]) << std::endl;
279 bool save(std::string filename_)
283 std::ofstream ofs(filename_);
284 boost::archive::text_oarchive ar(ofs);
291 LOG(LINFO) <<
"Network " << name <<
" properly saved to file " << filename_;
292 LOG(LDEBUG) <<
"Saved network: \n" << (*this);
294 LOG(LERROR) <<
"Could not write neural network " << name <<
" to file " << filename_ <<
"!";
306 bool load(std::string filename_)
310 std::ifstream ifs(filename_);
311 boost::archive::text_iarchive ar(ifs);
314 LOG(LINFO) <<
"Network " << name <<
" properly loaded from file " << filename_;
315 LOG(LDEBUG) <<
"Loaded network: \n" << (*this);
317 LOG(LERROR) <<
"Could not load neural network from file " << filename_ <<
"!";
331 std::vector<std::shared_ptr <mic::mlnn::Layer<eT> > >
layers;
344 friend class boost::serialization::access;
351 template<
class Archive>
352 void save(Archive & ar,
const unsigned int version)
const {
357 size_t size = layers.size();
361 for (
size_t i = 0; i < layers.size(); i++) {
363 ar & layers[i]->layer_type;
376 template<
class Archive>
377 void load(Archive & ar,
const unsigned int version) {
390 for (
size_t i = 0; i < size; i++) {
395 std::shared_ptr<Layer<eT> > layer_ptr;
399 layer_ptr = std::make_shared<ELU<eT> >(
ELU<eT>());
400 LOG(LDEBUG) <<
"ELU";
403 layer_ptr = std::make_shared<ReLU<eT> >(
ReLU<eT>());
404 LOG(LDEBUG) <<
"ReLU";
407 layer_ptr = std::make_shared<Sigmoid<eT> >(
Sigmoid<eT>());
408 LOG(LDEBUG) <<
"Sigmoid";
414 LOG(LERROR) <<
"Convolution Layer serialization not implemented (some params are not serialized)!";
417 layer_ptr = std::make_shared<Cropping<eT> >(
Cropping<eT>());
418 LOG(LERROR) <<
"Cropping Layer serialization not implemented (some params are not serialized)!";
422 LOG(LERROR) <<
"MaxPooling Layer serialization not implemented (some params are not serialized)!";
425 layer_ptr = std::make_shared<Padding<eT> >(
Padding<eT>());
426 LOG(LERROR) <<
"Padding Layer serialization not implemented (some params are not serialized)!";
431 layer_ptr = std::make_shared<Softmax<eT> >(
Softmax<eT>());
432 LOG(LDEBUG) <<
"Softmax";
438 layer_ptr = std::make_shared<Linear<eT> >(
Linear<eT>());
439 LOG(LDEBUG) <<
"Linear";
443 LOG(LDEBUG) <<
"SparseLinear";
447 LOG(LDEBUG) <<
"HebbianLinear";
452 LOG(LDEBUG) <<
"BinaryCorrelator";
457 layer_ptr = std::make_shared<Dropout<eT> >(
Dropout<eT>());
458 LOG(LERROR) <<
"Dropout Layer serialization not implemented (some params are not serialized)!";
462 LOG(LERROR) <<
"Undefined Layer type detected during deserialization!";
466 layers.push_back(layer_ptr);
472 BOOST_SERIALIZATION_SPLIT_MEMBER()
482 BOOST_CLASS_VERSION(mic::mlnn::MultiLayerNeuralNetwork<
double>, 2)
Class representing a convolution layer, with "valid padding" and variable stride. ...
size_t lastLayerOutputsSize(size_t layer_number_=-1)
bool connected
Flag denoting whether the layers are interconnected, thus no copying between inputs and outputs of th...
Class implementing the layer with Exponential Linear Unit (ELU). http://arxiv.org/pdf/1511.07289v5.pdf.
bool save(std::string filename_)
Layer performing max pooling.
Class implementing a linear, fully connected layer.
virtual ~MultiLayerNeuralNetwork()
Class implementing cropping operation - crops the size of image (matrix) by a margin of n pixels on e...
void popLayer(size_t number_of_layers_=1)
std::vector< std::shared_ptr< mic::mlnn::Layer< eT > > > layers
std::shared_ptr< LayerType > getLayer(size_t index_)
Class implementing a linear, fully connected layer.
Droput layer - a layer used for the regularization of neural network by randomly dropping neurons dur...
void update(eT alpha_, eT decay_=0.0f)
size_t countCorrectPredictions(mic::types::MatrixPtr< eT > targets_, mic::types::MatrixPtr< eT > predictions_)
Softmax activation function.
Class representing a multi-layer neural network.
Class implementing a linear, fully connected layer.
mic::types::MatrixPtr< eT > getPredictions()
LayerTypes
Enumeration of possible layer types.
void load(Archive &ar, const unsigned int version)
MultiLayerNeuralNetwork(std::string name_="mlnn")
void resizeBatch(size_t batch_size_)
Class implementing a linear, fully connected layer with sparsity regulation.
friend std::ostream & operator<<(std::ostream &os_, const MultiLayerNeuralNetwork &obj_)
Class implementing padding operation - expanding the size of image (matrix) by a margin of n pixels o...
size_t lastLayerBatchSize(size_t layer_number_=-1)
void pushLayer(LayerType *layer_ptr_)
std::shared_ptr< Layer< eT > > getLayer(size_t index_)
bool load(std::string filename_)
size_t layerInputsSize(size_t layer_number_=-1)
void save(Archive &ar, const unsigned int version) const
mic::types::MatrixPtr< eT > getPredictions(size_t layer_nr_)