#include #include #include #include #include #include #include #include #include "Rbm.hpp" #include "RbmLayer.hpp" #include "Stack.hpp" using namespace std; class RbmListener : public Rbm::IListener { public: RbmListener() {} virtual ~RbmListener() {} bool onProgress(const Rbm::Status &status) { std::cout << "Progress : " << 100*status.progress << " %" << std::endl; std::cout << "epoch : " << status.epoch << std::endl; std::cout << "trainingSizeRemain: " << status.trainingSizeRemain << std::endl; std::cout << "error (per mini batch) = " << status.err << std::endl; std::cout << "error (total) = " << status.err_total << std::endl; std::cout << "L1 = " << status.L1 << std::endl; std::cout << "L2 = " << status.L2 << std::endl; return true; } }; arma::mat loadTraining(const string &filename) { uint32_t numTraining = 0; uint32_t numVisible = 0; FILE *pFile; pFile = fopen(filename.c_str(), "r"); if (!pFile) { std::cout << "Could not open " << filename << "!" << std::endl; return 0; } int result = fscanf(pFile, "%d\n", &numTraining); if (result < 0) { return 0; } result = fscanf(pFile, "%d\n", &numVisible); if (result < 0) { return 0; } arma::mat data = arma::zeros(numTraining, numVisible); uint32_t i, j; for (i=0; i < numTraining; i++) { for (j=0; j < numVisible; j++) { float v; int result = fscanf(pFile, "%f", &v); if (result > 0) { data(i, j) = v; } } } fclose(pFile); return data; } int main() { printf("Hallo, Welt!\n"); const string project("test"); RbmListener statusDisplay; Stack stack(project); arma::mat batch = loadTraining(project + string(".training.dat")); size_t numTraining = batch.n_rows; printf("Loaded %d training samples\n", (int)numTraining); #if 0 size_t numVisibleX = 16; size_t numVisibleY = 16; size_t numHidden = 256; int i=0; RbmLayer *lowerLayer = new RbmLayer("Layer", i, numVisibleX, numVisibleY, numHidden); stack.addLayer(lowerLayer); numHidden >>= 1; i++; for (i; i < 1; i++) { RbmLayer *layer = new RbmLayer("Layer", i, lowerLayer->bh().n_elem, 1, numHidden); lowerLayer = layer; stack.addLayer(layer); numHidden >>= 1; } // Save project stack.save(); #else stack.load(); #endif // Load weights stack.loadWeights(); // Train stack stack.train(batch, 1000, 1000, &statusDisplay); // Save weights stack.saveWeights(); RbmLayer *layer = stack.getLayer(0); arma::mat v = arma::randu(numTraining, layer->bv().n_elem); arma::mat h = layer->toHiddenProbs(v); arma::mat r = layer->toVisibleProbs(h); return 0; }