void FeedBackward(const arma::Cube<eT>& error) { delta = arma::zeros<arma::Cube<eT> >(inputLayer.InputActivation().n_rows, inputLayer.InputActivation().n_cols, inputLayer.InputActivation().n_slices); for (size_t outputmap = 0; outputmap < inputLayer.OutputMaps(); outputmap++) { for (size_t inputmap = 0; inputmap < outputLayer.OutputMaps(); inputmap++) { arma::Cube<eT> errorSlices = error.slices(inputmap * inputLayer.LayerSlices(), (inputmap * inputLayer.LayerSlices()) + inputLayer.LayerSlices() - 1); arma::Mat<eT> rotatedFilter; Rotate180(weights.slice( outputmap * outputLayer.OutputMaps() + inputmap), rotatedFilter); arma::Cube<eT> output; BackwardConvolutionRule::Convolution(errorSlices, rotatedFilter, output); delta.slices((outputmap * inputLayer.LayerSlices()), (outputmap * inputLayer.LayerSlices()) + inputLayer.LayerSlices() - 1) += output; } } }
void Gradient(const arma::Cube<eT>& d, arma::Cube<eT>& g) { g = arma::zeros<arma::Cube<eT> >(weights.n_rows, weights.n_cols, weights.n_slices); for (size_t outMap = 0; outMap < outMaps; outMap++) { for (size_t inMap = 0, s = outMap; inMap < inMaps; inMap++, s += outMaps) { arma::Cube<eT> inputSlices = inputParameter.slices(inMap, inMap); arma::Cube<eT> deltaSlices = d.slices(outMap, outMap); arma::Cube<eT> output; GradientConvolutionRule::Convolution(inputSlices, deltaSlices, output); for (size_t i = 0; i < output.n_slices; i++) g.slice(s) += output.slice(i); } } }
void FeedForward(const arma::Cube<eT>& input) { for (size_t outputmap = 0; outputmap < outputLayer.OutputMaps(); outputmap++) { for (size_t inputmap = 0; inputmap < inputLayer.OutputMaps(); inputmap++) { arma::Cube<eT> inputSlices = input.slices( inputmap * inputLayer.LayerSlices(), (inputmap * inputLayer.LayerSlices()) + inputLayer.LayerSlices() - 1); arma::Cube<eT> output; ForwardConvolutionRule::Convolution(inputSlices, weights.slice(inputmap * outputLayer.OutputMaps() + outputmap), output); outputLayer.InputActivation().slices( (outputmap * inputLayer.LayerSlices()), (outputmap * inputLayer.LayerSlices()) + inputLayer.LayerSlices() - 1) += output; } } }
const arma::Cube<eT> Element(arma::Cube<eT>& input, const size_t sliceNum) { return input.slices(sliceNum, sliceNum); }