Repository: systemml Updated Branches: refs/heads/master f7bc20266 -> 2ae07e9ce
[SYSTEMML-540] Fixed a bug in CP relu_maxpool* operations Project: http://git-wip-us.apache.org/repos/asf/systemml/repo Commit: http://git-wip-us.apache.org/repos/asf/systemml/commit/2ae07e9c Tree: http://git-wip-us.apache.org/repos/asf/systemml/tree/2ae07e9c Diff: http://git-wip-us.apache.org/repos/asf/systemml/diff/2ae07e9c Branch: refs/heads/master Commit: 2ae07e9ce0eba63606a07aabb7af204c61860b97 Parents: f7bc202 Author: Niketan Pansare <[email protected]> Authored: Thu Nov 16 15:53:11 2017 -0800 Committer: Niketan Pansare <[email protected]> Committed: Thu Nov 16 15:53:11 2017 -0800 ---------------------------------------------------------------------- scripts/nn/test/compare_backends/run_tests.sh | 6 +++--- .../runtime/instructions/cp/ConvolutionCPInstruction.java | 4 ++++ .../sysml/runtime/matrix/data/ConvolutionParameters.java | 4 +++- .../sysml/runtime/matrix/data/LibMatrixDNNPoolingHelper.java | 8 +++++--- 4 files changed, 15 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/systemml/blob/2ae07e9c/scripts/nn/test/compare_backends/run_tests.sh ---------------------------------------------------------------------- diff --git a/scripts/nn/test/compare_backends/run_tests.sh b/scripts/nn/test/compare_backends/run_tests.sh index b8f9981..13f57e8 100644 --- a/scripts/nn/test/compare_backends/run_tests.sh +++ b/scripts/nn/test/compare_backends/run_tests.sh @@ -21,8 +21,8 @@ #------------------------------------------------------------- # Additional tests to compare the accuracy of different convolution related operators with CuDNN -#./test_conv2d_bwd_filter.sh -#./test_conv2d_bwd_data.sh -#./test_conv2d.sh +./test_conv2d_bwd_filter.sh +./test_conv2d_bwd_data.sh +./test_conv2d.sh ./test_maxpool.sh ./test_maxpool_bwd.sh http://git-wip-us.apache.org/repos/asf/systemml/blob/2ae07e9c/src/main/java/org/apache/sysml/runtime/instructions/cp/ConvolutionCPInstruction.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/ConvolutionCPInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/ConvolutionCPInstruction.java index 60ca720..6be6459 100644 --- a/src/main/java/org/apache/sysml/runtime/instructions/cp/ConvolutionCPInstruction.java +++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/ConvolutionCPInstruction.java @@ -416,6 +416,8 @@ public class ConvolutionCPInstruction extends UnaryCPInstruction { } else { outputBlock = new MatrixBlock(N, C*P*Q, false).allocateBlock(); + if(instOpcode.equalsIgnoreCase("relu_maxpooling")) + params.minValForMaxPoolOperations = 0; LibMatrixDNN.maxpooling(matBlock, outputBlock, params); } } @@ -426,6 +428,8 @@ public class ConvolutionCPInstruction extends UnaryCPInstruction { } else { outputBlock = new MatrixBlock(N, C*H*W, false).allocateBlock(); + if(instOpcode.equalsIgnoreCase("relu_maxpooling_backward")) + params.minValForMaxPoolOperations = 0; LibMatrixDNN.maxpoolingBackward(matBlock, dout, outputBlock, params, !instOpcode.equalsIgnoreCase("maxpooling_backward")); } http://git-wip-us.apache.org/repos/asf/systemml/blob/2ae07e9c/src/main/java/org/apache/sysml/runtime/matrix/data/ConvolutionParameters.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/ConvolutionParameters.java b/src/main/java/org/apache/sysml/runtime/matrix/data/ConvolutionParameters.java index d64a261..e32b7bc 100644 --- a/src/main/java/org/apache/sysml/runtime/matrix/data/ConvolutionParameters.java +++ b/src/main/java/org/apache/sysml/runtime/matrix/data/ConvolutionParameters.java @@ -43,7 +43,9 @@ public class ConvolutionParameters implements Serializable public MatrixBlock input1; public MatrixBlock input2; public MatrixBlock output; public MatrixBlock bias; - public int [] start_indexes_h, end_indexes_h, start_indexes_w, end_indexes_w; + public int [] start_indexes_h, end_indexes_h, start_indexes_w, end_indexes_w; + + public double minValForMaxPoolOperations = -Double.MAX_VALUE; public ConvolutionParameters(long N, long C, long H, long W, long K, long R, long S, long stride_h, long stride_w, http://git-wip-us.apache.org/repos/asf/systemml/blob/2ae07e9c/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixDNNPoolingHelper.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixDNNPoolingHelper.java b/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixDNNPoolingHelper.java index 52cdbcd..3567690 100644 --- a/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixDNNPoolingHelper.java +++ b/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixDNNPoolingHelper.java @@ -49,9 +49,11 @@ public class LibMatrixDNNPoolingHelper { double[] in = _params.input1.getDenseBlock(); double[] out = _params.output.getDenseBlock(); + double minValForMaxPoolOperations = _params.minValForMaxPoolOperations; + //thread-local initialization of output block if( !(_params.isStride1Pad0() && _params.isAllOnes(P, Q, W)) ) - Arrays.fill(out, _rl*CPQ, _ru*CPQ, -Double.MAX_VALUE); + Arrays.fill(out, _rl*CPQ, _ru*CPQ, minValForMaxPoolOperations); if( _params.isStride1Pad0() && _params.isAllOnes(P, Q, W) ) { //quick-path w/o materialized index arrays and @@ -59,7 +61,7 @@ public class LibMatrixDNNPoolingHelper { int lenh = Math.min(R,H); for(int i = _rl, oix=_rl*C; i < _ru; i++, oix+=C) for (int c = 0, off=i*CHW; c < C; c++, off+=H) - out[oix+c] = max(-Double.MAX_VALUE, in, off, lenh); + out[oix+c] = max(minValForMaxPoolOperations, in, off, lenh); } else if( _params.isStride1Pad0() ) { //quick-path w/o materialized index arrays @@ -109,7 +111,7 @@ public class LibMatrixDNNPoolingHelper { @Override public Long call() throws Exception { //thread-local initialization of output block - Arrays.fill(outputArray, _rl *CPQ, _ru*CPQ, -Double.MAX_VALUE); + Arrays.fill(outputArray, _rl *CPQ, _ru*CPQ, _params.minValForMaxPoolOperations); for(int n = _rl; n < _ru; n++) { if( !_params.input1.sparseBlock.isEmpty(n) ) {
