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 2017/03/22 23:26:04 UTC
incubator-systemml git commit: [SYSTEMML-1428] Fixed maxpooling
functions for padding > 0
Repository: incubator-systemml
Updated Branches:
refs/heads/master 97da0004f -> 16e990928
[SYSTEMML-1428] Fixed maxpooling functions for padding > 0
Closes #437.
Project: http://git-wip-us.apache.org/repos/asf/incubator-systemml/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-systemml/commit/16e99092
Tree: http://git-wip-us.apache.org/repos/asf/incubator-systemml/tree/16e99092
Diff: http://git-wip-us.apache.org/repos/asf/incubator-systemml/diff/16e99092
Branch: refs/heads/master
Commit: 16e990928fa0201132688a8f7476856a02253030
Parents: 97da000
Author: Niketan Pansare <np...@us.ibm.com>
Authored: Wed Mar 22 15:25:52 2017 -0800
Committer: Niketan Pansare <np...@us.ibm.com>
Committed: Wed Mar 22 16:25:52 2017 -0700
----------------------------------------------------------------------
.../sysml/runtime/matrix/data/LibMatrixDNN.java | 78 +++++++++++++++-----
.../apache/sysml/yarn/ropt/ResourceConfig.java | 2 +-
2 files changed, 60 insertions(+), 20 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/16e99092/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 2547a87..5ab41e0 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
@@ -427,6 +427,12 @@ public class LibMatrixDNN {
outputBlock.recomputeNonZeros();
}
+ /**
+ * This method computes start and end indexes required for max_pool and max_pool_backward operations.
+ * This speeds up the performance of max_pool and max_pool_backward
+ *
+ * @param params parameters required for max_pool and max_pool_backward operations
+ */
private static void fillIndexesArray(ConvolutionParameters params) {
params.start_indexes_h = new int[params.P];
params.end_indexes_h = new int[params.P];
@@ -434,17 +440,17 @@ public class LibMatrixDNN {
params.end_indexes_w = new int[params.Q];
for (int p = 0; p < params.P; p++) {
int start_index_h = p * params.stride_h - params.pad_h;
- final int end_index_h = Math.min(start_index_h + params.R, params.H);
- start_index_h = Math.max(start_index_h, 0);
- params.start_indexes_h[p] = start_index_h;
- params.end_indexes_h[p] = end_index_h;
+ int end_index_h = start_index_h + params.R;
+ // Note: We do not treat pad as zero
+ params.start_indexes_h[p] = Math.max(start_index_h, 0);
+ params.end_indexes_h[p] = Math.min(end_index_h, params.H);
}
for (int q = 0; q < params.Q; q++) {
- int start_index_w = Math.max(q * params.stride_w - params.pad_w, 0);
- int end_index_w = Math.min(start_index_w + params.S, params.W);
- start_index_w = Math.max(start_index_w, 0);
- params.start_indexes_w[q] = start_index_w;
- params.end_indexes_w[q] = end_index_w;
+ int start_index_w = q * params.stride_w - params.pad_w;
+ int end_index_w = start_index_w + params.S;
+ // Note: We do not treat pad as zero
+ params.start_indexes_w[q] = Math.max(start_index_w, 0);
+ params.end_indexes_w[q] = Math.min(end_index_w, params.W);
}
}
@@ -486,7 +492,8 @@ public class LibMatrixDNN {
if(inVal != 0) {
final int inputOffset = n*params.C*params.H*params.W + c*params.H*params.W;
int maxIndex = getMaxIndexSparse(p, q, inputOffset, n, c, params.input1, params);
- outputArray[maxIndex] += inVal;
+ if(maxIndex != -1)
+ outputArray[maxIndex] += inVal;
}
}
}
@@ -510,7 +517,8 @@ public class LibMatrixDNN {
final int inputOffset = n*params.C*params.H*params.W + c*params.H*params.W;
int maxIndex = getMaxIndexSparse(p, q, inputOffset, n, c, params.input1, params);
- outputArray[maxIndex] += ijv.getV();
+ if(maxIndex != -1)
+ outputArray[maxIndex] += ijv.getV();
}
}
@@ -530,7 +538,8 @@ public class LibMatrixDNN {
final int inputOffset = n*params.C*params.H*params.W + c*params.H*params.W;
int maxIndex = getMaxIndex(p, q, inputOffset, inputArray, params);
- outputArray[maxIndex] += ijv.getV();
+ if(maxIndex != -1)
+ outputArray[maxIndex] += ijv.getV();
}
}
@@ -543,12 +552,26 @@ public class LibMatrixDNN {
for (int p = 0; p < params.P; p++) {
for (int q = 0; q < params.Q; q++) {
int maxIndex = getMaxIndex(p, q, inputOffset, inputArray, params);
- outputArray[maxIndex] += doutArray[outputOffset + p * params.Q + q];
+ if(maxIndex != -1)
+ outputArray[maxIndex] += doutArray[outputOffset + p * params.Q + q];
}
}
}
}
+ /**
+ * Returns the index of cell with maximum value. This method is optimized for sparse input
+ *
+ * @param p output feature map height
+ * @param q output feature map width
+ * @param inputOffset offset to be used for input index
+ * @param n number of images
+ * @param c number of channels
+ * @param input input matrix
+ * @param params convolution parameters
+ * @return index of the cell with maximum value
+ * @throws DMLRuntimeException if error occurs
+ */
private static int getMaxIndexSparse(int p, int q, int inputOffset, int n, int c, MatrixBlock input, ConvolutionParameters params) throws DMLRuntimeException {
if(!input.isInSparseFormat())
throw new DMLRuntimeException("Incorrect usage: Only sparse format supported");
@@ -562,8 +585,12 @@ public class LibMatrixDNN {
int start_index_w = params.start_indexes_w[q];
int end_index_w = params.end_indexes_w[q];
- int maxIndex = inputOffset + start_index_h*params.W + start_index_w;
+ int maxIndex = -1;
double maxVal = -Double.MAX_VALUE;
+
+ // Note: We do not treat pad as zero and hence we don't do:
+ // maxVal = 0
+ // if start_index_h < 0 || start_index_w < 0 || end_index_h >= params.H || end_index_w >= params.W
// Find maxIndex
double currDoutVal = -1;
@@ -585,15 +612,29 @@ public class LibMatrixDNN {
return maxIndex;
}
+ /**
+ * Returns the index of cell with maximum value. This method is optimized for dense input
+ *
+ * @param p output feature map height
+ * @param q output feature map width
+ * @param inputOffset offset to be used for input index
+ * @param inputArray input array
+ * @param params convolution parameters
+ * @return index of cell with maximum value
+ */
private static int getMaxIndex(int p, int q, int inputOffset, double [] inputArray, ConvolutionParameters params) {
int start_index_h = params.start_indexes_h[p];
int end_index_h = params.end_indexes_h[p];
int start_index_w = params.start_indexes_w[q];
int end_index_w = params.end_indexes_w[q];
- int maxIndex = inputOffset + start_index_h*params.W + start_index_w;
+ int maxIndex = -1;
double maxVal = -Double.MAX_VALUE;
-
+
+ // Note: We do not treat pad as zero and hence we don't do:
+ // maxVal = 0
+ // if start_index_h < 0 || start_index_w < 0 || end_index_h >= params.H || end_index_w >= params.W
+
// Find maxIndex
double currDoutVal = -1;
for (int h = start_index_h; h < end_index_h; h++) {
@@ -899,7 +940,7 @@ public class LibMatrixDNN {
//post-processing: maintain nnz
outputBlock.recomputeNonZeros();
}
-
+
private static void doPooling(int n, ConvolutionParameters params) throws DMLRuntimeException {
double [] inputArray = null;
if (!params.input1.isInSparseFormat())
@@ -936,8 +977,7 @@ public class LibMatrixDNN {
for (int q = 0; q < params.Q; q++, out_index++) {
for (int h = params.start_indexes_h[p]; h < params.end_indexes_h[p]; h++) {
for (int w = params.start_indexes_w[q]; w < params.end_indexes_w[q]; w++) {
- double inVal = params.input1.quickGetValue(n, c*HW + h*params.W + w);
- outputArray[out_index] = Math.max(outputArray[out_index], inVal);
+ outputArray[out_index] = Math.max(outputArray[out_index], params.input1.quickGetValue(n, c*HW + h*params.W + w));
}
}
}
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/16e99092/src/main/java/org/apache/sysml/yarn/ropt/ResourceConfig.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/yarn/ropt/ResourceConfig.java b/src/main/java/org/apache/sysml/yarn/ropt/ResourceConfig.java
index 45ad782..bdbf053 100644
--- a/src/main/java/org/apache/sysml/yarn/ropt/ResourceConfig.java
+++ b/src/main/java/org/apache/sysml/yarn/ropt/ResourceConfig.java
@@ -101,7 +101,7 @@ public class ResourceConfig
public long getMaxMRResource()
{
- double val = Collections.max(_mrres);
+ double val = (double) Collections.max(_mrres);
return (long)val;
}