#include #include #include #include #include #include #include #include #include "Rbm.hpp" #include "Layer.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("mnist_2"); RbmListener statusDisplay; Rbm::Params rbmParams; arma::mat batch = loadTraining(project + string(".training.dat")); size_t numTraining = batch.n_rows; size_t numVisibleX = 28; size_t numVisibleY = 28; size_t numHidden = 64; printf("Loaded %d training samples\n", (int)numTraining); Layer layer0(project, 0, numVisibleX, numVisibleY, numHidden, rbmParams); Layer layer1(project, 1, numVisibleX, numVisibleY, numHidden, rbmParams); Layer layer2(project, 2, numVisibleX, numVisibleY, numHidden, rbmParams); Layer layer3(project, 3, numVisibleX, numVisibleY, numHidden, rbmParams); Stack stack(project); stack.addLayer(&layer0); stack.addLayer(&layer1); stack.addLayer(&layer2); stack.addLayer(&layer3); stack.save(numTraining); layer0.train(batch, 1000, 100, &statusDisplay); layer0.saveWeights(); arma::mat v = arma::randu(numTraining, numVisibleX*numVisibleY); arma::mat h = layer0.toHiddenProbs(v); arma::mat r = layer0.toVisibleProbs(h); return 0; }