- use Matrix, linear algebra library Eigen 3.2.2
git-svn-id: http://moon:8086/svn/software/trunk/projects/RBM@23 b431acfa-c32f-4a4a-93f1-934dc6c82436
This commit is contained in:
+49
-103
@@ -11,48 +11,41 @@
|
||||
#ifndef WEIGHTS_HPP
|
||||
#define WEIGHTS_HPP
|
||||
#include <stdint.h>
|
||||
#include <iostream>
|
||||
#include <Eigen/Dense>
|
||||
|
||||
#include "noise.h"
|
||||
|
||||
using namespace std;
|
||||
using namespace Eigen;
|
||||
|
||||
class Weights
|
||||
{
|
||||
public:
|
||||
Weights(const char *pFilename)
|
||||
: m_ppW(nullptr)
|
||||
, m_pBiasVisible(nullptr)
|
||||
, m_pBiasHidden(nullptr)
|
||||
, m_numVisible(0)
|
||||
: m_numVisible(0)
|
||||
, m_numHidden(0)
|
||||
{
|
||||
load(pFilename);
|
||||
}
|
||||
|
||||
Weights(uint32_t numVisible, uint32_t numHidden)
|
||||
: m_ppW(nullptr)
|
||||
, m_pBiasVisible(nullptr)
|
||||
, m_pBiasHidden(nullptr)
|
||||
, m_numVisible(numVisible)
|
||||
: m_numVisible(numVisible)
|
||||
, m_numHidden(numHidden)
|
||||
{
|
||||
Noise_Init(&m_noise, 0x32727155);
|
||||
alloc(numVisible, numHidden);
|
||||
shuffle(0);
|
||||
}
|
||||
|
||||
Weights()
|
||||
: m_ppW(nullptr)
|
||||
, m_pBiasVisible(nullptr)
|
||||
, m_pBiasHidden(nullptr)
|
||||
, m_numVisible(0)
|
||||
: m_numVisible(0)
|
||||
, m_numHidden(0)
|
||||
{
|
||||
Noise_Init(&m_noise, 0x32727155);
|
||||
}
|
||||
|
||||
Weights(const Weights &src)
|
||||
: m_ppW(nullptr)
|
||||
, m_pBiasVisible(nullptr)
|
||||
, m_pBiasHidden(nullptr)
|
||||
, m_numVisible(0)
|
||||
: m_numVisible(0)
|
||||
, m_numHidden(0)
|
||||
{
|
||||
Noise_Init(&m_noise, 0x32727155);
|
||||
@@ -69,7 +62,6 @@ public:
|
||||
void setUnits(uint32_t numVisible, uint32_t numHidden)
|
||||
{
|
||||
alloc(numVisible, numHidden);
|
||||
shuffle(0);
|
||||
}
|
||||
|
||||
void shuffle(double stdDev)
|
||||
@@ -77,68 +69,52 @@ public:
|
||||
uint32_t i, j;
|
||||
double kdev = stdDev*sqrt(12.0);
|
||||
|
||||
for (j=0; j < m_numVisible; j++)
|
||||
for (i=0; i < m_numVisible; i++)
|
||||
{
|
||||
m_pBiasVisible[j] = kdev*Noise_Uniform(&m_noise, 0.5);
|
||||
m_bv(i) = kdev*Noise_Uniform(&m_noise, 0.5);
|
||||
}
|
||||
|
||||
for (i=0; i < m_numHidden; i++)
|
||||
for (j=0; j < m_numHidden; j++)
|
||||
{
|
||||
m_pBiasHidden[i] = kdev*Noise_Uniform(&m_noise, 0.5);
|
||||
m_bh(j) = kdev*Noise_Uniform(&m_noise, 0.5);
|
||||
}
|
||||
|
||||
for (i=0; i < m_numHidden; i++)
|
||||
for (i=0; i < m_numVisible; i++)
|
||||
{
|
||||
for (j=0; j < m_numVisible; j++)
|
||||
for (j=0; j < m_numHidden; j++)
|
||||
{
|
||||
m_ppW[i][j] = kdev*Noise_Uniform(&m_noise, 0.5);
|
||||
m_w(i,j) = kdev*Noise_Uniform(&m_noise, 0.5);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Weights& operator= (const Weights &rhs)
|
||||
{
|
||||
uint32_t i, j;
|
||||
m_bv = rhs.m_bv;
|
||||
m_bh = rhs.m_bh;
|
||||
m_w = rhs.m_w;
|
||||
|
||||
for (j=0; j < m_numVisible; j++)
|
||||
{
|
||||
m_pBiasVisible[j] = rhs.m_pBiasVisible[j];
|
||||
}
|
||||
|
||||
for (i=0; i < m_numHidden; i++)
|
||||
{
|
||||
m_pBiasHidden[i] = rhs.m_pBiasHidden[i];
|
||||
}
|
||||
|
||||
for (i=0; i < m_numHidden; i++)
|
||||
{
|
||||
for (j=0; j < m_numVisible; j++)
|
||||
{
|
||||
m_ppW[i][j] = rhs.m_ppW[i][j];
|
||||
}
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
double **getWeights() const
|
||||
MatrixXd& weights()
|
||||
{
|
||||
return m_ppW;
|
||||
return m_w;
|
||||
}
|
||||
|
||||
double *getBiasVisible() const
|
||||
VectorXd& visibleBias()
|
||||
{
|
||||
return m_pBiasVisible;
|
||||
return m_bv;
|
||||
}
|
||||
|
||||
double *getBiasHidden() const
|
||||
VectorXd& hiddenBias()
|
||||
{
|
||||
return m_pBiasHidden;
|
||||
return m_bh;
|
||||
}
|
||||
|
||||
void print()
|
||||
{
|
||||
uint32_t i, j;
|
||||
double w;
|
||||
|
||||
printf("\n");
|
||||
printf("w(v,h) = (v^, h>)\n");
|
||||
@@ -146,8 +122,7 @@ public:
|
||||
{
|
||||
for (j=0; j < m_numHidden; j++)
|
||||
{
|
||||
w = m_ppW[j][i];
|
||||
printf("%3.6f ", w);
|
||||
printf("%3.6f ", m_w(i,j));
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
@@ -156,18 +131,18 @@ public:
|
||||
printf("bv = \n");
|
||||
for (i=0; i < m_numVisible; i++)
|
||||
{
|
||||
w = m_pBiasVisible[i];
|
||||
printf("%3.6f\n", w);
|
||||
printf("%3.6f\n", m_bv(i));
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
printf("bh = \n");
|
||||
for (i=0; i < m_numHidden; i++)
|
||||
{
|
||||
w = m_pBiasHidden[i];
|
||||
printf("%3.6f\n", w);
|
||||
printf("%3.6f\n", m_bh(i));
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
cout << m_w << endl;
|
||||
}
|
||||
|
||||
uint32_t getNumVisible()
|
||||
@@ -196,17 +171,17 @@ public:
|
||||
|
||||
for (i=0; i < m_numVisible; i++)
|
||||
{
|
||||
fprintf(pFile, "%3.6f\n", m_pBiasVisible[i]);
|
||||
fprintf(pFile, "%3.6f\n", m_bv(i));
|
||||
}
|
||||
for (i=0; i < m_numHidden; i++)
|
||||
{
|
||||
fprintf(pFile, "%3.6f\n", m_pBiasHidden[i]);
|
||||
fprintf(pFile, "%3.6f\n", m_bh(i));
|
||||
}
|
||||
for (i=0; i < m_numVisible; i++)
|
||||
{
|
||||
for (j=0; j < m_numHidden; j++)
|
||||
{
|
||||
fprintf(pFile, "%3.6f ", m_ppW[j][i]);
|
||||
fprintf(pFile, "%3.6f ", m_w(i,j));
|
||||
}
|
||||
fprintf(pFile, "\n");
|
||||
}
|
||||
@@ -234,12 +209,12 @@ public:
|
||||
for (i=0; i < numVisible; i++)
|
||||
{
|
||||
fscanf(pFile, "%f", &v);
|
||||
m_pBiasVisible[i] = v;
|
||||
m_bv(i) = v;
|
||||
}
|
||||
for (i=0; i < numHidden; i++)
|
||||
{
|
||||
fscanf(pFile, "%f", &v);
|
||||
m_pBiasHidden[i] = v;
|
||||
m_bh(i) = v;
|
||||
}
|
||||
for (i=0; i < numVisible; i++)
|
||||
{
|
||||
@@ -247,7 +222,7 @@ public:
|
||||
{
|
||||
|
||||
fscanf(pFile, "%f", &v);
|
||||
m_ppW[j][i] = v;
|
||||
m_w(i, j) = v;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -255,60 +230,31 @@ public:
|
||||
}
|
||||
|
||||
private:
|
||||
double **m_ppW;
|
||||
double *m_pBiasVisible;
|
||||
double *m_pBiasHidden;
|
||||
uint32_t m_numVisible;
|
||||
uint32_t m_numHidden;
|
||||
noise_gen_t m_noise;
|
||||
MatrixXd m_w;
|
||||
VectorXd m_bv;
|
||||
VectorXd m_bh;
|
||||
|
||||
void alloc(uint32_t numVisible, uint32_t numHidden)
|
||||
{
|
||||
uint32_t i;
|
||||
|
||||
if (m_ppW)
|
||||
if ((m_numVisible == numVisible) && (m_numHidden == numHidden))
|
||||
{
|
||||
if ((numVisible == m_numVisible) && (numHidden == m_numHidden))
|
||||
{
|
||||
return;
|
||||
}
|
||||
free();
|
||||
alloc(numVisible, numHidden);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_numVisible = numVisible;
|
||||
m_numHidden = numHidden;
|
||||
m_ppW = new double*[m_numHidden];
|
||||
for (i=0; i < m_numHidden; i++)
|
||||
{
|
||||
m_ppW[i] = new double[m_numVisible];
|
||||
}
|
||||
m_pBiasVisible = new double[m_numVisible];
|
||||
m_pBiasHidden = new double[m_numHidden];
|
||||
}
|
||||
m_numVisible = numVisible;
|
||||
m_numHidden = numHidden;
|
||||
|
||||
m_w.resize(numVisible, numHidden);
|
||||
m_bv.resize(numVisible);
|
||||
m_bh.resize(numHidden);
|
||||
|
||||
shuffle(0);
|
||||
}
|
||||
|
||||
void free()
|
||||
{
|
||||
uint32_t i;
|
||||
|
||||
|
||||
if (m_ppW)
|
||||
{
|
||||
for (i=0; i < m_numHidden; i++)
|
||||
{
|
||||
delete [] m_ppW[i];
|
||||
}
|
||||
delete [] m_ppW;
|
||||
m_ppW = nullptr;
|
||||
}
|
||||
|
||||
delete [] m_pBiasVisible;
|
||||
m_pBiasVisible = nullptr;
|
||||
|
||||
delete [] m_pBiasHidden;
|
||||
m_pBiasHidden = nullptr;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user