예제 #1
0
파일: cnn.cpp 프로젝트: GingerHugo/libdnn
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);
}