You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@systemml.apache.org by ni...@apache.org on 2016/11/01 21:28:01 UTC

incubator-systemml git commit: [SYSTEMML-1076] [SYSTEMML-1077] Handle empty blocks in maxpool and maxpool_backward

Repository: incubator-systemml
Updated Branches:
  refs/heads/master 2c8eefd76 -> e0e60a611


[SYSTEMML-1076] [SYSTEMML-1077] Handle empty blocks in maxpool and maxpool_backward


Project: http://git-wip-us.apache.org/repos/asf/incubator-systemml/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-systemml/commit/e0e60a61
Tree: http://git-wip-us.apache.org/repos/asf/incubator-systemml/tree/e0e60a61
Diff: http://git-wip-us.apache.org/repos/asf/incubator-systemml/diff/e0e60a61

Branch: refs/heads/master
Commit: e0e60a611190cd78f13cc9af83ebde1db2e9b8a1
Parents: 2c8eefd
Author: Niketan Pansare <np...@us.ibm.com>
Authored: Tue Nov 1 14:24:42 2016 -0700
Committer: Niketan Pansare <np...@us.ibm.com>
Committed: Tue Nov 1 14:26:39 2016 -0700

----------------------------------------------------------------------
 .../org/apache/sysml/hops/ConvolutionOp.java    | 36 +++++++--------
 .../sysml/parser/BuiltinFunctionExpression.java | 48 +++++++++++++++++++-
 .../cp/ConvolutionCPInstruction.java            |  4 +-
 .../sysml/runtime/matrix/data/LibMatrixDNN.java |  4 +-
 4 files changed, 69 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/e0e60a61/src/main/java/org/apache/sysml/hops/ConvolutionOp.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/ConvolutionOp.java b/src/main/java/org/apache/sysml/hops/ConvolutionOp.java
