diff --git a/source/ILayer.hpp b/source/ILayer.hpp index 8caea5f..feb9863 100644 --- a/source/ILayer.hpp +++ b/source/ILayer.hpp @@ -32,11 +32,6 @@ public: virtual void up_pass(arma::mat const &v) = 0; virtual void down_pass(arma::mat &dst, arma::mat const &src) = 0; - void registerLayer(ILayer *pLayer) - { - lower = pLayer; - pLayer->upper = this; - } }; diff --git a/source/Layer.cpp b/source/Layer.cpp index e9eac7b..695850c 100644 --- a/source/Layer.cpp +++ b/source/Layer.cpp @@ -15,35 +15,37 @@ using namespace std; Layer::Layer(const string &prjname, size_t id, size_t numVisibleX, size_t numVisibleY, size_t numHidden) -: m_prjname(prjname) +: upper(nullptr) +, lower(nullptr) +, m_prjname(prjname) , m_id(id) , m_numVisibleX(numVisibleX) , m_numVisibleY(numVisibleY) , m_rbm(m_rbm_params, numVisibleX*numVisibleY, numHidden) { - + m_weightsFile = m_prjname + string(".weights.") + to_string((int)m_id) + string(".dat"); } Layer::Layer(const Layer& orig) -: m_prjname(orig.m_prjname) +: upper(nullptr) +, lower(nullptr) +, m_prjname(orig.m_prjname) +, m_weightsFile(orig.m_weightsFile) , m_id(orig.m_id) , m_numVisibleX(orig.m_numVisibleX) , m_numVisibleY(orig.m_numVisibleY) , m_rbm_params(orig.m_rbm_params) , m_rbm(orig.m_rbm) { - m_weightsFile = m_prjname + string(".weights.dat"); } Layer::~Layer() { } -void Layer::saveWeight() +void Layer::saveWeights() { - FILE *pFile; - - pFile = fopen(m_weightsFile.c_str(), "w"); + FILE *pFile = fopen(m_weightsFile.c_str(), "w"); if (!pFile) { @@ -91,7 +93,7 @@ Json::Value Layer::toJson() const { Json::Value layer; layer["name"] = string("Layer ") + to_string((int)m_id); - layer["weights_file"] = m_prjname + string(".weights.dat"); + layer["weights_file"] = m_weightsFile; layer["numVisibleX"] = to_string((int)m_numVisibleX); layer["numVisibleY"] = to_string((int)m_numVisibleX); layer["rbm"] = m_rbm.toJson(); diff --git a/source/Layer.hpp b/source/Layer.hpp index 317d25d..b6607e5 100644 --- a/source/Layer.hpp +++ b/source/Layer.hpp @@ -21,20 +21,28 @@ #include "Rbm.hpp" #include "ILayer.hpp" -class Layer : public ILayer +class Layer { public: + Layer *upper; + Layer *lower; + Layer(const std::string &prjname, size_t id, size_t numVisibleX, size_t numVisibleY, size_t numHidden); Layer(const Layer& orig); virtual ~Layer(); Json::Value toJson() const; Rbm& rbm(); - void saveWeight(); + void saveWeights(); - void up_pass(const arma::mat& v) override; - void down_pass(arma::mat& dst, const arma::mat& src) override; + void up_pass(const arma::mat& v); + void down_pass(arma::mat& dst, const arma::mat& src); + size_t id() + { + return m_id; + } + private: const std::string &m_prjname; std::string m_weightsFile; diff --git a/source/Stack.cpp b/source/Stack.cpp index cfaafec..63b4388 100644 --- a/source/Stack.cpp +++ b/source/Stack.cpp @@ -13,11 +13,17 @@ #include "Stack.hpp" -Stack::Stack() +using namespace std; + +Stack::Stack(const std::string &prjname) +: m_prjname(prjname) +, m_pLayers(nullptr) { } Stack::Stack(const Stack& orig) +: m_prjname(orig.m_prjname) +, m_pLayers(orig.m_pLayers) { } @@ -25,3 +31,60 @@ Stack::~Stack() { } +void Stack::addLayer(Layer *pOtherLayer) +{ + if (!m_pLayers) + { + m_pLayers = pOtherLayer; + pOtherLayer->lower = nullptr; + } + else + { + Layer *pLayer = m_pLayers; + while(pLayer->upper) + { + pLayer = pLayer->upper; + } + pLayer->upper = pOtherLayer; + pOtherLayer->lower = pLayer; + } +} + +const Layer* Stack::getLayer(size_t id) +{ + Layer *pLayer = m_pLayers; + while(pLayer) + { + if (pLayer->id() == id) + { + return pLayer; + } + pLayer = pLayer->upper; + } + return nullptr; + +} + +void Stack::save(size_t numTraining) +{ + ofstream ofs(m_prjname + string(".prj")); + + Json::StyledWriter writer; + Json::Value project; + project["stack"]["name"] = m_prjname; + project["stack"]["num_training"] = (int)numTraining; + project["stack"]["training_file"] = m_prjname + string(".training.dat"); + + Json::Value layers(Json::arrayValue); + Layer *pLayer = m_pLayers; + while(pLayer) + { + layers.append(pLayer->toJson()); + pLayer = pLayer->upper; + } + project["stack"]["layers"] = layers; + + ofs << writer.write(project); +} + + diff --git a/source/Stack.hpp b/source/Stack.hpp index f4083f2..51cc9f8 100644 --- a/source/Stack.hpp +++ b/source/Stack.hpp @@ -14,6 +14,8 @@ #ifndef STACK_HPP #define STACK_HPP +#include +#include #include #include #include "Layer.hpp" @@ -21,15 +23,18 @@ class Stack { public: - Stack(); + Stack(const std::string &prjname); Stack(const Stack& orig); virtual ~Stack(); - void addLayer(const Layer &layer); - const Layer& getLayer(); + void addLayer(Layer *pLayer); + const Layer* getLayer(size_t id); + void save(size_t numTraining); private: - + const std::string &m_prjname; + Layer *m_pLayers; + }; #endif /* STACK_HPP */ diff --git a/source/main.cpp b/source/main.cpp index 2d1f49f..973d95f 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -8,6 +8,7 @@ #include #include "Rbm.hpp" #include "Layer.hpp" +#include "Stack.hpp" using namespace std; class RbmListener : public Rbm::IListener @@ -74,31 +75,11 @@ arma::mat loadTraining(const string &filename) } -void saveProject(const string &prjname, const Layer &layer, size_t numTraining) -{ - ofstream ofs(prjname + string(".prj")); - - Json::StyledWriter writer; - Json::Value project; - project["project"]["name"] = prjname; - project["project"]["num_training"] = (int)numTraining; - project["project"]["training_file"] = prjname + string(".training.dat"); - - Json::Value jsonLayer = layer.toJson(); - - Json::Value jsonLayers(Json::arrayValue); - jsonLayers.append(jsonLayer); - - project["project"]["layers"] = jsonLayers; - - ofs << writer.write(project); -} - int main() { printf("Hallo, Welt!\n"); - const string project("mnist"); + const string project("mnist_2"); RbmListener statusDisplay; Rbm::Params rbmParams; @@ -110,15 +91,22 @@ int main() size_t numVisibleY = 28; size_t numHidden = 64; - Layer layer(project, 0, numVisibleX, numVisibleY, numHidden); - - saveProject(project, layer, numTraining); - printf("Loaded %d training samples\n", (int)numTraining); + Layer layer(project, 0, numVisibleX, numVisibleY, numHidden); + Layer layer1(project, 1, numVisibleX, numVisibleY, numHidden); + Layer layer2(project, 2, numVisibleX, numVisibleY, numHidden); + Layer layer3(project, 3, numVisibleX, numVisibleY, numHidden); + Stack stack(project); + stack.addLayer(&layer); + stack.addLayer(&layer1); + stack.addLayer(&layer2); + stack.addLayer(&layer3); + stack.save(numTraining); + Rbm &rbm = layer.rbm(); rbm.train(batch, 1000, 100, &statusDisplay); - layer.saveWeight(); + layer.saveWeights(); arma::mat v = arma::randu(numTraining, numVisibleX*numVisibleY); arma::mat h = rbm.toHiddenProbs(v); arma::mat r = rbm.toVisibleProbs(h);