/*! * * * \brief Implements a radial basis function layer. * * * * \author O. Krause * \date 2014 * * * \par Copyright 1995-2017 Shark Development Team * *

* This file is part of Shark. * * * Shark is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Shark is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Shark. If not, see . * */ #ifndef SHARK_MODELS_RBFLayer_H #define SHARK_MODELS_RBFLayer_H #include #include #include namespace shark { /// \brief Implements a layer of radial basis functions in a neural network. /// /// A Radial basis function layer as modeled in shark is a set of N /// Gaussian distributions \f$ p(x|i) \f$. /// \f[ /// p(x|i) = e^{\gamma_i*\|x-m_i\|^2} /// \f] /// and the layer transforms an input x to a vector \f$(p(x|1),\dots,p(x|N)\f$. /// The \f$\gamma_i\f$ govern the width of the Gaussians, while the /// vectors \f$ m_i \f$ set the centers of every Gaussian distribution. /// /// RBF networks profit much from good guesses on the centers and /// kernel function parameters. In case of a Gaussian kernel a call /// to k-Means or the EM-algorithm can be used to get a good /// initialisation for the network. class RBFLayer : public AbstractModel { private: struct InternalState: public State{ RealMatrix norm2; void resize(std::size_t numPatterns, std::size_t numNeurons){ norm2.resize(numPatterns,numNeurons); } }; public: /// \brief Creates an empty Radial Basis Function layer. SHARK_EXPORT_SYMBOL RBFLayer(); /// \brief Creates a layer of a Radial Basis Function Network. /// /// This method creates a Radial Basis Function Network (RBFN) with /// \em numInput input neurons and \em numOutput output neurons. /// /// \param numInput Number of input neurons, equal to dimensionality of /// input space. /// \param numOutput Number of output neurons, equal to dimensionality of /// output space and number of gaussian distributions SHARK_EXPORT_SYMBOL RBFLayer(std::size_t numInput, std::size_t numOutput); /// \brief From INameable: return the class name. std::string name() const { return "RBFLayer"; } ///\brief Returns the current parameter vector. The amount and order of weights depend on the training parameters. /// ///The format of the parameter vector is \f$ (m_1,\dots,m_k,\log(\gamma_1),\dots,\log(\gamma_k))\f$ ///if training of one or more parameters is deactivated, they are removed from the parameter vector SHARK_EXPORT_SYMBOL RealVector parameterVector()const; ///\brief Sets the new internal parameters. SHARK_EXPORT_SYMBOL void setParameterVector(RealVector const& newParameters); ///\brief Returns the number of parameters which are currently enabled for training. SHARK_EXPORT_SYMBOL std::size_t numberOfParameters()const; ///\brief Returns the number of input neurons. Shape inputShape()const{ return m_centers.size2(); } ///\brief Returns the number of output neurons. Shape outputShape()const{ return m_centers.size1(); } boost::shared_ptr createState()const{ return boost::shared_ptr(new InternalState()); } /// \brief Configures a Radial Basis Function Network. /// /// This method initializes the structure of the Radial Basis Function Network (RBFN) with /// \em numInput input neurons, \em numOutput output neurons and \em numHidden /// hidden neurons. /// /// \param numInput Number of input neurons, equal to dimensionality of /// input space. /// \param numOutput Number of output neurons (basis functions), equal to dimensionality of /// output space. SHARK_EXPORT_SYMBOL void setStructure(std::size_t numInput, std::size_t numOutput); using AbstractModel::eval; SHARK_EXPORT_SYMBOL void eval(BatchInputType const& patterns, BatchOutputType& outputs, State& state)const; SHARK_EXPORT_SYMBOL void weightedParameterDerivative( BatchInputType const& pattern, BatchOutputType const& outputs, BatchOutputType const& coefficients, State const& state, RealVector& gradient )const; ///\brief Enables or disables parameters for learning. /// /// \param centers whether the centers should be trained /// \param width whether the distribution width should be trained SHARK_EXPORT_SYMBOL void setTrainingParameters(bool centers, bool width); ///\brief Returns the center values of the neurons. BatchInputType const& centers()const{ return m_centers; } ///\brief Sets the center values of the neurons. BatchInputType& centers(){ return m_centers; } ///\brief Returns the width parameter of the Gaussian functions RealVector const& gamma()const{ return m_gamma; } /// \brief sets the width parameters - the gamma values - of the distributions. SHARK_EXPORT_SYMBOL void setGamma(RealVector const& gamma); /// From ISerializable, reads a model from an archive SHARK_EXPORT_SYMBOL void read( InArchive & archive ); /// From ISerializable, writes a model to an archive SHARK_EXPORT_SYMBOL void write( OutArchive & archive ) const; protected: //====model parameters ///\brief The center points. The i-th element corresponds to the center of neuron number i RealMatrix m_centers; ///\brief stores the width parameters of the Gaussian functions RealVector m_gamma; /// \brief the logarithm of the normalization constant for every distribution RealVector m_logNormalization; //=====training parameters ///enables learning of the center points of the neurons bool m_trainCenters; ///enables learning of the width parameters. bool m_trainWidth; }; } #endif