index c010de6..dae2f82 100644
--- a/src/main/java/org/apache/sysml/hops/ConvolutionOp.java
+++ b/src/main/java/org/apache/sysml/hops/ConvolutionOp.java
@@ -242,7 +242,7 @@ public class ConvolutionOp extends Hop  implements MultiThreadedHop
 			case MAX_POOLING:
 			{
 				ret = new long[3];
-				ret[0] = params.N;
+				ret[0] = getInput().get(0)._dim1;
 				ret[1] = getExtractedVal(params.C, params.P, params.Q);
 				ret[2] = -1;
 				break;
@@ -250,32 +250,32 @@ public class ConvolutionOp extends Hop  implements MultiThreadedHop
 			case MAX_POOLING_BACKWARD:
 			{
 				ret = new long[3];
-				ret[0] = params.N;
-				ret[1] = getExtractedVal(params.C, params.H, params.W);
+				ret[0] = getInput().get(0)._dim1;
+				ret[1] = getInput().get(0)._dim2;
 				ret[2] = -1;
 				break;
 			}
 			case DIRECT_CONV2D:
 			{
 				ret = new long[3];
-				ret[0] = params.N;
-				ret[1] = getExtractedVal(params.K, params.P, params.Q);
+				ret[0] = getInput().get(0)._dim1;
+				ret[1] = getExtractedVal(getInput().get(1)._dim1, params.P, params.Q);
 				ret[2] = -1;
 				break;
 			}
 			case DIRECT_CONV2D_BACKWARD_FILTER:
 			{
 				ret = new long[3];
-				ret[0] = params.K;
-				ret[1] = getExtractedVal(params.C, params.R, params.S);
+				ret[0] = getInput().get(1)._dim1;
+				ret[1] = getInput().get(1)._dim2;
 				ret[2] = -1;
 				break;
 			}
 			case DIRECT_CONV2D_BACKWARD_DATA:
 			{
 				ret = new long[3];
-				ret[0] = params.N;
-				ret[1] = getExtractedVal(params.C, params.H, params.W);
+				ret[0] = getInput().get(0)._dim1;
+				ret[1] = getInput().get(0)._dim2;
 				ret[2] = -1;
 				break;
 			}
@@ -408,36 +408,36 @@ public class ConvolutionOp extends Hop  implements MultiThreadedHop
 		{
 			case MAX_POOLING:
 			{	
-				_dim1 = params.N;
+				_dim1 = getInput().get(0)._dim1;
 				_dim2 = getExtractedVal(params.C, params.P, params.Q);
 				_nnz = -1; // cannot infer stats
 				break;
 			}
 			case MAX_POOLING_BACKWARD:
 			{
-				_dim1 = params.N;
-				_dim2 = getExtractedVal(params.C, params.H, params.W);
+				_dim1 = getInput().get(0)._dim1;
+				_dim2 = getInput().get(0)._dim2;
 				_nnz = -1;
 				break;
 			}
 			case DIRECT_CONV2D:
 			{
-				_dim1 = params.N;
-				_dim2 = getExtractedVal(params.K, params.P, params.Q);
+				_dim1 = getInput().get(0)._dim1;
+				_dim2 = getExtractedVal(getInput().get(1)._dim1, params.P, params.Q);
 				_nnz = -1; // cannot infer stats
 				break;
 			}
 			case DIRECT_CONV2D_BACKWARD_DATA:
 			{
-				_dim1 = params.N;
-				_dim2 = getExtractedVal(params.C, params.H, params.W);
+				_dim1 = getInput().get(0)._dim1;
+				_dim2 = getInput().get(0)._dim2;
 				_nnz = -1; // cannot infer stats
 				break;
 			}
 			case DIRECT_CONV2D_BACKWARD_FILTER:
 			{
-				_dim1 = params.K;
-				_dim2 = getExtractedVal(params.C, params.R, params.S);
+				_dim1 = getInput().get(1)._dim1;
+				_dim2 = getInput().get(1)._dim2;
 				_nnz = -1; // cannot infer stats
 				break;
 			}

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/e0e60a61/src/main/java/org/apache/sysml/parser/BuiltinFunctionExpression.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/parser/BuiltinFunctionExpression.java b/src/main/java/org/apache/sysml/parser/BuiltinFunctionExpression.java
index bf31347..0ab2511 100644
--- a/src/main/java/org/apache/sysml/parser/BuiltinFunctionExpression.java
+++ b/src/main/java/org/apache/sysml/parser/BuiltinFunctionExpression.java
@@ -24,6 +24,7 @@ import java.util.HashMap;
 import java.util.HashSet;
 
 import org.apache.sysml.parser.LanguageException.LanguageErrorCodes;
+import org.apache.sysml.runtime.util.ConvolutionUtils;
 
 public class BuiltinFunctionExpression extends DataIdentifier 
 {
@@ -1121,14 +1122,57 @@ public class BuiltinFunctionExpression extends DataIdentifier
 			// conv2d_backward_filter and conv2d_backward_data
 			Expression input = _args[0];			// For conv2d_backward_filter, this is input and for conv2d_backward_data, this is filter
 			
+			Expression filter = null;
 			if(!(this.getOpCode() == BuiltinFunctionOp.MAX_POOL || this.getOpCode() == BuiltinFunctionOp.AVG_POOL)) {
-				Expression filter = _args[1];			// For conv2d_backward functions, this is dout
+				filter = _args[1];			// For conv2d_backward functions, this is dout
 				checkMatrixParam(filter);
 			}
 			output.setDataType(DataType.MATRIX);
 			output.setValueType(ValueType.DOUBLE);
 			output.setBlockDimensions(input.getOutput().getRowsInBlock(), input.getOutput().getColumnsInBlock());
-			  			
+			// stride1, stride2, padding1, padding2, numImg, numChannels, imgSize, imgSize, 
+ 			// filter_shape1=1, filter_shape2=1, filterSize/poolSize1, filterSize/poolSize1
+ 			if(this.getOpCode() == BuiltinFunctionOp.MAX_POOL_BACKWARD ||
+ 					this.getOpCode() == BuiltinFunctionOp.CONV2D_BACKWARD_DATA) {
+ 				output.setDimensions(input.getOutput().getDim1(), input.getOutput().getDim2());
+ 			}
+ 			else if(this.getOpCode() == BuiltinFunctionOp.CONV2D_BACKWARD_FILTER) {
+ 				output.setDimensions(filter.getOutput().getDim1(), filter.getOutput().getDim2());
+ 			}
+ 			else if(this.getOpCode() == BuiltinFunctionOp.CONV2D || this.getOpCode() == BuiltinFunctionOp.MAX_POOL) {
+ 				try {
+ 					int start = 1;
+ 					if(this.getOpCode() == BuiltinFunctionOp.CONV2D) {
+ 						start = 2;
+ 					}
+ 					long stride_h = (long) getDoubleValue(_args[start++]);
+ 					long stride_w = (long) getDoubleValue(_args[start++]);
+ 					long pad_h = (long) getDoubleValue(_args[start++]);
+ 					long pad_w = (long) getDoubleValue(_args[start++]); 
+ 					start++;
+ 					long C = (long) getDoubleValue(_args[start++]);
+ 					long H = (long) getDoubleValue(_args[start++]);
+ 					long W = (long) getDoubleValue(_args[start++]);
+ 					long K = -1;
+ 					if(this.getOpCode() == BuiltinFunctionOp.CONV2D) {
+ 						K = (long) getDoubleValue(_args[start]);
+ 					}
+ 					start++; start++;
+ 					long R = (long) getDoubleValue(_args[start++]);
+ 					long S = (long) getDoubleValue(_args[start++]);
+ 					long P = ConvolutionUtils.getP(H, R, stride_h, pad_h);
+ 					long Q = ConvolutionUtils.getP(W, S, stride_w, pad_w);
+ 					if(this.getOpCode() == BuiltinFunctionOp.CONV2D)
+ 						output.setDimensions(input.getOutput().getDim1(), K*P*Q);
+ 					else
+ 						output.setDimensions(input.getOutput().getDim1(), C*P*Q);
+ 				}
+ 				catch(Exception e) {
+ 					output.setDimensions(input.getOutput().getDim1(), -1); // To make sure that output dimensions are not incorrect
+ 				}
+ 			}
+ 			else
+ 				throw new LanguageException("Unsupported op: " + this.getOpCode());
 			checkMatrixParam(input);
 			break;
 		}

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/e0e60a61/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 3885720..91c74f0 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
@@ -188,8 +188,8 @@ public class ConvolutionCPInstruction extends UnaryCPInstruction {
 				// without somewhat expensive HashMap checks
 				outputBlock = getDenseOutputBlock(ec, N, C*P*Q, true);
 				params.setReuseNonZeroedOutput(_reuseNonZeroedOutput);
+				LibMatrixDNN.maxpooling(matBlock, outputBlock, params);
 			}
-			LibMatrixDNN.maxpooling(matBlock, outputBlock, params);
 		}
 		else if (instOpcode.equalsIgnoreCase("maxpooling_backward")) {
 			MatrixBlock dout = ec.getMatrixInput(_in2.getName());
@@ -201,8 +201,8 @@ public class ConvolutionCPInstruction extends UnaryCPInstruction {
 				// without somewhat expensive HashMap checks
 				outputBlock = getDenseOutputBlock(ec, N, C*H*W, false);
 				params.setReuseNonZeroedOutput(_reuseNonZeroedOutput);
+				LibMatrixDNN.maxpooling_backward(matBlock, dout, outputBlock, params);
 			}
-			LibMatrixDNN.maxpooling_backward(matBlock, dout, outputBlock, params);
 			ec.releaseMatrixInput(_in2.getName());
 		}
 		else if (instOpcode.equalsIgnoreCase("conv2d")) {

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/e0e60a61/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixDNN.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixDNN.java b/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixDNN.java
index e785112..cbb846c 100644
--- a/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixDNN.java
+++ b/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixDNN.java
@@ -735,13 +735,15 @@ public class LibMatrixDNN {
 		outputBlock.setNonZeros(params.outputNNZ.get());
 	}
 
-	private static void doPooling(int n, int c, ConvolutionParameters params) {
+	private static void doPooling(int n, int c, ConvolutionParameters params) throws DMLRuntimeException {
 		double [] inputArray = null;
 		if (!params.input1.isInSparseFormat())
 			inputArray = params.input1.getDenseBlock();
 		double [] outputArray = null;
 		if (!params.output.isInSparseFormat())
 			outputArray = params.output.getDenseBlock();
+		else
+			throw new DMLRuntimeException("Expected the output to be allocated in dense format");
 		
 		long tmpNNZ = 0;
 		for (int p = 0; p < params.P; p++) {