diff --git a/Makefile b/Makefile index 00cef28..f329ba2 100644 --- a/Makefile +++ b/Makefile @@ -11,6 +11,9 @@ GUI_GCC_SRCS := noise.c TEST_CXX_SRCS := main.cpp Rbm.cpp Layer.cpp Stack.cpp TEST_GCC_SRCS := noise.c +POET_CXX_SRCS := poet.cpp Rbm.cpp Layer.cpp Stack.cpp +POET_GCC_SRCS := noise.c + CXX_OBJS := $(addprefix ${BUILD_DIR}/, $(subst .cpp,.o,$(${PRJ}_CXX_SRCS))) GCC_OBJS := $(addprefix ${BUILD_DIR}/, $(subst .c,.o,$(${PRJ}_GCC_SRCS))) @@ -32,6 +35,7 @@ DEFINES := -DARMA_OPENMP_THREADS=1 GUI_TARGET := ${JUCE_LIB} ${BUILD_DIR}/rbm.elf TEST_TARGET := ${BUILD_DIR}/test.elf +POET_TARGET := ${BUILD_DIR}/poet.elf all: ${${PRJ}_TARGET} @@ -55,6 +59,9 @@ ${BUILD_DIR}/rbm.elf: ${CXX_OBJS} ${GCC_OBJS} juce/build/${CONFIG}/libjuce.a ${BUILD_DIR}/test.elf: ${CXX_OBJS} ${GCC_OBJS} gcc ${LFLAGS_${CONFIG}} ${CXX_OBJS} ${GCC_OBJS} ${LIBS} -o $@ +${BUILD_DIR}/poet.elf: ${CXX_OBJS} ${GCC_OBJS} + gcc ${LFLAGS_${CONFIG}} ${CXX_OBJS} ${GCC_OBJS} ${LIBS} -o $@ + ${JUCE_LIB}: make -C juce clean: diff --git a/source/poet.cpp b/source/poet.cpp new file mode 100644 index 0000000..e93e780 --- /dev/null +++ b/source/poet.cpp @@ -0,0 +1,107 @@ +#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(Rbm *pRbm, const Rbm::Status &status) + { + std::cout << "Progress : " << status.progress << " %" << 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; + } +}; + +int main() +{ + printf("Hallo, Welt!\n"); + + const string project("context99"); + + Stack stack(".", project); + +#if CREATE_TEST + stack.addTraining(stack.trainingBatch().row(1)); + printf("There are %d training samples\n", (int)stack.trainingBatch().n_rows); + + stack.delTraining(0); + printf("There are %d training samples\n", (int)stack.trainingBatch().n_rows); + + const int numLayers = 4; + int i = 0; + Layer *lowerLayer = new Layer("Layer", i, 16, 16, 8); + stack.addLayer(lowerLayer); + + for (++i; i < numLayers; i++) + { + Layer *layer = new Layer("Layer", i, lowerLayer->bh().n_elem, 1, lowerLayer->bh().n_elem >> 1); + layer->params().learningRate = lowerLayer->params().learningRate/2; + layer->params().numEpochs = lowerLayer->params().numEpochs/2; + lowerLayer = layer; + stack.addLayer(layer); + } + + // Save project + stack.save(); + + // Shake weights + stack.weightsInit(0.01); + + // Save weights + stack.saveWeights(); + +#else + // Load project + stack.load(); + + // Load weights + stack.loadWeights(); + + // Load training + stack.loadTrainingBatch(); + +#endif + +#if TRAIN_TEST + RbmListener statusDisplay; + + // Train stack + stack.train(&statusDisplay); + + // Save weights + stack.saveWeights(); +#endif + Layer *layer = stack.getLayer(0); + arma::mat v = stack.trainingBatch(); + v.print("t"); + layer->calcContextBatch(v); + arma::mat h = layer->toHiddenProbs(v); + arma::mat r = layer->toVisibleProbs(h); + + v.print("v1"); + r = layer->upDownPass(v); + r.print("v2"); + + arma::mat err = Rbm::rms_error(r-v); + err.print("err"); + + + return 0; +}