diff --git a/package.json b/package.json index 7a9310f8c1..57b791b1fa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "deeplearn", - "version": "0.2.7", + "version": "0.2.8", "description": "Hardware-accelerated JavaScript library for machine intelligence", "private": false, "main": "dist/src/index.js", diff --git a/src/index.ts b/src/index.ts index 03a5141e76..ec32db1b91 100644 --- a/src/index.ts +++ b/src/index.ts @@ -20,6 +20,7 @@ import * as conv_util from './math/conv_util'; import * as gpgpu_util from './math/webgl/gpgpu_util'; import * as render_ndarray_gpu_util from './math/webgl/render_ndarray_gpu_util'; import * as webgl_util from './math/webgl/webgl_util'; +import * as test_util from './test_util'; import * as util from './util'; export {CheckpointLoader} from './data/checkpoint_loader'; @@ -29,9 +30,9 @@ export {InCPUMemoryShuffledInputProviderBuilder, InGPUMemoryShuffledInputProvide export {XhrDataset, XhrDatasetConfig, XhrModelConfig} from './data/xhr-dataset'; export {ENV, Features} from './environment'; export {Graph, Tensor} from './graph/graph'; +export {AdadeltaOptimizer} from './graph/optimizers/adadelta_optimizer'; export {AdagradOptimizer} from './graph/optimizers/adagrad_optimizer'; export {MomentumOptimizer} from './graph/optimizers/momentum_optimizer'; -export {AdadeltaOptimizer} from './graph/optimizers/adadelta_optimizer'; export {Optimizer} from './graph/optimizers/optimizer'; export {RMSPropOptimizer} from './graph/optimizers/rmsprop_optimizer'; export {SGDOptimizer} from './graph/optimizers/sgd_optimizer'; @@ -51,6 +52,7 @@ export { conv_util, gpgpu_util, render_ndarray_gpu_util, + test_util, util, webgl_util, xhr_dataset diff --git a/src/util.ts b/src/util.ts index 08996ee82e..0288d8e9c9 100644 --- a/src/util.ts +++ b/src/util.ts @@ -15,8 +15,8 @@ * ============================================================================= */ -export type Vector = number[] | Float64Array | Float32Array | Int32Array | - Int8Array | Int16Array; +export type Vector = + number[]|Float64Array|Float32Array|Int32Array|Int8Array|Int16Array; /** Shuffles the array using Fisher-Yates algorithm. */ // tslint:disable-next-line:no-any @@ -63,7 +63,7 @@ export function randGauss(mean = 0, stdDev = 1, truncated = false): number { } while (s > 1); const result = Math.sqrt(-2 * Math.log(s) / s) * v1; - if (truncated && result > 2) { + if (truncated && Math.abs(result) > 2) { return randGauss(mean, stdDev, true); } return mean + stdDev * result; @@ -106,12 +106,7 @@ export function flatten(arr: any[], ret?: number[]): number[] { } export type ArrayData = - Float32Array | - number | - number[] | - number[][] | - number[][][] | - number[][][][]; + Float32Array|number|number[]|number[][]|number[][][]|number[][][][]; export function inferShape(arr: ArrayData): number[] { const shape: number[] = []; diff --git a/src/util_test.ts b/src/util_test.ts index 292574ee5b..686418514f 100644 --- a/src/util_test.ts +++ b/src/util_test.ts @@ -218,3 +218,29 @@ describe('util.inferFromImplicitShape', () => { expect(() => util.inferFromImplicitShape([2, 3, 4], 25)).toThrowError(); }); }); + +describe('util.randGauss', () => { + it('standard normal', () => { + const a = util.randGauss(); + expect(a != null); + }); + + it('truncated standard normal', () => { + const numSamples = 1000; + for (let i = 0; i < numSamples; ++i) { + const sample = util.randGauss(0, 1, true); + expect(Math.abs(sample) <= 2); + } + }); + + it('truncated normal, mu = 3, std=4', () => { + const numSamples = 1000; + const mean = 3; + const stdDev = 4; + for (let i = 0; i < numSamples; ++i) { + const sample = util.randGauss(mean, stdDev, true); + const normalizedSample = (sample - mean) / stdDev; + expect(Math.abs(normalizedSample) <= 2); + } + }); +});