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));
    }
}
Exemple #3
0
inline BlobShape Blob::shape() const
{
    return BlobShape(dims(), sizes());
}