static typename std::enable_if< std::is_same<Border, FullConvolution>::value, void>::type Convolution(const arma::Mat<eT>& input, const arma::Mat<eT>& filter, arma::Mat<eT>& output) { // In case of the full convolution outputRows and outputCols doesn't // represent the true output size when the padLastDim parameter is set, // instead it's the working size. const size_t outputRows = input.n_rows + 2 * (filter.n_rows - 1); size_t outputCols = input.n_cols + 2 * (filter.n_cols - 1); if (padLastDim) outputCols++; // Pad filter and input to the working output shape. arma::Mat<eT> inputPadded = arma::zeros<arma::Mat<eT> >(outputRows, outputCols); inputPadded.submat(filter.n_rows - 1, filter.n_cols - 1, filter.n_rows - 1 + input.n_rows - 1, filter.n_cols - 1 + input.n_cols - 1) = input; arma::Mat<eT> filterPadded = filter; filterPadded.resize(outputRows, outputCols); // Perform FFT and IFFT output = arma::real(ifft2(arma::fft2(inputPadded) % arma::fft2( filterPadded))); // Extract the region of interest. We don't need to handle the padLastDim // parameter in a special way we just cut it out from the output matrix. output = output.submat(filter.n_rows - 1, filter.n_cols - 1, 2 * (filter.n_rows - 1) + input.n_rows - 1, 2 * (filter.n_cols - 1) + input.n_cols - 1); }
/** * Given a Reber string, return a Reber string with all reachable next symbols. * * @param transitions The Reber transistion matrix. * @param reber The Reber string used to generate all reachable next symbols. * @param nextReber All reachable next symbols. */ void GenerateNextReber(const arma::Mat<char>& transitions, const std::string& reber, std::string& nextReber) { size_t idx = 0; for (size_t grammer = 1; grammer < reber.length(); grammer++) { const int grammerIdx = arma::as_scalar(arma::find( transitions.row(idx) == reber[grammer], 1, "first")); idx = arma::as_scalar(transitions.submat(idx, grammerIdx + 2, idx, grammerIdx + 2)) - '0'; } nextReber = arma::as_scalar(transitions.submat(idx, 0, idx, 0)); nextReber += arma::as_scalar(transitions.submat(idx, 1, idx, 1)); }
/** * Generate a random Reber grammar. * * For more information, see the following thesis. * * @code * @misc{Gers2001, * author = {Felix Gers}, * title = {Long Short-Term Memory in Recurrent Neural Networks}, * year = {2001} * } * @endcode * * @param transitions Reber grammar transition matrix. * @param reber The generated Reber grammar string. */ void GenerateReber(const arma::Mat<char>& transitions, std::string& reber) { size_t idx = 0; reber = "B"; do { const int grammerIdx = rand() % 2; reber += arma::as_scalar(transitions.submat(idx, grammerIdx, idx, grammerIdx)); idx = arma::as_scalar(transitions.submat(idx, grammerIdx + 2, idx, grammerIdx + 2)) - '0'; } while (idx != 0); reber = "BPTVVE"; }
static typename std::enable_if< std::is_same<Border, ValidConvolution>::value, void>::type Convolution(const arma::Mat<eT>& input, const arma::Mat<eT>& filter, arma::Mat<eT>& output) { arma::Mat<eT> inputPadded = input; arma::Mat<eT> filterPadded = filter; if (padLastDim) inputPadded.resize(inputPadded.n_rows, inputPadded.n_cols + 1); // Pad filter and input to the output shape. filterPadded.resize(inputPadded.n_rows, inputPadded.n_cols); output = arma::real(ifft2(arma::fft2(inputPadded) % arma::fft2( filterPadded))); // Extract the region of interest. We don't need to handle the padLastDim in // a special way we just cut it out from the output matrix. output = output.submat(filter.n_rows - 1, filter.n_cols - 1, input.n_rows - 1, input.n_cols - 1); }