Repo root had ~35 groups of .prj/.dat files loose alongside the build system and source, all sharing one flat namespace. Centralize the new prj/<name>/ convention inside AStack::loadWeights/saveWeights/ loadTrainingBatch/saveTrainingBatch and StackCreator::fromFile/toFile (via a new AStack::projectDir() helper) -- these already have access to the project name, so callers (poet.cpp, the GUI) need no changes at all; they keep passing the same base directory they always did. Filenames inside each project folder are unchanged (e.g. prj/mnist_2/mnist_2.prj, prj/mnist_2/mnist_2.Layer.0.w.dat) -- only the directory moves. Added Matutils::ensureDir() (mkdir -p equivalent; no std::filesystem in C++11) since ofstream won't create directories, used wherever a project is saved for the first time. File migration for existing projects is a separate commit. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016K8Gu7Qejd11JbdiHZqYAs
130 lines
2.9 KiB
C++
130 lines
2.9 KiB
C++
/*
|
|
* To change this license header, choose License Headers in Project Properties.
|
|
* To change this template file, choose Tools | Templates
|
|
* and open the template in the editor.
|
|
*/
|
|
|
|
/*
|
|
* File: matutils.hpp
|
|
* Author: jens
|
|
*
|
|
* Created on 21. Januar 2022, 08:28
|
|
*/
|
|
|
|
#ifndef MATUTILS_HPP
|
|
#define MATUTILS_HPP
|
|
|
|
#include "RnnTextHelper.hpp"
|
|
|
|
#include <math.h>
|
|
#include <string>
|
|
#include <sys/stat.h>
|
|
|
|
namespace Matutils
|
|
{
|
|
// Creates every missing directory component of path (like `mkdir -p`).
|
|
// No std::filesystem in C++11, so this is a small POSIX-only helper.
|
|
inline void ensureDir(const std::string &path)
|
|
{
|
|
size_t pos = 0;
|
|
while (pos <= path.size())
|
|
{
|
|
size_t next = path.find('/', pos);
|
|
if (next == std::string::npos)
|
|
{
|
|
next = path.size();
|
|
}
|
|
std::string prefix = path.substr(0, next);
|
|
if (!prefix.empty())
|
|
{
|
|
mkdir(prefix.c_str(), 0755);
|
|
}
|
|
pos = next + 1;
|
|
}
|
|
}
|
|
|
|
const size_t NORMALIZING_DIM = 1;
|
|
inline arma::mat uniform(arma::mat const & sizeMat, double stdDev=1.0, double mu=0.5)
|
|
{
|
|
return stdDev*(arma::randu(arma::size(sizeMat)) + mu - 0.5);
|
|
}
|
|
|
|
inline arma::mat sample(const arma::mat &src)
|
|
{
|
|
arma::umat res = (src > uniform(src));
|
|
return arma::conv_to<arma::mat>::from(res);
|
|
}
|
|
|
|
// src holds a Gaussian unit's mean; returns a stochastic sample around it.
|
|
// Binary-thresholding a continuous Gaussian activation (via sample() above)
|
|
// is meaningless, so Gaussian-visible/hidden units need this instead.
|
|
inline arma::mat sample_gaussian(const arma::mat &src)
|
|
{
|
|
return src + arma::randn(arma::size(src));
|
|
}
|
|
|
|
inline arma::mat prob(const arma::mat &src)
|
|
{
|
|
return 1 / (1 + (arma::exp(-src)));
|
|
}
|
|
|
|
inline arma::mat normalize(const arma::mat& src)
|
|
{
|
|
std::cout << "Normalizing Training Data ..." << std::endl;
|
|
|
|
// Dim = 0: Normalize over training all training pattern
|
|
// Dim = 1: Normalize over single training pattern
|
|
double k = 1;
|
|
arma::mat mean = arma::mean(src, NORMALIZING_DIM);
|
|
arma::mat stddev = arma::stddev(src, 0, NORMALIZING_DIM);
|
|
|
|
arma::mat mean_mat;
|
|
arma::mat std_mat;
|
|
|
|
if (NORMALIZING_DIM==0)
|
|
{
|
|
mean_mat = arma::repmat(mean, src.n_rows, 1);
|
|
std_mat = arma::repmat(stddev, src.n_rows, 1);
|
|
}
|
|
else
|
|
{
|
|
mean_mat = arma::repmat(mean, 1, src.n_cols);
|
|
std_mat = arma::repmat(stddev, 1, src.n_cols);
|
|
}
|
|
|
|
arma::mat xn = src - mean_mat;
|
|
arma::mat y = xn/(std_mat + 1e-9);
|
|
return y;
|
|
}
|
|
|
|
inline arma::mat mean(const arma::mat& src)
|
|
{
|
|
return arma::mean(src, NORMALIZING_DIM);
|
|
}
|
|
|
|
inline arma::mat stddev(const arma::mat& src)
|
|
{
|
|
return arma::stddev(src, 0, NORMALIZING_DIM);
|
|
}
|
|
|
|
inline arma::mat char2vec(char c, size_t len)
|
|
{
|
|
arma::mat result = arma::zeros(1, len);
|
|
int idx = RnnTextHelper::ch2idx(c);
|
|
result[idx] = 1;
|
|
|
|
return result;
|
|
}
|
|
|
|
inline char vec2char(arma::mat const &vec)
|
|
{
|
|
char result = RnnTextHelper::idx2ch(vec.index_max());
|
|
|
|
return result;
|
|
}
|
|
|
|
}
|
|
|
|
#endif /* MATUTILS_HPP */
|
|
|