added dilated convolution
This commit is contained in:
+46
-2
@@ -31,9 +31,9 @@ void Conv2d::initCUDNN(bool back) {
|
||||
kernelH, kernelW) );
|
||||
|
||||
checkCUDNN( cudnnSetConvolution2dDescriptor(convDesc,
|
||||
paddingH, paddingW, // padding
|
||||
paddingH * dilationH, paddingW * dilationW, // padding
|
||||
strideH, strideW, // stride
|
||||
1,1, // upscale
|
||||
dilationH, dilationW, // upscale
|
||||
CUDNN_CROSS_CORRELATION, CUDNN_DATA_FLOAT) );
|
||||
|
||||
checkCUDNN( cudnnSetConvolutionGroupCount(convDesc,
|
||||
@@ -146,6 +146,50 @@ Conv2d::Conv2d( Network *net, int out_ch, int kernelH, int kernelW,
|
||||
this->groups = groups;
|
||||
this->additional_bias = additional_bias;
|
||||
|
||||
this->dilationW = 1;
|
||||
this->dilationH = 1;
|
||||
|
||||
if(!deConv) {
|
||||
output_dim.n = input_dim.n;
|
||||
output_dim.c = out_ch;
|
||||
output_dim.h = (input_dim.h + 2 * paddingH - kernelH) / strideH + 1;
|
||||
output_dim.w = (input_dim.w + 2 * paddingW - kernelW) / strideW + 1;
|
||||
output_dim.l = 1;
|
||||
} else {
|
||||
output_dim.n = input_dim.n;
|
||||
output_dim.c = out_ch;
|
||||
output_dim.h = ((input_dim.h-1) * strideH) - 2*paddingH + kernelH;
|
||||
output_dim.w = ((input_dim.w-1) * strideW) - 2*paddingW + kernelW;
|
||||
output_dim.l = 1;
|
||||
}
|
||||
initCUDNN(deConv);
|
||||
|
||||
// allocate warkspace
|
||||
if (ws_sizeInBytes!=0) {
|
||||
checkCuda( cudaMalloc(&workSpace, ws_sizeInBytes) );
|
||||
}
|
||||
|
||||
//allocate data for infer result
|
||||
checkCuda( cudaMalloc(&dstData, output_dim.tot()*sizeof(dnnType)) );
|
||||
}
|
||||
|
||||
Conv2d::Conv2d(Network *net, int out_ch, int kernelH, int kernelW, int strideH, int strideW, int paddingH, int paddingW, int dilationX, int dilationY, std::string fname_weights, bool batchnorm, bool deConv, int groups, bool additional_bias)
|
||||
:LayerWgs(net, net->getOutputDim().c, out_ch, kernelH, kernelW, 1,
|
||||
fname_weights, batchnorm, additional_bias, deConv, groups)
|
||||
{
|
||||
this->dilationW = dilationX;
|
||||
this->dilationH = dilationY;
|
||||
|
||||
this->kernelH = kernelH;
|
||||
this->kernelW = kernelW;
|
||||
this->strideH = strideH;
|
||||
this->strideW = strideW;
|
||||
this->paddingH = paddingH;
|
||||
this->paddingW = paddingW;
|
||||
this->deConv = deConv;
|
||||
this->groups = groups;
|
||||
this->additional_bias = additional_bias;
|
||||
|
||||
if(!deConv) {
|
||||
output_dim.n = input_dim.n;
|
||||
output_dim.c = out_ch;
|
||||
|
||||
@@ -317,6 +317,8 @@ ILayer* NetworkRT::convert_layer(ITensor *input, Conv2d *l) {
|
||||
checkNULL(lRTconv);
|
||||
lRTconv->setStride(DimsHW{l->strideH, l->strideW});
|
||||
lRTconv->setPadding(DimsHW{l->paddingH, l->paddingW});
|
||||
//std::cout << "dilation: " << l->dilationH << ", " << l->dilationW << std::endl;
|
||||
lRTconv->setDilation(DimsHW{l->dilationH, l->dilationW}); //mrho
|
||||
lRTconv->setNbGroups(l->groups);
|
||||
lRT = (ILayer*) lRTconv;
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user