diff --git a/source/RbmLayer.cpp b/source/RbmLayer.cpp index 1a2c299..a65aeb9 100644 --- a/source/RbmLayer.cpp +++ b/source/RbmLayer.cpp @@ -14,25 +14,25 @@ #include "RbmLayer.hpp" using namespace std; -RbmLayer::RbmLayer(const string &prjname, size_t id, size_t numVisibleX, size_t numVisibleY, size_t numHidden, const Rbm::Params ¶ms) +RbmLayer::RbmLayer(const string &name, size_t id, size_t numVisibleX, size_t numVisibleY, size_t numHidden, const Rbm::Params ¶ms) : Rbm(params, numVisibleX*numVisibleY, numHidden) , upper(nullptr) , lower(nullptr) -, m_prjname(prjname) +, m_name(name) , m_id(id) , m_numVisibleX(numVisibleX) , m_numVisibleY(numVisibleY) , m_rbm_params(params) { - cout << "Create Layer " << m_prjname << "::" << to_string((int)m_id) << endl; - m_weightsFile = m_prjname + string(".weights.") + to_string((int)m_id) + string(".dat"); + cout << "Create Layer " << m_name << "." << to_string((int)m_id) << endl; + m_weightsFile = m_name + "." + to_string((int)m_id) + string(".weights.dat"); } RbmLayer::RbmLayer(const RbmLayer& orig) : Rbm(orig.m_rbm_params, orig.bv().n_elem, orig.bh().n_elem) , upper(nullptr) , lower(nullptr) -, m_prjname(orig.m_prjname) +, m_name(orig.m_name) , m_weightsFile(orig.m_weightsFile) , m_id(orig.m_id) , m_numVisibleX(orig.m_numVisibleX) @@ -45,18 +45,22 @@ RbmLayer::~RbmLayer() { } -bool RbmLayer::loadWeights() +bool RbmLayer::loadWeights(const string &prjname) { int numVisibleX; int numVisibleY; int numHidden; - FILE *pFile; - pFile = fopen(m_weightsFile.c_str(),"r"); + string filename = m_weightsFile; + if (prjname.size() > 0) + { + filename = prjname + string(".") + m_weightsFile; + } + FILE *pFile = fopen(filename.c_str(),"r"); if (!pFile) { - std::cout << "loadWeights(): Could not open " << m_weightsFile << " for reading!" << std::endl; + std::cout << "loadWeights(): Could not open " << filename << " for reading!" << std::endl; return false; } @@ -103,13 +107,18 @@ bool RbmLayer::loadWeights() return true; } -bool RbmLayer::saveWeights() +bool RbmLayer::saveWeights(const string &prjname) { - FILE *pFile = fopen(m_weightsFile.c_str(), "w"); + string filename = m_weightsFile; + if (prjname.size() > 0) + { + filename = prjname + string(".") + m_weightsFile; + } + FILE *pFile = fopen(filename.c_str(),"w"); if (!pFile) { - std::cout << "saveWeights(): Could not open " << m_weightsFile << " for writing!" << std::endl; + std::cout << "saveWeights(): Could not open " << filename << " for writing!" << std::endl; return false; } @@ -144,10 +153,12 @@ Json::Value RbmLayer::toJson() const { std::cout << "Exporting RbmLayer " << to_string((int)m_id) << std::endl; Json::Value layer; - layer["name"] = string("Layer ") + to_string((int)m_id); + layer["name"] = m_name; + layer["id"] = (int)m_id; layer["weights_file"] = m_weightsFile; - layer["numVisibleX"] = to_string((int)m_numVisibleX); - layer["numVisibleY"] = to_string((int)m_numVisibleX); + layer["numVisibleX"] = (int)m_numVisibleX; + layer["numVisibleY"] = (int)m_numVisibleX; + layer["numHidden"] = (int)m_bh.n_elem; layer["rbm"] = Rbm::toJson(); return layer; diff --git a/source/RbmLayer.hpp b/source/RbmLayer.hpp index 80a9dbe..97cd4f3 100644 --- a/source/RbmLayer.hpp +++ b/source/RbmLayer.hpp @@ -32,8 +32,8 @@ public: virtual ~RbmLayer(); Json::Value toJson() const; - bool loadWeights(); - bool saveWeights(); + bool loadWeights(const std::string &prjname=""); + bool saveWeights(const std::string &prjname=""); arma::mat up_pass(const arma::mat& hidden); arma::mat down_pass(const arma::mat& visible); @@ -44,7 +44,7 @@ public: } private: - const std::string &m_prjname; + const std::string &m_name; std::string m_weightsFile; size_t m_id; size_t m_numVisibleX; diff --git a/source/Stack.cpp b/source/Stack.cpp index 129a859..07ebcf9 100644 --- a/source/Stack.cpp +++ b/source/Stack.cpp @@ -65,7 +65,37 @@ RbmLayer* Stack::getLayer(size_t layerId) const } -bool Stack::save(size_t numTraining) +bool Stack::load() +{ + std::cout << "Importing Project " << m_prjname << std::endl; + ifstream ifs(m_prjname + string(".prj")); + + Json::Reader reader; + Json::Value project; + reader.parse(ifs, project); + + const string &prjname = project["stack"]["name"].asString(); + Json::Value &layers = project["stack"]["layers"]; + + for (int i=0; i < layers.size(); i++) + { + Json::Value &layer = layers[i]; + + string layername = layer["name"].asString(); + int numVisibleX = layer["numVisibleX"].asInt(); + int numVisibleY = layer["numVisibleY"].asInt(); + int numHidden = layer["numHidden"].asInt(); + Json::Value &rbm = layer["rbm"]["params"]; + Rbm::Params params; + params.fromJson(rbm); + + addLayer(new RbmLayer(layername, i, numVisibleX, numVisibleY, numHidden, params)); + } + + return true; +} + +bool Stack::save() { std::cout << "Exporting Project " << m_prjname << std::endl; ofstream ofs(m_prjname + string(".prj")); @@ -73,8 +103,6 @@ bool Stack::save(size_t numTraining) 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); RbmLayer *pLayer = m_pLayers; @@ -95,7 +123,7 @@ bool Stack::loadWeights() RbmLayer *pLayer = m_pLayers; while(pLayer) { - if (!pLayer->loadWeights()) + if (!pLayer->loadWeights(m_prjname)) { return false; } @@ -109,7 +137,7 @@ bool Stack::saveWeights() RbmLayer *pLayer = m_pLayers; while(pLayer) { - if (!pLayer->saveWeights()) + if (!pLayer->saveWeights(m_prjname)) { return false; } diff --git a/source/Stack.hpp b/source/Stack.hpp index 1e579dd..7829d9b 100644 --- a/source/Stack.hpp +++ b/source/Stack.hpp @@ -32,7 +32,8 @@ public: void train(size_t layerId, const arma::mat& batch, size_t miniBatchSize, size_t numEpochs, Rbm::IListener* pListener); void train(const arma::mat& batch, size_t miniBatchSize, size_t numEpochs, Rbm::IListener* pListener); - bool save(size_t numTraining); + bool load(); + bool save(); bool loadWeights(); bool saveWeights(); diff --git a/source/main.cpp b/source/main.cpp index c853e6e..5ebd0b5 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -94,22 +94,26 @@ int main() printf("Loaded %d training samples\n", (int)numTraining); +#if 0 int i=0; - RbmLayer *lowerLayer = new RbmLayer(project, i, numVisibleX, numVisibleY, numHidden, rbmParams); + RbmLayer *lowerLayer = new RbmLayer("Layer", i, numVisibleX, numVisibleY, numHidden, rbmParams); stack.addLayer(lowerLayer); numHidden >>= 1; i++; for (i; i < 4; i++) { - RbmLayer *layer = new RbmLayer(project, i, lowerLayer->bh().n_elem, 1, numHidden, rbmParams); + RbmLayer *layer = new RbmLayer("Layer", i, lowerLayer->bh().n_elem, 1, numHidden, rbmParams); lowerLayer = layer; stack.addLayer(layer); numHidden >>= 1; } // Save project - stack.save(numTraining); + stack.save(); +#else + stack.load(); +#endif // Load weights stack.loadWeights();