blob: 7bb9455445ab32ac6573a8e7d963909c5acd54f0 [file]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
require(mxnet)
context("initializer")
test_that("mx.init.uniform", {
uniform_init <- mx.init.uniform(scale = 1)
expect_equal(typeof(uniform_init), "closure")
X_bias <- uniform_init("X_bias", c(1, 100), ctx = mx.ctx.default())
expect_equal(X_bias, mx.nd.zeros(c(1, 100)))
X_weight <- uniform_init("X_weight", c(5, 10, 1000), ctx = mx.ctx.default())
expect_equal(X_weight >= -1, mx.nd.ones(c(5, 10, 1000)))
expect_equal(X_weight <= 1, mx.nd.ones(c(5, 10, 1000)))
mean_weight <- mean(as.array(X_weight))
expect_equal(mean_weight, 0, tolerance = 0.01)
})
test_that("mx.init.normal", {
normal_init <- mx.init.normal(sd = 0.1)
expect_equal(typeof(normal_init), "closure")
X_bias <- normal_init("X_bias", c(1, 100), ctx = mx.ctx.default())
expect_equal(X_bias, mx.nd.zeros(c(1, 100)))
X_weight <- normal_init("X_weight", c(5, 10, 1000), ctx = mx.ctx.default())
weight_mean <- mean(as.array(X_weight))
weight_sd <- sd(as.array(X_weight))
expect_equal(weight_mean, 0, tolerance = 0.01)
expect_equal(weight_sd, 0.1, tolerance = 0.01)
})
test_that("mx.init.Xavier", {
xavier_init <- mx.init.Xavier()
expect_equal(typeof(xavier_init), "closure")
# default parameters
shape <- c(2, 3, 324, 324)
fan_out <- shape[length(shape)]
fan_in <- prod(shape[-length(shape)])
X_bias <- xavier_init("X_bias", shape = shape, ctx = mx.ctx.default())
expect_equal(X_bias, mx.nd.zeros(shape))
X_weight <- xavier_init("X_weight", shape = shape, ctx = mx.ctx.default())
scale <- sqrt(3/((fan_in + fan_out)/2))
expect_equal(X_weight >= -scale, mx.nd.ones(shape))
expect_equal(X_weight <= scale, mx.nd.ones(shape))
weight_mean <- mean(as.array(X_weight))
expect_equal(weight_mean, 0, tolerance = 0.01)
for (dist_type in c("gaussian", "uniform")) {
for (factor_type in c("in", "out", "avg")) {
xavier_init <- mx.init.Xavier(rnd_type = dist_type, factor_type = factor_type,
magnitude = 200)
expect_equal(typeof(xavier_init), "closure")
X_weight <- xavier_init("X_weight", shape = shape, ctx = mx.ctx.default())
factor_val <- switch(factor_type, avg = (fan_in + fan_out)/2, `in` = fan_in,
out = fan_out)
scale <- sqrt(200/factor_val)
if (dist_type == "gaussian") {
weight_mean <- mean(as.array(X_weight))
weight_sd <- sd(as.array(X_weight))
expect_equal(weight_mean, 0, tolerance = 0.01)
expect_equal(weight_sd, scale, tolerance = 0.01)
} else {
expect_equal(X_weight >= -scale, mx.nd.ones(shape))
expect_equal(X_weight <= scale, mx.nd.ones(shape))
weight_mean <- mean(as.array(X_weight))
expect_equal(weight_mean, 0, tolerance = 0.01)
}
}
}
})
test_that("mx.init.internal.default", {
sample_bias <- mxnet:::mx.init.internal.default("X_bias", c(5, 10, 100), ctx = mx.ctx.default())
expect_equal(sample_bias, mx.nd.zeros(c(5, 10, 100)))
sample_gamma <- mxnet:::mx.init.internal.default("X_gamma", c(5, 10, 100), ctx = mx.ctx.default())
expect_equal(sample_gamma, mx.nd.ones(c(5, 10, 100)))
sample_beta <- mxnet:::mx.init.internal.default("X_beta", c(5, 10, 100), ctx = mx.ctx.default())
expect_equal(sample_beta, mx.nd.zeros(c(5, 10, 100)))
sample_moving_mean <- mxnet:::mx.init.internal.default("X_moving_mean", c(5,
10, 100), ctx = mx.ctx.default())
expect_equal(sample_moving_mean, mx.nd.zeros(c(5, 10, 100)))
sample_moving_var <- mxnet:::mx.init.internal.default("X_moving_var", c(5, 10,
100), ctx = mx.ctx.default())
expect_equal(sample_moving_var, mx.nd.ones(c(5, 10, 100)))
expect_error(mxnet:::mx.init.internal.default("X", c(5, 10, 100), ctx = mx.ctx.default()),
"Unkown initialization pattern for X")
})
test_that("mx.init.create", {
uniform_init <- mx.init.uniform(scale = 1)
expect_equal(typeof(uniform_init), "closure")
arrs <- setNames(as.list(c(50000, 100)), c("X_weight", "X_bias"))
arr_init <- mx.init.create(uniform_init, arrs, ctx = mx.ctx.default())
X_bias <- arr_init$X_bias
expect_equal(X_bias, mx.nd.zeros(c(100)))
X_weight <- arr_init$X_weight
expect_equal(X_weight >= -1, mx.nd.ones(c(50000)))
expect_equal(X_weight <= 1, mx.nd.ones(c(50000)))
mean_weight <- mean(as.array(X_weight))
expect_equal(mean_weight, 0, tolerance = 0.01)
})