@@ -528,6 +528,7 @@ var NeuralNetworkGPU = function (_NeuralNetwork) {
528528 output: [this.sizes[layer]],
529529 outputToTexture: true,
530530 outputImmutable: true,
531+ hardcodeConstants: true,
531532 constants: {
532533 size: this.sizes[layer - 1]
533534 }
@@ -586,7 +587,8 @@ var NeuralNetworkGPU = function (_NeuralNetwork) {
586587 }, {
587588 output: [this.sizes[layer]],
588589 outputToTexture: true,
589- outputImmutable: true
590+ outputImmutable: true,
591+ hardcodeConstants: true
590592 });
591593 } else {
592594 this.backwardPropagate[layer] = this.gpu.createKernelMap({
@@ -599,6 +601,7 @@ var NeuralNetworkGPU = function (_NeuralNetwork) {
599601 output: [this.sizes[layer]],
600602 outputToTexture: true,
601603 outputImmutable: true,
604+ hardcodeConstants: true,
602605 constants: {
603606 size: this.deltas[layer + 1].length
604607 }
@@ -628,15 +631,18 @@ var NeuralNetworkGPU = function (_NeuralNetwork) {
628631 this.changesPropagate[layer] = this.gpu.createKernelMap({
629632 weights: _gpu2.default.alias('addWeights', addWeights),
630633 changes: _gpu2.default.alias('calcChanges', calcChanges)
631- }, function (previousOutputs, deltas, weights, changes, learningRate, momentum ) {
632- var change = calcChanges(changes, deltas, previousOutputs, learningRate, momentum );
634+ }, function (previousOutputs, deltas, weights, changes) {
635+ var change = calcChanges(changes, deltas, previousOutputs);
633636
634637 return addWeights(change, weights);
635638 }, {
636639 output: [this.sizes[layer - 1], this.sizes[layer]],
637640 outputToTexture: true,
641+ hardcodeConstants: true,
638642 constants: {
639- size: this.outputs[layer - 1].length
643+ size: this.outputs[layer - 1].length,
644+ learningRate: this.trainOpts.learningRate,
645+ momentum: this.trainOpts.momentum
640646 }
641647 });
642648 }
@@ -645,7 +651,7 @@ var NeuralNetworkGPU = function (_NeuralNetwork) {
645651 key: 'getChanges',
646652 value: function getChanges() {
647653 for (var layer = 1; layer <= this.outputLayer; layer++) {
648- var output = this.changesPropagate[layer](this.outputs[layer - 1], this.deltas[layer], this.weights[layer], this.changes[layer], this.trainOpts.learningRate, this.trainOpts.momentum );
654+ var output = this.changesPropagate[layer](this.outputs[layer - 1], this.deltas[layer], this.weights[layer], this.changes[layer]);
649655
650656 this.changes[layer] = output.changes;
651657 this.weights[layer] = output.weights;
@@ -658,15 +664,19 @@ var NeuralNetworkGPU = function (_NeuralNetwork) {
658664 this.biasesPropagate[layer] = this.gpu.createKernel(addBiases, {
659665 output: [this.sizes[layer]],
660666 outputToTexture: true,
661- outputImmutable: true
667+ outputImmutable: true,
668+ hardcodeConstants: true,
669+ constants: {
670+ learningRate: this.trainOpts.learningRate
671+ }
662672 });
663673 }
664674 }
665675 }, {
666676 key: 'changeBiases',
667677 value: function changeBiases() {
668678 for (var layer = 1; layer <= this.outputLayer; layer++) {
669- this.biases[layer] = this.biasesPropagate[layer](this.biases[layer], this.deltas[layer], this.trainOpts.learningRate );
679+ this.biases[layer] = this.biasesPropagate[layer](this.biases[layer], this.deltas[layer]);
670680 }
671681 }
672682 }, {
@@ -753,14 +763,16 @@ var NeuralNetworkGPU = function (_NeuralNetwork) {
753763 }, {
754764 output: [data[0].input.length],
755765 outputToTexture: true,
756- outputImmutable: true
766+ outputImmutable: true,
767+ hardcodeConstants: true
757768 });
758769 var texturizeOutputData = this.gpu.createKernel(function (value) {
759770 return value[this.thread.x];
760771 }, {
761772 output: [data[0].output.length],
762773 outputToTexture: true,
763- outputImmutable: true
774+ outputImmutable: true,
775+ hardcodeConstants: true
764776 });
765777 data.forEach(function (d) {
766778 d.size = { input: d.input.length, output: d.output.length };
@@ -850,16 +862,16 @@ function calcError(nextWeights, nextDeltas) {
850862 return error;
851863}
852864
853- function calcChanges(previousChanges, deltas, previousOutputs, learningRate, momentum ) {
854- return learningRate * deltas[this.thread.y] * previousOutputs[this.thread.x] + momentum * previousChanges[this.thread.y][this.thread.x];
865+ function calcChanges(previousChanges, deltas, previousOutputs) {
866+ return this.constants. learningRate * deltas[this.thread.y] * previousOutputs[this.thread.x] + this.constants. momentum * previousChanges[this.thread.y][this.thread.x];
855867}
856868
857869function addWeights(change, weights) {
858870 return change + weights[this.thread.y][this.thread.x];
859871}
860872
861- function addBiases(biases, deltas, learningRate ) {
862- return biases[this.thread.x] + deltas[this.thread.x] * learningRate;
873+ function addBiases(biases, deltas) {
874+ return biases[this.thread.x] + deltas[this.thread.x] * this.constants. learningRate;
863875}
864876
865877// mean squared error, reimplemented for GPU
@@ -1324,7 +1336,7 @@ var NeuralNetwork = function () {
13241336 *
13251337 * @param data
13261338 * @param options
1327- * @private
1339+ * @protected
13281340 * @return {{runTrainingTick: function, status: {error: number, iterations: number}}}
13291341 */
13301342
@@ -1359,8 +1371,6 @@ var NeuralNetwork = function () {
13591371 }, {
13601372 key: 'train',
13611373 value: function train(data) {
1362- var _this4 = this;
1363-
13641374 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
13651375
13661376 var status = void 0,
@@ -1373,11 +1383,7 @@ var NeuralNetwork = function () {
13731383 endTime = _prepTraining2.endTime;
13741384
13751385
1376- var tick = function tick() {
1377- _this4._trainingTick(data, status, endTime);
1378- setTimeout(tick, 0);
1379- };
1380- tick();
1386+ while (this._trainingTick(data, status, endTime)) {}
13811387 return status;
13821388 }
13831389
@@ -1393,7 +1399,7 @@ var NeuralNetwork = function () {
13931399 }, {
13941400 key: 'trainAsync',
13951401 value: function trainAsync(data) {
1396- var _this5 = this;
1402+ var _this4 = this;
13971403
13981404 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
13991405
@@ -1409,10 +1415,10 @@ var NeuralNetwork = function () {
14091415
14101416 return new Promise(function (resolve, reject) {
14111417 try {
1412- var thawedTrain = new _thaw2.default(new Array(_this5 .trainOpts.iterations), {
1418+ var thawedTrain = new _thaw2.default(new Array(_this4 .trainOpts.iterations), {
14131419 delay: true,
14141420 each: function each() {
1415- return _this5 ._trainingTick(data, status, endTime) || thawedTrain.stop();
1421+ return _this4 ._trainingTick(data, status, endTime) || thawedTrain.stop();
14161422 },
14171423 done: function done() {
14181424 return resolve(status);
@@ -1593,7 +1599,7 @@ var NeuralNetwork = function () {
15931599 }, {
15941600 key: '_formatData',
15951601 value: function _formatData(data) {
1596- var _this6 = this;
1602+ var _this5 = this;
15971603
15981604 if (!Array.isArray(data)) {
15991605 // turn stream datum into array
@@ -1610,7 +1616,7 @@ var NeuralNetwork = function () {
16101616 }));
16111617 }
16121618 data = data.map(function (datum) {
1613- var array = _lookup2.default.toArray(_this6 .inputLookup, datum.input);
1619+ var array = _lookup2.default.toArray(_this5 .inputLookup, datum.input);
16141620 return Object.assign({}, datum, { input: array });
16151621 }, this);
16161622 }
@@ -1622,7 +1628,7 @@ var NeuralNetwork = function () {
16221628 }));
16231629 }
16241630 data = data.map(function (datum) {
1625- var array = _lookup2.default.toArray(_this6 .outputLookup, datum.output);
1631+ var array = _lookup2.default.toArray(_this5 .outputLookup, datum.output);
16261632 return Object.assign({}, datum, { output: array });
16271633 }, this);
16281634 }
@@ -1643,7 +1649,7 @@ var NeuralNetwork = function () {
16431649 }, {
16441650 key: 'test',
16451651 value: function test(data) {
1646- var _this7 = this;
1652+ var _this6 = this;
16471653
16481654 data = this._formatData(data);
16491655
@@ -1662,13 +1668,13 @@ var NeuralNetwork = function () {
16621668 var sum = 0;
16631669
16641670 var _loop = function _loop(i) {
1665- var output = _this7 .runInput(data[i].input);
1671+ var output = _this6 .runInput(data[i].input);
16661672 var target = data[i].output;
16671673
16681674 var actual = void 0,
16691675 expected = void 0;
16701676 if (isBinary) {
1671- actual = output[0] > _this7 .binaryThresh ? 1 : 0;
1677+ actual = output[0] > _this6 .binaryThresh ? 1 : 0;
16721678 expected = target[0];
16731679 } else {
16741680 actual = output.indexOf((0, _max2.default)(output));
@@ -1915,15 +1921,15 @@ var NeuralNetwork = function () {
19151921 }, {
19161922 key: 'isRunnable',
19171923 get: function get() {
1918- var _this8 = this;
1924+ var _this7 = this;
19191925
19201926 if (!this.runInput) {
19211927 console.error('Activation function has not been initialized, did you run train()?');
19221928 return false;
19231929 }
19241930
19251931 var checkFns = ['sizes', 'outputLayer', 'biases', 'weights', 'outputs', 'deltas', 'changes', 'errors'].filter(function (c) {
1926- return _this8 [c] === null;
1932+ return _this7 [c] === null;
19271933 });
19281934
19291935 if (checkFns.length > 0) {
0 commit comments