Skip to content

Commit 8135857

Browse files
further debugging with Garrett, the genius.
1 parent bdd2cfb commit 8135857

8 files changed

Lines changed: 108 additions & 96 deletions

browser.js

Lines changed: 38 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -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

857869
function 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) {

browser.min.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/neural-network-gpu.js

Lines changed: 25 additions & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/neural-network-gpu.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)