diff --git a/Makefile b/Makefile index 0a063c4..4bfbbf5 100644 --- a/Makefile +++ b/Makefile @@ -12,8 +12,9 @@ CXXFLAGS += -std=c++11 CXXFLAGS_debug := ${CXXFLAGS} -O0 -g CXXFLAGS_release := ${CXXFLAGS} -O2 +DEFINES := -DARMA_OPENMP_THREADS=1 ${BUILD_DIR}/main.elf: ${BUILD_DIR} ${SRCS} - g++ ${CXXFLAGS_${CONFIG}} ${SRCS} -o $@ ${LIBS} + g++ ${CXXFLAGS_${CONFIG}} ${DEFINES} ${SRCS} -o $@ ${LIBS} ${BUILD_DIR}: mkdir -p $@ diff --git a/source/Stack.cpp b/source/Stack.cpp index b8fb306..27eb2e0 100644 --- a/source/Stack.cpp +++ b/source/Stack.cpp @@ -50,12 +50,12 @@ void Stack::addLayer(RbmLayer *pOtherLayer) } } -RbmLayer* Stack::getLayer(size_t id) const +RbmLayer* Stack::getLayer(size_t layerId) const { RbmLayer *pLayer = m_pLayers; while(pLayer) { - if (pLayer->id() == id) + if (pLayer->id() == layerId) { return pLayer; } @@ -88,4 +88,43 @@ void Stack::save(size_t numTraining) ofs << writer.write(project); } +void Stack::saveWeights() +{ + RbmLayer *pLayer = m_pLayers; + while(pLayer) + { + pLayer->saveWeights(); + } +} + +void Stack::train(const arma::mat& batch, size_t miniBatchSize, size_t numEpochs, Rbm::IListener* pListener) +{ + RbmLayer *pLayer = m_pLayers; + while(pLayer) + { + train(pLayer->id(), batch, miniBatchSize, numEpochs, pListener); + pLayer = pLayer->upper; + } +} + +void Stack::train(size_t layerId, const arma::mat& batch, size_t miniBatchSize, size_t numEpochs, Rbm::IListener* pListener) +{ + arma::mat thisBatch = batch; + RbmLayer *pLayer = m_pLayers; + while(pLayer) + { + if (pLayer->id() == layerId) + { + break; + } + thisBatch = pLayer->toHiddenProbs(thisBatch); + pLayer = pLayer->upper; + } + + if (pLayer) + { + std::cout << m_prjname << ": " << " Training of layer " << std::to_string(layerId) << std::endl; + pLayer->train(thisBatch, miniBatchSize, numEpochs, pListener); + } +} diff --git a/source/Stack.hpp b/source/Stack.hpp index 35ee32b..458b8f5 100644 --- a/source/Stack.hpp +++ b/source/Stack.hpp @@ -28,8 +28,12 @@ public: virtual ~Stack(); void addLayer(RbmLayer *pLayer); - RbmLayer* getLayer(size_t id) const; + RbmLayer* getLayer(size_t layerId) const; + + 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); void save(size_t numTraining); + void saveWeights(); private: const std::string &m_prjname; @@ -37,5 +41,6 @@ private: }; + #endif /* STACK_HPP */ diff --git a/source/main.cpp b/source/main.cpp index bfb2a4b..7d85b4b 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -90,19 +90,28 @@ int main() size_t numTraining = batch.n_rows; size_t numVisibleX = 28; size_t numVisibleY = 28; - size_t numHidden = 64; + size_t numHidden = 256; printf("Loaded %d training samples\n", (int)numTraining); - for (int i=0; i < 8; i++) + int i=0; + RbmLayer *lowerLayer = new RbmLayer(project, i, numVisibleX, numVisibleY, numHidden, rbmParams); + stack.addLayer(lowerLayer); + numHidden >>= 1; + + i++; + for (i; i < 4; i++) { - RbmLayer *layer = new RbmLayer(project, i, numVisibleX, numVisibleY, numHidden, rbmParams); + RbmLayer *layer = new RbmLayer(project, i, lowerLayer->bh().n_elem, 1, numHidden, rbmParams); + lowerLayer = layer; stack.addLayer(layer); + numHidden >>= 1; } stack.save(numTraining); + stack.train(batch, 1000, 100, &statusDisplay); + stack.saveWeights(); + RbmLayer *layer = stack.getLayer(0); - layer->train(batch, 1000, 100, &statusDisplay); - layer->saveWeights(); arma::mat v = arma::randu(numTraining, numVisibleX*numVisibleY); arma::mat h = layer->toHiddenProbs(v); arma::mat r = layer->toVisibleProbs(h);