- correct energy calc. for BB-RBMs
git-svn-id: http://moon:8086/svn/software/trunk/projects/RBM@39 b431acfa-c32f-4a4a-93f1-934dc6c82436
This commit is contained in:
@@ -23,15 +23,6 @@ public:
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
double getEnergy(const Weights &weights)
|
|
||||||
{
|
|
||||||
double energy;
|
|
||||||
|
|
||||||
energy = -((Weights&)weights).hiddenBias().transpose() * states();
|
|
||||||
|
|
||||||
return energy;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
double accum(Layer &layer, Weights &weights, uint32_t index)
|
double accum(Layer &layer, Weights &weights, uint32_t index)
|
||||||
{
|
{
|
||||||
|
|||||||
+3
-6
@@ -124,8 +124,6 @@ public:
|
|||||||
return m_numUnits;
|
return m_numUnits;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual double getEnergy(const Weights &weights) = 0;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
noise_gen_t m_noise;
|
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;
|
uint32_t i;
|
||||||
double var = sigma*sigma;
|
double var = sigma*sigma;
|
||||||
double k = 1.0/sqrt(2*3.14159265359*var);
|
double k = 1.0/sqrt(2*3.14159265359*var);
|
||||||
double mu = 0;
|
|
||||||
|
|
||||||
for (i=0; i < m_numUnits; i++)
|
for (i=0; i < m_numUnits; i++)
|
||||||
{
|
{
|
||||||
double x2 = ((double)x[i]-mu);
|
double x2 = (1-(double)mu[i]);
|
||||||
m_probs[i] = 1-exp(-x2*x2/(2*var));
|
m_probs[i] = k*exp(-0.5*x2*x2/var);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -639,6 +639,7 @@ void MainComponent::sliderValueChanged (Slider* sliderThatWasMoved)
|
|||||||
VisibleLayer &p = (VisibleLayer&)m_layers.getAt((int)sliderThatWasMoved->getValue());
|
VisibleLayer &p = (VisibleLayer&)m_layers.getAt((int)sliderThatWasMoved->getValue());
|
||||||
DrawTraining->setData(p.states());
|
DrawTraining->setData(p.states());
|
||||||
redrawReconstruction();
|
redrawReconstruction();
|
||||||
|
|
||||||
}
|
}
|
||||||
//[/UserSliderCode_patterSlider]
|
//[/UserSliderCode_patterSlider]
|
||||||
}
|
}
|
||||||
@@ -850,6 +851,9 @@ void MainComponent::redrawReconstruction()
|
|||||||
{
|
{
|
||||||
DrawHidden->setData(m_pRbm->toHidden(DrawTraining->getData()));
|
DrawHidden->setData(m_pRbm->toHidden(DrawTraining->getData()));
|
||||||
DrawReconstruction->setData(m_pRbm->toVisible(DrawHidden->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)
|
void MainComponent::redrawWeights(int index)
|
||||||
|
|||||||
+7
-17
@@ -105,7 +105,6 @@ public:
|
|||||||
sumBiasH.fill(0);
|
sumBiasH.fill(0);
|
||||||
for (i=0; i < vt.getSize(); i++)
|
for (i=0; i < vt.getSize(); i++)
|
||||||
{
|
{
|
||||||
//t = (uint32_t)(0.5 + (vt.getSize()-1)*Noise_Uniform(&m_noise, 0.5));
|
|
||||||
t = i;
|
t = i;
|
||||||
h.probsUpdateLogistic(vt[t], m_w, m_lambda, sigma);
|
h.probsUpdateLogistic(vt[t], m_w, m_lambda, sigma);
|
||||||
|
|
||||||
@@ -221,24 +220,15 @@ public:
|
|||||||
return m_progress;
|
return m_progress;
|
||||||
}
|
}
|
||||||
|
|
||||||
double getEnergy(VisibleLayer &v, HiddenLayer &h)
|
double getEnergy(const VectorXd& visible, const VectorXd& hidden)
|
||||||
{
|
{
|
||||||
uint32_t i, j;
|
|
||||||
double energy;
|
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++)
|
return -energy/(m_sigma*m_sigma);
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void prob(LayerArray<VisibleLayer> &vts)
|
void prob(LayerArray<VisibleLayer> &vts)
|
||||||
@@ -278,11 +268,11 @@ public:
|
|||||||
z = 0;
|
z = 0;
|
||||||
for (j=0; j < vts.getSize(); j++)
|
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++)
|
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 << p << endl;
|
||||||
}
|
}
|
||||||
cout << endl;
|
cout << endl;
|
||||||
|
|||||||
@@ -23,15 +23,6 @@ public:
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
double getEnergy(const Weights &weights)
|
|
||||||
{
|
|
||||||
double energy;
|
|
||||||
|
|
||||||
energy = -((Weights&)weights).visibleBias().transpose() * states();
|
|
||||||
|
|
||||||
return energy;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
double accum(Layer &layer, Weights &weights, uint32_t index)
|
double accum(Layer &layer, Weights &weights, uint32_t index)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user