提交 f0c3c498 编写于 作者: X xzl

test exconv layerGrad and im2col

上级 328169a9
...@@ -29,82 +29,97 @@ void TestIm2ColFunctor() { ...@@ -29,82 +29,97 @@ void TestIm2ColFunctor() {
for (size_t filterWidth : {3, 7}) { for (size_t filterWidth : {3, 7}) {
for (size_t stride : {1, 2}) { for (size_t stride : {1, 2}) {
for (size_t padding : {0, 1}) { for (size_t padding : {0, 1}) {
if (inputHeight <= filterHeight || inputWidth <= filterWidth) for (size_t dilation : {1, 3}) {
break; size_t filterSizeH = (filterHeight - 1) * dilation + 1;
if (padding >= filterHeight || padding >= filterWidth) break; size_t filterSizeW = (filterWidth - 1) * dilation + 1;
size_t outputHeight = if (inputHeight <= filterSizeH || inputWidth <= filterSizeW)
(inputHeight - filterHeight + 2 * padding + stride) / break;
stride; if (padding >= filterSizeH || padding >= filterSizeW) break;
size_t outputWidth = size_t outputHeight =
(inputWidth - filterWidth + 2 * padding + stride) / stride; (inputHeight - filterSizeH + 2 * padding) / stride + 1;
size_t outputWidth =
TensorShape imShape = (inputWidth - filterSizeW + 2 * padding) / stride + 1;
TensorShape({channels, inputHeight, inputWidth});
TensorShape colShape1 = TensorShape({channels, TensorShape imShape =
filterHeight, TensorShape({channels, inputHeight, inputWidth});
filterWidth, TensorShape colShape1 = TensorShape({channels,
outputHeight, filterHeight,
outputWidth}); filterWidth,
TensorShape colShape2 = TensorShape({outputHeight, outputHeight,
outputWidth, outputWidth});
channels, TensorShape colShape2 = TensorShape({outputHeight,
filterHeight, outputWidth,
filterWidth}); channels,
filterHeight,
size_t height = channels * filterHeight * filterWidth; filterWidth});
size_t width = outputHeight * outputWidth;
VectorPtr input1 = Vector::create(imShape.getElements(), false); size_t height = channels * filterHeight * filterWidth;
VectorPtr input2 = Vector::create(imShape.getElements(), false); size_t width = outputHeight * outputWidth;
MatrixPtr output1 = Matrix::create(height, width, false, false); VectorPtr input1 =
MatrixPtr output2 = Matrix::create(width, height, false, false); Vector::create(imShape.getElements(), false);
input1->uniform(0.001, 1); VectorPtr input2 =
input2->copyFrom(*input1); Vector::create(imShape.getElements(), false);
MatrixPtr output1 =
Im2ColFunctor<kCFO, Device, T> im2Col1; Matrix::create(height, width, false, false);
Im2ColFunctor<kOCF, Device, T> im2Col2; MatrixPtr output2 =
im2Col1(input1->getData(), Matrix::create(width, height, false, false);
imShape, input1->uniform(0.001, 1);
output1->getData(), input2->copyFrom(*input1);
colShape1,
stride, Im2ColFunctor<kCFO, Device, T> im2Col1;
stride, Im2ColFunctor<kOCF, Device, T> im2Col2;
padding, im2Col1(input1->getData(),
padding); imShape,
im2Col2(input2->getData(), output1->getData(),
imShape, colShape1,
output2->getData(), stride,
colShape2, stride,
stride, padding,
stride, padding,
padding, dilation,
padding); dilation);
im2Col2(input2->getData(),
// The transposition of the result of ColFormat == kCFO imShape,
// is equal to the result of ColFormat == kOCF. output2->getData(),
MatrixPtr test; colShape2,
output2->transpose(test, true); stride,
autotest::TensorCheckErr(*output1, *test); stride,
padding,
Col2ImFunctor<kCFO, Device, T> col2Im1; padding,
Col2ImFunctor<kOCF, Device, T> col2Im2; dilation,
col2Im1(input1->getData(), dilation);
imShape,
output1->getData(), // The transposition of the result of ColFormat == kCFO
colShape1, // is equal to the result of ColFormat == kOCF.
stride, MatrixPtr test;
stride, output2->transpose(test, true);
padding, autotest::TensorCheckErr(*output1, *test);
padding);
col2Im2(input2->getData(), Col2ImFunctor<kCFO, Device, T> col2Im1;
imShape, Col2ImFunctor<kOCF, Device, T> col2Im2;
output2->getData(),
colShape2, col2Im1(input1->getData(),
stride, imShape,
stride, output1->getData(),
padding, colShape1,
padding); stride,
stride,
autotest::TensorCheckErr(*input1, *input2); padding,
padding,
dilation,
dilation);
col2Im2(input2->getData(),
imShape,
output2->getData(),
colShape2,
stride,
stride,
padding,
padding,
dilation,
dilation);
autotest::TensorCheckErr(*input1, *input2);
}
} }
} }
} }
......
...@@ -434,7 +434,7 @@ void testConvLayer(const string& type, bool trans, bool useGpu) { ...@@ -434,7 +434,7 @@ void testConvLayer(const string& type, bool trans, bool useGpu) {
config.layerConfig.set_partial_sum(1); config.layerConfig.set_partial_sum(1);
config.layerConfig.set_shared_biases(true); config.layerConfig.set_shared_biases(true);
int dilation = 1; int dilation = 2;
if (type == "cudnn_conv") { if (type == "cudnn_conv") {
#if CUDNN_VERSION >= 6000 #if CUDNN_VERSION >= 6000
dilation = 2; dilation = 2;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册