void ConvolutionLayer::allocate(const std::vector<Blob*> &inputs, std::vector<Blob> &outputs) { CV_Assert(inputs.size() > 0); const Blob &inpBlob = *inputs[0]; CV_Assert(inpBlob.dims() == 4 && inpBlob.type() == CV_32F); computeInpOutShape(inpBlob); CV_Assert(inpCn % group == 0 && outCn % group == 0); CV_Assert(blobs[0].num() == outCn && blobs[0].channels() == inpCn / group); outGroupCn = outCn / group; inpGroupCn = inpCn / group; ksize = inpGroupCn * kerH * kerW; outputs.resize(inputs.size()); for (size_t i = 0; i < inputs.size(); i++) { CV_Assert(inputs[i]->type() == inpBlob.type()); CV_Assert(inputs[i]->dims() == 4 && inputs[i]->channels() == inpBlob.channels()); CV_Assert(inputs[i]->rows() == inpBlob.rows() && inputs[i]->cols() == inpBlob.cols()); outputs[i].create(BlobShape(inputs[i]->num(), topCn, topH, topW)); } if (!is1x1()) colMat.create(ksize, outH * outW, inpBlob.type()); if (bias) biasOnesMat = Mat::ones(1, topH * topW, inpBlob.type()); }
void PoolingLayerImpl::allocate(const std::vector<Blob*> &inputs, std::vector<Blob> &outputs) { CV_Assert(inputs.size() > 0); inp = inputs[0]->size2(); computeOutputShape(inp); useOpenCL = ocl::useOpenCL(); outputs.resize(inputs.size()); for (size_t i = 0; i < inputs.size(); i++) { CV_Assert(inputs[i]->rows() == inp.height && inputs[i]->cols() == inp.width); outputs[i].create(BlobShape(inputs[i]->num(), inputs[i]->channels(), out.height, out.width)); } }
inline BlobShape Blob::shape() const { return BlobShape(dims(), sizes()); }