From 9a979ea68f576a2f6fd75e36efa60368a5ad2a8a Mon Sep 17 00:00:00 2001 From: terrytangyuan Date: Sun, 27 Dec 2015 18:18:27 -0600 Subject: [PATCH 01/11] Random.uniform and normal --- .../main/scala/ml/dmlc/mxnet/NDArray.scala | 6 ++++ .../src/main/scala/ml/dmlc/mxnet/Random.scala | 29 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 scala-package/core/src/main/scala/ml/dmlc/mxnet/Random.scala diff --git a/scala-package/core/src/main/scala/ml/dmlc/mxnet/NDArray.scala b/scala-package/core/src/main/scala/ml/dmlc/mxnet/NDArray.scala index 53b2145bc29a..aac8077d0d6c 100644 --- a/scala-package/core/src/main/scala/ml/dmlc/mxnet/NDArray.scala +++ b/scala-package/core/src/main/scala/ml/dmlc/mxnet/NDArray.scala @@ -268,6 +268,12 @@ object NDArray { NDArray._unaryNDArrayFunction("norm", src) } + // TODO + def _randomUniform(low: Float, high: Float, out: NDArray) = ??? + + def _randomGaussian(mean: Float, stdvar: Float, out: NDArray) = ??? + + /** * Create a new NDArray that copies content from source_array. * @param sourceArr Source data to create NDArray from. diff --git a/scala-package/core/src/main/scala/ml/dmlc/mxnet/Random.scala b/scala-package/core/src/main/scala/ml/dmlc/mxnet/Random.scala new file mode 100644 index 000000000000..407fabdcbffd --- /dev/null +++ b/scala-package/core/src/main/scala/ml/dmlc/mxnet/Random.scala @@ -0,0 +1,29 @@ +package ml.dmlc.mxnet + + +import ml.dmlc.mxnet.NDArray.{_randomUniform} +/** + * Created by yuantang on 12/27/15. + */ +class Random { + + def uniform(low: Float, high: Float, shape: Array[Int]=null, ctx: Context=null, out: NDArray=null): NDArray = { + if (out != null) { + require(shape == null & ctx == null, "shape and ctx is not needed when out is specified.") + } else { + require(shape != null, "shape is required when out is not specified") + var out = NDArray.empty(shape, ctx) + } + return NDArray._randomUniform(low, high, out) + } + + def normal(mean: Float, stdvar: Float, shape: Array[Int]=null, ctx: Context=null, out: NDArray=null): NDArray = { + if (out != null) { + require(shape == null & ctx == null, "shape and ctx is not needed when out is specified.") + } else { + require(shape != null, "shape is required when out is not specified") + var out = NDArray.empty(shape, ctx) + } + return NDArray._randomGaussian(mean, stdvar, out) + } +} From c12eb5e39e77263eb7f436b1cbbf2874ec5b6beb Mon Sep 17 00:00:00 2001 From: terrytangyuan Date: Sun, 27 Dec 2015 18:26:29 -0600 Subject: [PATCH 02/11] Random.seed and doc-strings --- .../src/main/scala/ml/dmlc/mxnet/Random.scala | 54 ++++++++++++++++--- 1 file changed, 47 insertions(+), 7 deletions(-) diff --git a/scala-package/core/src/main/scala/ml/dmlc/mxnet/Random.scala b/scala-package/core/src/main/scala/ml/dmlc/mxnet/Random.scala index 407fabdcbffd..9287e9b8bf1b 100644 --- a/scala-package/core/src/main/scala/ml/dmlc/mxnet/Random.scala +++ b/scala-package/core/src/main/scala/ml/dmlc/mxnet/Random.scala @@ -1,29 +1,69 @@ package ml.dmlc.mxnet +import ml.dmlc.mxnet.Base._ +import ml.dmlc.mxnet.NDArray.{_randomUniform, _randomGaussian, empty} -import ml.dmlc.mxnet.NDArray.{_randomUniform} /** - * Created by yuantang on 12/27/15. + * Random Number interface of mxnet. + * @author Yuan Tang */ class Random { - + /** + * Generate uniform distribution in [low, high) with shape. + * + * @param low The lower bound of distribution. + * @param high The upper bound of distribution. + * @param shape Output shape of the NDArray generated. + * @param ctx Context of output NDArray, will use default context if not specified. + * @param out Output place holder + * @return The result NDArray with generated result. + */ def uniform(low: Float, high: Float, shape: Array[Int]=null, ctx: Context=null, out: NDArray=null): NDArray = { if (out != null) { require(shape == null & ctx == null, "shape and ctx is not needed when out is specified.") } else { require(shape != null, "shape is required when out is not specified") - var out = NDArray.empty(shape, ctx) + var out = empty(shape, ctx) } - return NDArray._randomUniform(low, high, out) + return _randomUniform(low, high, out) } + + /** + * Generate normal(Gaussian) distribution N(mean, stdvar^^2) with shape. + * + * @param mean The mean of the normal distribution. + * @param stdvar The standard deviation of normal distribution. + * @param shape Output shape of the NDArray generated. + * @param ctx Context of output NDArray, will use default context if not specified. + * @param out Output place holder + * @return The result NDArray with generated result. + */ def normal(mean: Float, stdvar: Float, shape: Array[Int]=null, ctx: Context=null, out: NDArray=null): NDArray = { if (out != null) { require(shape == null & ctx == null, "shape and ctx is not needed when out is specified.") } else { require(shape != null, "shape is required when out is not specified") - var out = NDArray.empty(shape, ctx) + var out = empty(shape, ctx) } - return NDArray._randomGaussian(mean, stdvar, out) + return _randomGaussian(mean, stdvar, out) + } + + + /** + * Seed the random number generators in mxnet. + * + * This seed will affect behavior of functions in this module, + * as well as results from executors that contains Random number + * such as Dropout operators. + * + * @param seedState The random number seed to set to all devices. + * @note The random number generator of mxnet is by default device specific. + * This means if you set the same seed, the random number sequence + * generated from GPU0 can be different from CPU. + */ + def seed(seedState: Int) = { + // TODO +// checkCall(_LIB.mxRandomSeed(seedState)) } } From 27b892c50e86ef8b56884778af2fef732385b665 Mon Sep 17 00:00:00 2001 From: terrytangyuan Date: Sun, 27 Dec 2015 19:35:05 -0600 Subject: [PATCH 03/11] Initializer abstract class --- .../scala/ml/dmlc/mxnet/Initializer.scala | 45 +++++++++++++++++++ .../main/scala/ml/dmlc/mxnet/NDArray.scala | 2 +- 2 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala diff --git a/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala b/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala new file mode 100644 index 000000000000..4b0fb42b3c7a --- /dev/null +++ b/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala @@ -0,0 +1,45 @@ +package ml.dmlc.mxnet + +import ml.dmlc.mxnet.NDArray.{array, zeros, ones} + +/** + * Created by yuantang on 12/27/15. + */ +abstract class Initializer(name: String, protected var arr: NDArray) { + + def _initBilinear() = { + var weight = Array.fill[Float](arr.size)(0.0f) + val shape = arr.shape + val f = shape(3) / 2.0f + val c = (2 * f - 1 - f % 2) / (2.0f * f) + + (0 to (arr.size)).foreach { i => + var x = i % shape(3) + var y = (i % shape(3)) % shape(2) + weight(i) = (1 - math.abs(x / f - c)) * (1 - math.abs(y / f - c)) + } + + arr = array(weight) + + } + + def _initZero() = { + arr = zeros(arr.size) + } + + def _initBias() = { + arr = zeros(arr.size) + } + + def _initGamma() = { + arr = ones(arr.size) + } + + def _initBeta() = { + arr = zeros(arr.size) + } + + def _initWeight() + + def _initDefault() +} diff --git a/scala-package/core/src/main/scala/ml/dmlc/mxnet/NDArray.scala b/scala-package/core/src/main/scala/ml/dmlc/mxnet/NDArray.scala index aac8077d0d6c..0429313b6db1 100644 --- a/scala-package/core/src/main/scala/ml/dmlc/mxnet/NDArray.scala +++ b/scala-package/core/src/main/scala/ml/dmlc/mxnet/NDArray.scala @@ -280,7 +280,7 @@ object NDArray { * @param ctx The context of the NDArray, default to current default context. * @return The created NDArray. */ - def array(sourceArr: Array[Int], ctx: Context=null): NDArray = ??? + def array(sourceArr: Array[Float], ctx: Context=null): NDArray = ??? /** * Load ndarray from binary file. From 6c2702f4fd8dd0ef36c0181db30b2899da869145 Mon Sep 17 00:00:00 2001 From: terrytangyuan Date: Sun, 27 Dec 2015 20:05:27 -0600 Subject: [PATCH 04/11] Uniform, Normal, Xavier --- .../scala/ml/dmlc/mxnet/Initializer.scala | 42 ++++++++++++++++++- .../src/main/scala/ml/dmlc/mxnet/Random.scala | 2 +- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala b/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala index 4b0fb42b3c7a..aeb3551bdcc1 100644 --- a/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala +++ b/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala @@ -5,7 +5,7 @@ import ml.dmlc.mxnet.NDArray.{array, zeros, ones} /** * Created by yuantang on 12/27/15. */ -abstract class Initializer(name: String, protected var arr: NDArray) { +abstract class Initializer(protected val name: String, protected var arr: NDArray) { def _initBilinear() = { var weight = Array.fill[Float](arr.size)(0.0f) @@ -41,5 +41,43 @@ abstract class Initializer(name: String, protected var arr: NDArray) { def _initWeight() - def _initDefault() } + +class Uniform(name: String, arr: NDArray, protected val scale: Float=0.07f) extends Initializer(name: String, arr: NDArray) { + def _initWeight() = { + Random.uniform(-scale, scale, out=arr) + } +} + +class Normal(name: String, arr: NDArray, protected val sigma: Float=0.01f) extends Initializer(name: String, arr: NDArray) { + def _initWeight() = { + Random.normal(0, sigma, out=arr) + } +} + + +class Xavier(name: String, arr: NDArray, protected val rndType: String ="uniform", + protected val factorType: String ="avg", protected val magnitude: Int = 3) + extends Initializer(name: String, arr: NDArray) { + + def _initWeight() = { + val shape = arr.shape + val fanIn = shape.slice(1, shape.length).product + val fanOut = shape(0) + var factor = 1 + + factor = factorType match { + case "avg" => (fanIn + fanOut) / 2 + case "in" => fanIn + case "out" => fanOut + case _ => throw new IllegalArgumentException("Incorrect factor type") + } + val scale = math.sqrt(magnitude / factor) toFloat + + rndType match { + case "uniform" => Random.uniform(-scale, scale, out=arr) + case "normal" => Random.normal(0, scale, out=arr) + case _ => throw new IllegalArgumentException("Unknown random type") + } + } +} \ No newline at end of file diff --git a/scala-package/core/src/main/scala/ml/dmlc/mxnet/Random.scala b/scala-package/core/src/main/scala/ml/dmlc/mxnet/Random.scala index 9287e9b8bf1b..12ca212e09a5 100644 --- a/scala-package/core/src/main/scala/ml/dmlc/mxnet/Random.scala +++ b/scala-package/core/src/main/scala/ml/dmlc/mxnet/Random.scala @@ -7,7 +7,7 @@ import ml.dmlc.mxnet.NDArray.{_randomUniform, _randomGaussian, empty} * Random Number interface of mxnet. * @author Yuan Tang */ -class Random { +object Random { /** * Generate uniform distribution in [low, high) with shape. * From 95751566ccc3129c2f8852871ee715338cee1f41 Mon Sep 17 00:00:00 2001 From: terrytangyuan Date: Sun, 27 Dec 2015 20:15:04 -0600 Subject: [PATCH 05/11] Constructor for Initializer and handle exception --- .../scala/ml/dmlc/mxnet/Initializer.scala | 56 ++++++++++++++++++- 1 file changed, 53 insertions(+), 3 deletions(-) diff --git a/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala b/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala index aeb3551bdcc1..76b2fb0f2c1e 100644 --- a/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala +++ b/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala @@ -2,11 +2,38 @@ package ml.dmlc.mxnet import ml.dmlc.mxnet.NDArray.{array, zeros, ones} + /** - * Created by yuantang on 12/27/15. + * + * Base class for Initializer. + * + * @author Yuan Tang + * + * @param name name of corrosponding ndarray + * @param arr ndarray to be Initialized */ abstract class Initializer(protected val name: String, protected var arr: NDArray) { + if (name.startsWith("upsampling")) { + _initBilinear() + } else if (name.endsWith("bias")) { + _initBias() + } else if (name.endsWith("gamma")) { + _initGamma() + } else if (name.endsWith("beta")) { + _initBeta() + } else if (name.endsWith("weight")) { + _initWeight() + } else if (name.endsWith("moving_mean")) { + _initZero() + } else if (name.endsWith("moving_var")) { + _initZero() + } else if (name.endsWith("moving_avg")) { + _initZero() + } else { + throw new IllegalArgumentException(s"Unknown initialization pattern for ${name}.") + } + def _initBilinear() = { var weight = Array.fill[Float](arr.size)(0.0f) val shape = arr.shape @@ -20,7 +47,6 @@ abstract class Initializer(protected val name: String, protected var arr: NDArra } arr = array(weight) - } def _initZero() = { @@ -40,15 +66,30 @@ abstract class Initializer(protected val name: String, protected var arr: NDArra } def _initWeight() - } + +/** + * Initialize the weight with uniform [-scale, scale] + * + * @param name name of corrosponding ndarray + * @param arr ndarray to be Initialized + * @param scale The scale of uniform distribution + */ class Uniform(name: String, arr: NDArray, protected val scale: Float=0.07f) extends Initializer(name: String, arr: NDArray) { def _initWeight() = { Random.uniform(-scale, scale, out=arr) } } + +/** + * Initialize the weight with normal(0, sigma) + * + * @param name name of corrosponding ndarray + * @param arr ndarray to be Initialized + * @param sigma Standard deviation for gaussian distribution. + */ class Normal(name: String, arr: NDArray, protected val sigma: Float=0.01f) extends Initializer(name: String, arr: NDArray) { def _initWeight() = { Random.normal(0, sigma, out=arr) @@ -56,6 +97,15 @@ class Normal(name: String, arr: NDArray, protected val sigma: Float=0.01f) exten } +/** + * Initialize the weight with Xavier or similar initialization scheme. + * + * @param name name of corrosponding ndarray + * @param arr ndarray to be Initialized + * @param rndType Options are: "gaussian" or "uniform" + * @param factorType Options are: "avg", "in", "out" + * @param magnitude scale of random number range + */ class Xavier(name: String, arr: NDArray, protected val rndType: String ="uniform", protected val factorType: String ="avg", protected val magnitude: Int = 3) extends Initializer(name: String, arr: NDArray) { From 654840df5acf1ece0d03c1228dd7a80008a5cb19 Mon Sep 17 00:00:00 2001 From: terrytangyuan Date: Sun, 27 Dec 2015 22:54:33 -0600 Subject: [PATCH 06/11] Added missing period and fix typo --- .../core/src/main/scala/ml/dmlc/mxnet/Initializer.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala b/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala index 76b2fb0f2c1e..416fd1a16d6a 100644 --- a/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala +++ b/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala @@ -42,7 +42,7 @@ abstract class Initializer(protected val name: String, protected var arr: NDArra (0 to (arr.size)).foreach { i => var x = i % shape(3) - var y = (i % shape(3)) % shape(2) + var y = (i / shape(3)) % shape(2) weight(i) = (1 - math.abs(x / f - c)) * (1 - math.abs(y / f - c)) } @@ -122,7 +122,7 @@ class Xavier(name: String, arr: NDArray, protected val rndType: String ="uniform case "out" => fanOut case _ => throw new IllegalArgumentException("Incorrect factor type") } - val scale = math.sqrt(magnitude / factor) toFloat + val scale = math.sqrt(magnitude / factor).toFloat rndType match { case "uniform" => Random.uniform(-scale, scale, out=arr) From c68542550980b40b1b0457c741e091412e605c46 Mon Sep 17 00:00:00 2001 From: terrytangyuan Date: Mon, 28 Dec 2015 08:20:49 -0600 Subject: [PATCH 07/11] Avoid scope in ifelse and for, changed var to val --- .../src/main/scala/ml/dmlc/mxnet/Initializer.scala | 6 +++--- .../core/src/main/scala/ml/dmlc/mxnet/Random.scala | 14 ++++++++------ 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala b/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala index 416fd1a16d6a..3c2148a503ca 100644 --- a/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala +++ b/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala @@ -35,14 +35,14 @@ abstract class Initializer(protected val name: String, protected var arr: NDArra } def _initBilinear() = { - var weight = Array.fill[Float](arr.size)(0.0f) + val weight = Array.fill[Float](arr.size)(0.0f) val shape = arr.shape val f = shape(3) / 2.0f val c = (2 * f - 1 - f % 2) / (2.0f * f) (0 to (arr.size)).foreach { i => - var x = i % shape(3) - var y = (i / shape(3)) % shape(2) + val x = i % shape(3) + val y = (i / shape(3)) % shape(2) weight(i) = (1 - math.abs(x / f - c)) * (1 - math.abs(y / f - c)) } diff --git a/scala-package/core/src/main/scala/ml/dmlc/mxnet/Random.scala b/scala-package/core/src/main/scala/ml/dmlc/mxnet/Random.scala index 12ca212e09a5..9bcfe4eb162b 100644 --- a/scala-package/core/src/main/scala/ml/dmlc/mxnet/Random.scala +++ b/scala-package/core/src/main/scala/ml/dmlc/mxnet/Random.scala @@ -19,13 +19,14 @@ object Random { * @return The result NDArray with generated result. */ def uniform(low: Float, high: Float, shape: Array[Int]=null, ctx: Context=null, out: NDArray=null): NDArray = { - if (out != null) { + var outCopy = out + if (outCopy != null) { require(shape == null & ctx == null, "shape and ctx is not needed when out is specified.") } else { require(shape != null, "shape is required when out is not specified") - var out = empty(shape, ctx) + outCopy = empty(shape, ctx) } - return _randomUniform(low, high, out) + return _randomUniform(low, high, outCopy) } @@ -40,13 +41,14 @@ object Random { * @return The result NDArray with generated result. */ def normal(mean: Float, stdvar: Float, shape: Array[Int]=null, ctx: Context=null, out: NDArray=null): NDArray = { - if (out != null) { + var outCopy = out + if (outCopy != null) { require(shape == null & ctx == null, "shape and ctx is not needed when out is specified.") } else { require(shape != null, "shape is required when out is not specified") - var out = empty(shape, ctx) + outCopy = empty(shape, ctx) } - return _randomGaussian(mean, stdvar, out) + return _randomGaussian(mean, stdvar, outCopy) } From 2a671ba0aa234cc64c0944993fd6b5fb26936dc6 Mon Sep 17 00:00:00 2001 From: terrytangyuan Date: Mon, 28 Dec 2015 18:26:57 -0600 Subject: [PATCH 08/11] Use apply() for Initializer instead --- .../scala/ml/dmlc/mxnet/Initializer.scala | 45 +++++++++++-------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala b/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala index 3c2148a503ca..f60270e615b6 100644 --- a/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala +++ b/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala @@ -14,24 +14,33 @@ import ml.dmlc.mxnet.NDArray.{array, zeros, ones} */ abstract class Initializer(protected val name: String, protected var arr: NDArray) { - if (name.startsWith("upsampling")) { - _initBilinear() - } else if (name.endsWith("bias")) { - _initBias() - } else if (name.endsWith("gamma")) { - _initGamma() - } else if (name.endsWith("beta")) { - _initBeta() - } else if (name.endsWith("weight")) { - _initWeight() - } else if (name.endsWith("moving_mean")) { - _initZero() - } else if (name.endsWith("moving_var")) { - _initZero() - } else if (name.endsWith("moving_avg")) { - _initZero() - } else { - throw new IllegalArgumentException(s"Unknown initialization pattern for ${name}.") + /** + * Initialize an Initializer + * + * @param name name of corrosponding ndarray + * @param arr ndarray to be Initialized + */ + def apply(name: String, arr: NDArray) = { + + if (name.startsWith("upsampling")) { + _initBilinear() + } else if (name.endsWith("bias")) { + _initBias() + } else if (name.endsWith("gamma")) { + _initGamma() + } else if (name.endsWith("beta")) { + _initBeta() + } else if (name.endsWith("weight")) { + _initWeight() + } else if (name.endsWith("moving_mean")) { + _initZero() + } else if (name.endsWith("moving_var")) { + _initZero() + } else if (name.endsWith("moving_avg")) { + _initZero() + } else { + throw new IllegalArgumentException(s"Unknown initialization pattern for ${name}.") + } } def _initBilinear() = { From 48172b26233f07edb03ac778187493839f7602fa Mon Sep 17 00:00:00 2001 From: terrytangyuan Date: Mon, 28 Dec 2015 22:53:03 -0600 Subject: [PATCH 09/11] Used arr.set instead of use = to change reference, explicit return type for init methods --- .../scala/ml/dmlc/mxnet/Initializer.scala | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala b/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala index f60270e615b6..ea3281cc4066 100644 --- a/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala +++ b/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala @@ -43,7 +43,7 @@ abstract class Initializer(protected val name: String, protected var arr: NDArra } } - def _initBilinear() = { + def _initBilinear(): Unit = { val weight = Array.fill[Float](arr.size)(0.0f) val shape = arr.shape val f = shape(3) / 2.0f @@ -55,26 +55,26 @@ abstract class Initializer(protected val name: String, protected var arr: NDArra weight(i) = (1 - math.abs(x / f - c)) * (1 - math.abs(y / f - c)) } - arr = array(weight) + arr.set(array(weight)) } - def _initZero() = { - arr = zeros(arr.size) + def _initZero(): Unit = { + arr.set(zeros(arr.size)) } - def _initBias() = { - arr = zeros(arr.size) + def _initBias(): Unit = { + arr.set(zeros(arr.size)) } - def _initGamma() = { - arr = ones(arr.size) + def _initGamma(): Unit = { + arr.set(ones(arr.size)) } - def _initBeta() = { - arr = zeros(arr.size) + def _initBeta(): Unit = { + arr.set(zeros(arr.size)) } - def _initWeight() + def _initWeight(): Unit } @@ -86,7 +86,7 @@ abstract class Initializer(protected val name: String, protected var arr: NDArra * @param scale The scale of uniform distribution */ class Uniform(name: String, arr: NDArray, protected val scale: Float=0.07f) extends Initializer(name: String, arr: NDArray) { - def _initWeight() = { + override def _initWeight(): Unit = { Random.uniform(-scale, scale, out=arr) } } @@ -100,7 +100,7 @@ class Uniform(name: String, arr: NDArray, protected val scale: Float=0.07f) exte * @param sigma Standard deviation for gaussian distribution. */ class Normal(name: String, arr: NDArray, protected val sigma: Float=0.01f) extends Initializer(name: String, arr: NDArray) { - def _initWeight() = { + override def _initWeight(): Unit = { Random.normal(0, sigma, out=arr) } } From baf12792a935fd50c52d07e3a79f258c3fc1d3de Mon Sep 17 00:00:00 2001 From: terrytangyuan Date: Mon, 28 Dec 2015 23:05:52 -0600 Subject: [PATCH 10/11] Removed arguments in Initializer and its subclasses, add the arguments to init methods instead --- .../scala/ml/dmlc/mxnet/Initializer.scala | 57 ++++++++----------- 1 file changed, 24 insertions(+), 33 deletions(-) diff --git a/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala b/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala index ea3281cc4066..82473964c368 100644 --- a/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala +++ b/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala @@ -8,11 +8,8 @@ import ml.dmlc.mxnet.NDArray.{array, zeros, ones} * Base class for Initializer. * * @author Yuan Tang - * - * @param name name of corrosponding ndarray - * @param arr ndarray to be Initialized */ -abstract class Initializer(protected val name: String, protected var arr: NDArray) { +abstract class Initializer { /** * Initialize an Initializer @@ -20,30 +17,30 @@ abstract class Initializer(protected val name: String, protected var arr: NDArra * @param name name of corrosponding ndarray * @param arr ndarray to be Initialized */ - def apply(name: String, arr: NDArray) = { + def apply(name: String, arr: NDArray): Unit = { if (name.startsWith("upsampling")) { - _initBilinear() + _initBilinear(name, arr) } else if (name.endsWith("bias")) { - _initBias() + _initBias(name, arr) } else if (name.endsWith("gamma")) { - _initGamma() + _initGamma(name, arr) } else if (name.endsWith("beta")) { - _initBeta() + _initBeta(name, arr) } else if (name.endsWith("weight")) { - _initWeight() + _initWeight(name, arr) } else if (name.endsWith("moving_mean")) { - _initZero() + _initZero(name, arr) } else if (name.endsWith("moving_var")) { - _initZero() + _initZero(name, arr) } else if (name.endsWith("moving_avg")) { - _initZero() + _initZero(name, arr) } else { throw new IllegalArgumentException(s"Unknown initialization pattern for ${name}.") } } - def _initBilinear(): Unit = { + def _initBilinear(name: String, arr: NDArray): Unit = { val weight = Array.fill[Float](arr.size)(0.0f) val shape = arr.shape val f = shape(3) / 2.0f @@ -58,35 +55,33 @@ abstract class Initializer(protected val name: String, protected var arr: NDArra arr.set(array(weight)) } - def _initZero(): Unit = { + def _initZero(name: String, arr: NDArray): Unit = { arr.set(zeros(arr.size)) } - def _initBias(): Unit = { + def _initBias(name: String, arr: NDArray): Unit = { arr.set(zeros(arr.size)) } - def _initGamma(): Unit = { + def _initGamma(name: String, arr: NDArray): Unit = { arr.set(ones(arr.size)) } - def _initBeta(): Unit = { + def _initBeta(name: String, arr: NDArray): Unit = { arr.set(zeros(arr.size)) } - def _initWeight(): Unit + def _initWeight(name: String, arr: NDArray): Unit } /** * Initialize the weight with uniform [-scale, scale] * - * @param name name of corrosponding ndarray - * @param arr ndarray to be Initialized * @param scale The scale of uniform distribution */ -class Uniform(name: String, arr: NDArray, protected val scale: Float=0.07f) extends Initializer(name: String, arr: NDArray) { - override def _initWeight(): Unit = { +class Uniform(protected val scale: Float=0.07f) extends Initializer { + override def _initWeight(name: String, arr: NDArray): Unit = { Random.uniform(-scale, scale, out=arr) } } @@ -95,12 +90,10 @@ class Uniform(name: String, arr: NDArray, protected val scale: Float=0.07f) exte /** * Initialize the weight with normal(0, sigma) * - * @param name name of corrosponding ndarray - * @param arr ndarray to be Initialized * @param sigma Standard deviation for gaussian distribution. */ -class Normal(name: String, arr: NDArray, protected val sigma: Float=0.01f) extends Initializer(name: String, arr: NDArray) { - override def _initWeight(): Unit = { +class Normal(protected val sigma: Float=0.01f) extends Initializer { + override def _initWeight(name: String, arr: NDArray): Unit = { Random.normal(0, sigma, out=arr) } } @@ -109,17 +102,15 @@ class Normal(name: String, arr: NDArray, protected val sigma: Float=0.01f) exten /** * Initialize the weight with Xavier or similar initialization scheme. * - * @param name name of corrosponding ndarray - * @param arr ndarray to be Initialized * @param rndType Options are: "gaussian" or "uniform" * @param factorType Options are: "avg", "in", "out" * @param magnitude scale of random number range */ -class Xavier(name: String, arr: NDArray, protected val rndType: String ="uniform", - protected val factorType: String ="avg", protected val magnitude: Int = 3) - extends Initializer(name: String, arr: NDArray) { +class Xavier(protected val rndType: String ="uniform", + protected val factorType: String ="avg", + protected val magnitude: Int = 3) extends Initializer { - def _initWeight() = { + override def _initWeight(name: String, arr: NDArray): Unit = { val shape = arr.shape val fanIn = shape.slice(1, shape.length).product val fanOut = shape(0) From acb82e2e6e60b6e2bd6b8af1f351ea9716f45c27 Mon Sep 17 00:00:00 2001 From: terrytangyuan Date: Mon, 28 Dec 2015 23:23:18 -0600 Subject: [PATCH 11/11] Changed to set()0f without initializing a new array first --- .../core/src/main/scala/ml/dmlc/mxnet/Initializer.scala | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala b/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala index 82473964c368..5287200065e2 100644 --- a/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala +++ b/scala-package/core/src/main/scala/ml/dmlc/mxnet/Initializer.scala @@ -56,19 +56,19 @@ abstract class Initializer { } def _initZero(name: String, arr: NDArray): Unit = { - arr.set(zeros(arr.size)) + arr.set(0f) } def _initBias(name: String, arr: NDArray): Unit = { - arr.set(zeros(arr.size)) + arr.set(0f) } def _initGamma(name: String, arr: NDArray): Unit = { - arr.set(ones(arr.size)) + arr.set(1f) } def _initBeta(name: String, arr: NDArray): Unit = { - arr.set(zeros(arr.size)) + arr.set(0f) } def _initWeight(name: String, arr: NDArray): Unit