From 6b2fe10d056cca60c6ea6173e9d3a7385ce712dc Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Sat, 25 Oct 2014 15:34:12 +0000 Subject: [PATCH] - correct energy calc. for BB-RBMs git-svn-id: http://moon:8086/svn/software/trunk/projects/RBM@39 b431acfa-c32f-4a4a-93f1-934dc6c82436 --- Source/HiddenLayer.hpp | 9 --------- Source/Layer.hpp | 9 +++------ Source/MainComponent.cpp | 4 ++++ Source/Rbm.hpp | 24 +++++++----------------- Source/VisibleLayer.hpp | 9 --------- 5 files changed, 14 insertions(+), 41 deletions(-) diff --git a/Source/HiddenLayer.hpp b/Source/HiddenLayer.hpp index 649ee9a..61eae28 100644 --- a/Source/HiddenLayer.hpp +++ b/Source/HiddenLayer.hpp @@ -23,15 +23,6 @@ public: { } - double getEnergy(const Weights &weights) - { - double energy; - - energy = -((Weights&)weights).hiddenBias().transpose() * states(); - - return energy; - } - private: double accum(Layer &layer, Weights &weights, uint32_t index) { diff --git a/Source/Layer.hpp b/Source/Layer.hpp index 7a68185..1f2222e 100644 --- a/Source/Layer.hpp +++ b/Source/Layer.hpp @@ -124,8 +124,6 @@ public: return m_numUnits; } - virtual double getEnergy(const Weights &weights) = 0; - private: noise_gen_t m_noise; @@ -145,17 +143,16 @@ protected: } } - void gaussProb(const VectorXd &x, double sigma) + void gaussProb(const VectorXd &mu, double sigma) { uint32_t i; double var = sigma*sigma; double k = 1.0/sqrt(2*3.14159265359*var); - double mu = 0; for (i=0; i < m_numUnits; i++) { - double x2 = ((double)x[i]-mu); - m_probs[i] = 1-exp(-x2*x2/(2*var)); + double x2 = (1-(double)mu[i]); + m_probs[i] = k*exp(-0.5*x2*x2/var); } } }; diff --git a/Source/MainComponent.cpp b/Source/MainComponent.cpp index 935f04c..1aa3491 100644 --- a/Source/MainComponent.cpp +++ b/Source/MainComponent.cpp @@ -639,6 +639,7 @@ void MainComponent::sliderValueChanged (Slider* sliderThatWasMoved) VisibleLayer &p = (VisibleLayer&)m_layers.getAt((int)sliderThatWasMoved->getValue()); DrawTraining->setData(p.states()); redrawReconstruction(); + } //[/UserSliderCode_patterSlider] } @@ -850,6 +851,9 @@ void MainComponent::redrawReconstruction() { DrawHidden->setData(m_pRbm->toHidden(DrawTraining->getData())); DrawReconstruction->setData(m_pRbm->toVisible(DrawHidden->getData())); + double energy = m_pRbm->getEnergy(DrawTraining->getData(), DrawHidden->getData()); + cout << "Energy(" << 0 <<") = " << energy << endl; + } void MainComponent::redrawWeights(int index) diff --git a/Source/Rbm.hpp b/Source/Rbm.hpp index 33902c6..46cea9b 100644 --- a/Source/Rbm.hpp +++ b/Source/Rbm.hpp @@ -105,7 +105,6 @@ public: sumBiasH.fill(0); for (i=0; i < vt.getSize(); i++) { - //t = (uint32_t)(0.5 + (vt.getSize()-1)*Noise_Uniform(&m_noise, 0.5)); t = i; h.probsUpdateLogistic(vt[t], m_w, m_lambda, sigma); @@ -221,24 +220,15 @@ public: return m_progress; } - double getEnergy(VisibleLayer &v, HiddenLayer &h) + double getEnergy(const VectorXd& visible, const VectorXd& hidden) { - uint32_t i, j; double energy; - energy = -v.getEnergy(m_w) - h.getEnergy(m_w); + energy = m_w.visibleBias().transpose() * visible; + energy += m_w.hiddenBias().transpose() * hidden; + energy += visible.transpose() * m_w.weights() * hidden; - for (i=0; i < h.getNumUnits(); i++) - { - for (j=0; j < v.getNumUnits(); j++) - { -// energy -= v.getStates()[j] * h.getStates()[i] * m_w.getWeights()[i][j]; - } - } - - // ToDo: make this correct -// energy -= (v.states().transpose() * h.states()); // * m_w.weights(); - return energy; + return -energy/(m_sigma*m_sigma); } void prob(LayerArray &vts) @@ -278,11 +268,11 @@ public: z = 0; for (j=0; j < vts.getSize(); j++) { - z += exp(-getEnergy(vts.getAt(j), h[i])); + z += exp(-getEnergy(vts.getAt(j).states(), h[i].states())); } for (j=0; j < vts.getSize(); j++) { - p = exp(-getEnergy(vts.getAt(j), h[i]))/z; + p = exp(-getEnergy(vts.getAt(j).states(), h[i].states()))/z; cout << p << endl; } cout << endl; diff --git a/Source/VisibleLayer.hpp b/Source/VisibleLayer.hpp index ff1d3ef..e01607e 100644 --- a/Source/VisibleLayer.hpp +++ b/Source/VisibleLayer.hpp @@ -23,15 +23,6 @@ public: { } - double getEnergy(const Weights &weights) - { - double energy; - - energy = -((Weights&)weights).visibleBias().transpose() * states(); - - return energy; - } - private: double accum(Layer &layer, Weights &weights, uint32_t index) {