From eb8d3996366876b357bdf8038268a208b6d463c2 Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Sat, 15 Jan 2022 09:06:54 +0000 Subject: [PATCH] - refactored git-svn-id: http://moon:8086/svn/software/trunk/projects/Rbm@810 b431acfa-c32f-4a4a-93f1-934dc6c82436 --- source/Layer.cpp | 148 ++++++++++++++++++++++++++++++++++++ source/Layer.hpp | 193 ++++++++--------------------------------------- 2 files changed, 180 insertions(+), 161 deletions(-) diff --git a/source/Layer.cpp b/source/Layer.cpp index bb024b7..1812a1b 100644 --- a/source/Layer.cpp +++ b/source/Layer.cpp @@ -43,6 +43,143 @@ Layer::~Layer() { } +size_t Layer::id() +{ + return m_id; +} + +std::string& Layer::name() +{ + return m_name; +} + +int Layer::numVisibleX() +{ + return m_numVisibleX; +} + +int Layer::numVisibleY() +{ + return m_numVisibleY; +} + +const arma::mat& Layer::context() const +{ + return m_context; +} + +Layer* Layer::root() +{ + Layer *pLayer = this; + while (pLayer->prev) + { + pLayer = pLayer->prev; + } + return pLayer; +} + +arma::mat Layer::gibbsPass(arma::mat& vr) +{ + arma::mat h; + for (int i = 0; i < params().numGibbs; i++) + { + h = prob(v_to_h(vr)); + vr = prob(h_to_v(h)); + } + return h; +} + +arma::mat Layer::downPass(const arma::mat& h) +{ + arma::mat v = prob(h_to_v(h)); + if (prev) + { + return prev->downPass(v); + } + return v; +} + +arma::mat Layer::upPass(const arma::mat& v) +{ + arma::mat r = v; + arma::mat h = gibbsPass(r); + if (next) + { + next->upPass(h); + } + else + { + return h; + } +} + +arma::mat Layer::upDownPass(const arma::mat& v) +{ + arma::mat r = v; + arma::mat h = gibbsPass(r); + if (next) + { + next->upDownPass(h); + } + else if (prev) + { + prev->downPass(r); + } + return r; +} + +arma::mat Layer::vc_to_c(const arma::mat& vc) const +{ + if (m_numContext == 0) + { + return arma::mat(1, 0); + } + return vc.submat(0, numVisible() - m_numContext, 0, numVisible() - 1); +} + +arma::mat Layer::vc_to_v(const arma::mat& vc) const +{ + return arma::reshape(vc, 1, numVisible() - m_numContext); +} + +void Layer::calcContextBatch(arma::mat& batch) +{ + size_t numTraining = batch.n_rows; + + if (m_numContext > 0 and numTraining > 0) + { + for (int i = 1; i < numTraining; i++) + { + arma::mat v = batch.row(i - 1); + arma::mat h = arma::zeros(1, numHidden()); + gibbs_vh(v, h); + arma::mat training_with_ctx = arma::join_rows(batch.row(i).cols(0, numVisible() - m_numContext - 1), h); + batch.row(i) = training_with_ctx; + } + } +} + +void Layer::train(const arma::mat& batch, IListener* pListener) +{ + Rbm::train(trainingData(batch), pListener); +} + +arma::mat Layer::trainingData(const arma::mat& batch) +{ + arma::mat thisBatch = batch; + Layer *pLayer = root(); + while (pLayer) + { + if (pLayer == this) + { + break; + } + thisBatch = pLayer->toHiddenProbs(thisBatch); + pLayer = pLayer->next; + } + return thisBatch; +} + bool Layer::weightsLoad(std::string const &dir, std::string const &prj) { arma::mat w; @@ -92,3 +229,14 @@ Json::Value Layer::toJson() const return layer; } + +std::string Layer::filePrefix(const std::string& dir, const std::string& prjname) const +{ + std::string filename = m_name + "." + std::to_string((int) m_id); + if (prjname.size() > 0) + { + filename = prjname + "." + filename; + } + return dir + "/" + filename; +} + diff --git a/source/Layer.hpp b/source/Layer.hpp index ecfcf80..d8053e5 100644 --- a/source/Layer.hpp +++ b/source/Layer.hpp @@ -23,176 +23,47 @@ class Layer : public Rbm { public: - Layer *next; - Layer *prev; + Layer *next; + Layer *prev; - Layer(const std::string &name, size_t id, size_t numVisibleX, size_t numVisibleY, size_t numHidden, size_t numContext=0); - Layer(const Layer& orig); - virtual ~Layer(); + Layer(const std::string &name, size_t id, size_t numVisibleX, size_t numVisibleY, size_t numHidden, size_t numContext=0); + Layer(const Layer& orig); + virtual ~Layer(); - Json::Value toJson() const; + Json::Value toJson() const; - void calcContextBatch(arma::mat &batch) - { - size_t numTraining = batch.n_rows; + size_t id(); + std::string& name(); + int numVisibleX(); + int numVisibleY(); + const arma::mat& context() const; - if (m_numContext > 0 and numTraining > 0) - { - for (int i=1; i < numTraining; i++) - { - arma::mat v = batch.row(i-1); - arma::mat h = arma::zeros(1, numHidden()); - gibbs_vh(v, h); - arma::mat training_with_ctx = arma::join_rows(batch.row(i).cols(0, numVisible()-m_numContext-1), h); - batch.row(i) = training_with_ctx; - } - } - } - - void train(arma::mat const &batch, IListener *pListener=nullptr) - { - Rbm::train(trainingData(batch), pListener); - } - - std::string& name() - { - return m_name; - } - - size_t id() - { - return m_id; - } - - int numVisibleX() - { - return m_numVisibleX; - } + Layer *root(); + arma::mat gibbsPass(arma::mat &vr); + arma::mat upPass(arma::mat const &v); + arma::mat downPass(arma::mat const &h); + arma::mat upDownPass(arma::mat const &v); + arma::mat vc_to_v(const arma::mat &vc) const; + arma::mat vc_to_c(const arma::mat &vc) const; - int numVisibleY() - { - return m_numVisibleY; - } - - arma::mat gibbsPass(arma::mat &vr) - { - arma::mat h; - for (int i=0; i < params().numGibbs; i++) - { - h = prob(v_to_h(vr)); - vr = prob(h_to_v(h)); - } - return h; - } - - arma::mat upPass(arma::mat const &v) - { - arma::mat r = v; - arma::mat h = gibbsPass(r); - if (next) - { - next->upPass(h); - } - else - { - return h; - } - } - - arma::mat downPass(arma::mat const &h) - { - arma::mat v = prob(h_to_v(h)); - if (prev) - { - return prev->downPass(v); - } - return v; - } - - arma::mat upDownPass(arma::mat const &v) - { - arma::mat r = v; - arma::mat h = gibbsPass(r); - if (next) - { - next->upDownPass(h); - } - else if (prev) - { - prev->downPass(r); - } - return r; - } + bool weightsLoad(std::string const &dir, std::string const &prj); + bool weightsSave(std::string const &dir, std::string const &prj); - bool weightsLoad(std::string const &dir, std::string const &prj); - bool weightsSave(std::string const &dir, std::string const &prj); - - arma::mat trainingData(arma::mat const &batch) - { - arma::mat thisBatch = batch; - Layer *pLayer = root(); - while (pLayer) - { - if (pLayer == this) - { - break; - } - thisBatch = pLayer->toHiddenProbs(thisBatch); - pLayer = pLayer->next; - } - return thisBatch; - } - - Layer *root() - { - Layer *pLayer = this; - while(pLayer->prev) - { - pLayer = pLayer->prev; - } - return pLayer; - } - - arma::mat vc_to_v(const arma::mat &vc) const - { - return arma::reshape(vc, 1, numVisible() - m_numContext); - } - - arma::mat vc_to_c(const arma::mat &vc) const - { - if (m_numContext == 0) - { - return arma::mat(1,0); - } - return vc.submat(0, numVisible() - m_numContext, 0, numVisible() - 1); - } - - const arma::mat& context() const - { - return m_context; - } + void calcContextBatch(arma::mat &batch); + arma::mat trainingData(arma::mat const &batch); + void train(arma::mat const &batch, IListener *pListener=nullptr); private: - std::string m_name; - size_t m_id; - size_t m_numVisibleX; - size_t m_numVisibleY; - size_t m_numContext; - arma::mat m_context; - - // Compatibility - bool loadWeights(const std::string &prjname=""); - bool saveWeights(const std::string &prjname=""); - std::string filePrefix(const std::string &dir, const std::string &prjname) const - { - std::string filename = m_name + "." + std::to_string((int)m_id); - if (prjname.size() > 0) - { - filename = prjname + "." + filename; - } - return dir + "/" + filename; - } + std::string m_name; + size_t m_id; + size_t m_numVisibleX; + size_t m_numVisibleY; + size_t m_numContext; + arma::mat m_context; + + // Compatibility + std::string filePrefix(const std::string &dir, const std::string &prjname) const; };