void CNN::feedForward(mat& fout, const mat& fin) { // First 1st layer of CNN MUST have only 1 input feature map vector<mat> fins(1); // Transpose the input feature (fin) so that rows = feature dimension, cols = // the number of data in a single batch. // FIXME the last column in fin is the bias needed ONLY by DNN, not by CNN. fins[0].resize(fin.getRows(), fin.getCols() - 1); memcpy2D(fins[0], fin, 0, 0, fin.getRows(), fin.getCols() - 1, 0, 0); fins[0] = ~fins[0]; // FIXME SubSamplingLayer does NOT need temporary buffer. // MAYBE just reserve those for ConvolutionalLayer. _houts.resize(_transforms.size()); _transforms[0]->feedForward(_houts[0], fins); for (size_t i=1; i<_transforms.size(); ++i) _transforms[i]->feedForward(_houts[i], _houts[i-1]); // Concatenate fout = ~concat(_houts.back()); // Reserve one more column for bias fout.reserve(fout.size() + fout.getRows()); fout.resize(fout.getRows(), fout.getCols() + 1); fillLastColumnWith(fout, 1.0f); }