提交 248149f4 编写于 作者: X xzl

add depthwiseconv test and fix the little bug of the convOpTest

上级 5b07d4e0
...@@ -38,76 +38,76 @@ public: ...@@ -38,76 +38,76 @@ public:
for (size_t filterSize : {1, 3, 5}) { for (size_t filterSize : {1, 3, 5}) {
for (size_t inputChannels : {3, 64}) { for (size_t inputChannels : {3, 64}) {
for (size_t outputChannels : {3, 64}) { for (size_t outputChannels : {3, 64}) {
for (size_t groups : {1, 3, 64}) { if (inputChannels > outputChannels) break;
if (inputChannels > outputChannels) break; size_t groups;
if (groups != 1 && if (!useGroups) {
(inputChannels != groups || outputChannels % groups != 0)) groups = 1;
continue; } else {
if (!useGroups) groups = 1; if (outputChannels % inputChannels != 0) continue;
groups = inputChannels;
for (size_t stride : {1, 2}) { }
for (size_t padding : {0, 1}) {
if (padding >= filterSize) break; for (size_t stride : {1, 2}) {
size_t outputSize = for (size_t padding : {0, 1}) {
(inputSize - filterSize + 2 * padding + stride) / if (padding >= filterSize) break;
stride; size_t outputSize =
VLOG(3) << " batchSize=" << batchSize (inputSize - filterSize + 2 * padding + stride) / stride;
<< " inputChannels=" << inputChannels VLOG(3) << " batchSize=" << batchSize
<< " inputHeight=" << inputSize << " inputChannels=" << inputChannels
<< " inputWidth=" << inputSize << " inputHeight=" << inputSize
<< " outputChannels=" << outputChannels << " inputWidth=" << inputSize
<< " filterHeight=" << filterSize << " outputChannels=" << outputChannels
<< " filterWidth=" << filterSize << " filterHeight=" << filterSize
<< " outputHeight=" << outputSize << " filterWidth=" << filterSize
<< " outputWidth=" << outputSize << " outputHeight=" << outputSize
<< " stride=" << stride << " padding=" << padding; << " outputWidth=" << outputSize
<< " stride=" << stride << " padding=" << padding;
std::vector<size_t> paddings = {padding, padding};
std::vector<size_t> strides = {stride, stride}; std::vector<size_t> paddings = {padding, padding};
Compare2Function<DType1, DType2> test( std::vector<size_t> strides = {stride, stride};
conv1, Compare2Function<DType1, DType2> test(
conv2, conv1,
FuncConfig() conv2,
.set("paddings", paddings) FuncConfig()
.set("strides", strides) .set("paddings", paddings)
.set("groups", groups) .set("strides", strides)
.set("algo", algo)); .set("groups", groups)
.set("algo", algo));
TensorShape input{
batchSize, inputChannels, inputSize, inputSize}; TensorShape input{
batchSize, inputChannels, inputSize, inputSize};
TensorShape filter;
if (groups > 1) TensorShape filter;
filter = TensorShape({groups, if (groups > 1)
outputChannels / groups, filter = TensorShape({groups,
inputChannels / groups, outputChannels / groups,
filterSize, inputChannels / groups,
filterSize}); filterSize,
else filterSize});
filter = TensorShape({outputChannels, else
inputChannels, filter = TensorShape({outputChannels,
filterSize, inputChannels,
filterSize}); filterSize,
TensorShape output{ filterSize});
batchSize, outputChannels, outputSize, outputSize}; TensorShape output{
batchSize, outputChannels, outputSize, outputSize};
if (type == kForwardTest) {
test.addInputs(BufferArg(VALUE_TYPE_FLOAT, input)); if (type == kForwardTest) {
test.addInputs(BufferArg(VALUE_TYPE_FLOAT, filter)); test.addInputs(BufferArg(VALUE_TYPE_FLOAT, input));
test.addOutputs(BufferArg(VALUE_TYPE_FLOAT, output)); test.addInputs(BufferArg(VALUE_TYPE_FLOAT, filter));
test.run(); test.addOutputs(BufferArg(VALUE_TYPE_FLOAT, output));
} else if (type == kBackwardInputTest) { test.run();
test.addInputs(BufferArg(VALUE_TYPE_FLOAT, output)); } else if (type == kBackwardInputTest) {
test.addInputs(BufferArg(VALUE_TYPE_FLOAT, filter)); test.addInputs(BufferArg(VALUE_TYPE_FLOAT, output));
test.addOutputs(BufferArg(VALUE_TYPE_FLOAT, input), test.addInputs(BufferArg(VALUE_TYPE_FLOAT, filter));
ADD_TO); test.addOutputs(BufferArg(VALUE_TYPE_FLOAT, input), ADD_TO);
test.run(); test.run();
} else if (type == kBackwardFilterTest) { } else if (type == kBackwardFilterTest) {
test.addInputs(BufferArg(VALUE_TYPE_FLOAT, output)); test.addInputs(BufferArg(VALUE_TYPE_FLOAT, output));
test.addInputs(BufferArg(VALUE_TYPE_FLOAT, input)); test.addInputs(BufferArg(VALUE_TYPE_FLOAT, input));
test.addOutputs(BufferArg(VALUE_TYPE_FLOAT, filter)); test.addOutputs(BufferArg(VALUE_TYPE_FLOAT, filter),
test.run(); ADD_TO);
} test.run();
} }
} }
} }
...@@ -136,77 +136,78 @@ public: ...@@ -136,77 +136,78 @@ public:
for (size_t filterWidth : {3, 7}) { for (size_t filterWidth : {3, 7}) {
for (size_t inputChannels : {7}) { for (size_t inputChannels : {7}) {
for (size_t outputChannels : {7}) { for (size_t outputChannels : {7}) {
for (size_t groups : {1, 7}) { size_t groups;
if (groups != 1 && (inputChannels != groups || if (!useGroups) {
outputChannels % groups != 0)) groups = 1;
continue; } else {
if (!useGroups) groups = 1; if (outputChannels % inputChannels != 0) continue;
groups = inputChannels;
size_t stride = 1; }
size_t padding = 0;
size_t outputHeight = size_t stride = 1;
(inputHeight - filterHeight + 2 * padding + stride) / size_t padding = 0;
stride; size_t outputHeight =
size_t outputWidth = (inputHeight - filterHeight + 2 * padding + stride) /
(inputWidth - filterWidth + 2 * padding + stride) / stride;
stride; size_t outputWidth =
VLOG(3) << " batchSize=" << batchSize (inputWidth - filterWidth + 2 * padding + stride) /
<< " inputChannels=" << inputChannels stride;
<< " inputHeight=" << inputHeight VLOG(3) << " batchSize=" << batchSize
<< " inputWidth=" << inputWidth << " inputChannels=" << inputChannels
<< " outputChannels=" << outputChannels << " inputHeight=" << inputHeight
<< " filterHeight=" << filterHeight << " inputWidth=" << inputWidth
<< " filterWidth=" << filterWidth << " outputChannels=" << outputChannels
<< " outputHeight=" << outputHeight << " filterHeight=" << filterHeight
<< " outputWidth=" << outputWidth << " filterWidth=" << filterWidth
<< " stride=" << stride << " padding=" << padding; << " outputHeight=" << outputHeight
<< " outputWidth=" << outputWidth
std::vector<size_t> paddings = {padding, padding}; << " stride=" << stride << " padding=" << padding;
std::vector<size_t> strides = {stride, stride};
Compare2Function<DType1, DType2> test( std::vector<size_t> paddings = {padding, padding};
conv1, std::vector<size_t> strides = {stride, stride};
conv2, Compare2Function<DType1, DType2> test(
FuncConfig() conv1,
.set("paddings", paddings) conv2,
.set("strides", strides) FuncConfig()
.set("groups", groups) .set("paddings", paddings)
.set("algo", algo)); .set("strides", strides)
.set("groups", groups)
TensorShape input{ .set("algo", algo));
batchSize, inputChannels, inputHeight, inputWidth};
TensorShape input{
TensorShape filter; batchSize, inputChannels, inputHeight, inputWidth};
if (groups > 1)
filter = TensorShape({groups, TensorShape filter;
outputChannels / groups, if (groups > 1)
inputChannels / groups, filter = TensorShape({groups,
filterHeight, outputChannels / groups,
filterWidth}); inputChannels / groups,
else filterHeight,
filter = TensorShape({outputChannels, filterWidth});
inputChannels, else
filterHeight, filter = TensorShape({outputChannels,
filterWidth}); inputChannels,
TensorShape output{ filterHeight,
batchSize, outputChannels, outputHeight, outputWidth}; filterWidth});
TensorShape output{
if (type == kForwardTest) { batchSize, outputChannels, outputHeight, outputWidth};
test.addInputs(BufferArg(VALUE_TYPE_FLOAT, input));
test.addInputs(BufferArg(VALUE_TYPE_FLOAT, filter)); if (type == kForwardTest) {
test.addOutputs(BufferArg(VALUE_TYPE_FLOAT, output)); test.addInputs(BufferArg(VALUE_TYPE_FLOAT, input));
test.run(); test.addInputs(BufferArg(VALUE_TYPE_FLOAT, filter));
} else if (type == kBackwardInputTest) { test.addOutputs(BufferArg(VALUE_TYPE_FLOAT, output));
test.addInputs(BufferArg(VALUE_TYPE_FLOAT, output)); test.run();
test.addInputs(BufferArg(VALUE_TYPE_FLOAT, filter)); } else if (type == kBackwardInputTest) {
test.addOutputs(BufferArg(VALUE_TYPE_FLOAT, input), test.addInputs(BufferArg(VALUE_TYPE_FLOAT, output));
ADD_TO); test.addInputs(BufferArg(VALUE_TYPE_FLOAT, filter));
test.run(); test.addOutputs(BufferArg(VALUE_TYPE_FLOAT, input), ADD_TO);
} else if (type == kBackwardFilterTest) { test.run();
test.addInputs(BufferArg(VALUE_TYPE_FLOAT, output)); } else if (type == kBackwardFilterTest) {
test.addInputs(BufferArg(VALUE_TYPE_FLOAT, input)); test.addInputs(BufferArg(VALUE_TYPE_FLOAT, output));
test.addOutputs(BufferArg(VALUE_TYPE_FLOAT, filter)); test.addInputs(BufferArg(VALUE_TYPE_FLOAT, input));
test.run(); test.addOutputs(BufferArg(VALUE_TYPE_FLOAT, filter),
} ADD_TO);
test.run();
} }
} }
} }
...@@ -218,6 +219,8 @@ public: ...@@ -218,6 +219,8 @@ public:
} }
}; };
// ======Start Convolution TEST======
TEST(Forward, GEMM) { TEST(Forward, GEMM) {
ConvolutionTest<DEVICE_TYPE_CPU, DEVICE_TYPE_CPU> test( ConvolutionTest<DEVICE_TYPE_CPU, DEVICE_TYPE_CPU> test(
"NaiveConv-CPU", "GemmConv-CPU", kForwardTest, false); "NaiveConv-CPU", "GemmConv-CPU", kForwardTest, false);
...@@ -228,24 +231,76 @@ TEST(Forward, GEMM) { ...@@ -228,24 +231,76 @@ TEST(Forward, GEMM) {
#ifndef PADDLE_ONLY_CPU #ifndef PADDLE_ONLY_CPU
TEST(Forward, GEMM2) { TEST(Forward, GEMM2) {
ConvolutionTest<DEVICE_TYPE_CPU, DEVICE_TYPE_GPU> test( ConvolutionTest<DEVICE_TYPE_CPU, DEVICE_TYPE_GPU> test(
"GemmConv-CPU", "GemmConv-GPU", kForwardTest); "GemmConv-CPU", "GemmConv-GPU", kForwardTest, false);
ConvolutionTest2<DEVICE_TYPE_CPU, DEVICE_TYPE_GPU> test2( ConvolutionTest2<DEVICE_TYPE_CPU, DEVICE_TYPE_GPU> test2(
"GemmConv-CPU", "GemmConv-GPU", kForwardTest); "GemmConv-CPU", "GemmConv-GPU", kForwardTest, false);
} }
TEST(BackwardInput, GEMM) { TEST(BackwardInput, GEMM) {
ConvolutionTest<DEVICE_TYPE_CPU, DEVICE_TYPE_GPU> test( ConvolutionTest<DEVICE_TYPE_CPU, DEVICE_TYPE_GPU> test(
"GemmConvGradInput-CPU", "GemmConvGradInput-GPU", kBackwardInputTest); "GemmConvGradInput-CPU",
"GemmConvGradInput-GPU",
kBackwardInputTest,
false);
ConvolutionTest2<DEVICE_TYPE_CPU, DEVICE_TYPE_GPU> test2( ConvolutionTest2<DEVICE_TYPE_CPU, DEVICE_TYPE_GPU> test2(
"GemmConvGradInput-CPU", "GemmConvGradInput-GPU", kBackwardInputTest); "GemmConvGradInput-CPU",
"GemmConvGradInput-GPU",
kBackwardInputTest,
false);
} }
TEST(BackwardFilter, GEMM) { TEST(BackwardFilter, GEMM) {
ConvolutionTest<DEVICE_TYPE_CPU, DEVICE_TYPE_GPU> test( ConvolutionTest<DEVICE_TYPE_CPU, DEVICE_TYPE_GPU> test(
"GemmConvGradFilter-CPU", "GemmConvGradFilter-GPU", kBackwardFilterTest); "GemmConvGradFilter-CPU",
"GemmConvGradFilter-GPU",
kBackwardFilterTest,
false);
ConvolutionTest2<DEVICE_TYPE_CPU, DEVICE_TYPE_GPU> test2( ConvolutionTest2<DEVICE_TYPE_CPU, DEVICE_TYPE_GPU> test2(
"GemmConvGradFilter-CPU", "GemmConvGradFilter-GPU", kBackwardFilterTest); "GemmConvGradFilter-CPU",
"GemmConvGradFilter-GPU",
kBackwardFilterTest,
false);
} }
#endif #endif
// ======End Convolution TEST======
// ======Start DepthwiseConvolution TEST======
// TODO(zhaolong) The depthwise convolution cpu test will be added when the cpu
// version of depthwiseConv is implemented.
#ifndef PADDLE_ONLY_CPU
TEST(DepthwiseConvForward, GEMM2) {
ConvolutionTest<DEVICE_TYPE_CPU, DEVICE_TYPE_GPU> test(
"GemmConv-CPU", "DepthwiseConv-GPU", kForwardTest);
ConvolutionTest2<DEVICE_TYPE_CPU, DEVICE_TYPE_GPU> test2(
"GemmConv-CPU", "DepthwiseConv-GPU", kForwardTest);
}
TEST(DepthwiseConvBackwardInput, GEMM) {
ConvolutionTest<DEVICE_TYPE_CPU, DEVICE_TYPE_GPU> test(
"GemmConvGradInput-CPU",
"DepthwiseConvGradInput-GPU",
kBackwardInputTest);
ConvolutionTest2<DEVICE_TYPE_CPU, DEVICE_TYPE_GPU> test2(
"GemmConvGradInput-CPU",
"DepthwiseConvGradInput-GPU",
kBackwardInputTest);
}
TEST(DepthwiseConvBackwardFilter, GEMM) {
ConvolutionTest<DEVICE_TYPE_CPU, DEVICE_TYPE_GPU> test(
"GemmConvGradFilter-CPU",
"DepthwiseConvGradFilter-GPU",
kBackwardFilterTest);
ConvolutionTest2<DEVICE_TYPE_CPU, DEVICE_TYPE_GPU> test2(
"GemmConvGradFilter-CPU",
"DepthwiseConvGradFilter-GPU",
kBackwardFilterTest);
}
#endif
// ======End DepthwiseConvolution TEST======
} // namespace paddle } // namespace paddle
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册