(t,e)
| 121 | |
| 122 | },{}],4:[function(require,module,exports){ |
| 123 | "use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{default:t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function weightedSumSigmoid(t,e,a){for(var s=e[this.thread.x],i=0;i<this.constants.size;i++)s+=t[this.thread.x][i]*a[i];return 1/(1+Math.exp(-s))}function weightedSumRelu(t,e,a){for(var s=e[this.thread.x],i=0;i<this.constants.size;i++)s+=t[this.thread.x][i]*a[i];return s<0?0:s}function weightedSumLeakyRelu(t,e,a){for(var s=e[this.thread.x],i=0;i<this.constants.size;i++)s+=t[this.thread.x][i]*a[i];return s<0?0:.01*s}function weightedSumTanh(t,e,a){for(var s=e[this.thread.x],i=0;i<this.constants.size;i++)s+=t[this.thread.x][i]*a[i];return Math.tanh(s)}function calcErrorOutput(t,e){return e[this.thread.x]-t}function calcDeltasSigmoid(t,e){return t*e*(1-e)}function calcDeltasRelu(t,e){return e>0?t:0}function calcDeltasLeakyRelu(t,e){return e>0?t:.01*t}function calcDeltasTanh(t,e){return(1-e*e)*t}function calcError(t,e){for(var a=0,s=0;s<this.constants.size;s++)a+=e[s]*t[s][this.thread.x];return a}function calcChanges(t,e,a){return this.constants.learningRate*e[this.thread.y]*a[this.thread.x]+this.constants.momentum*t[this.thread.y][this.thread.x]}function addWeights(t,e){return t+e[this.thread.y][this.thread.x]}function addBiases(t,e){return t[this.thread.x]+e[this.thread.x]*this.constants.learningRate}function mse(t){for(var e=0,a=0;a<this.constants.size;a++)e+=Math.pow(t[a],2);return e/this.constants.size}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function t(t,e){for(var a=0;a<e.length;a++){var s=e[a];s.enumerable=s.enumerable||!1,s.configurable=!0,"value"in s&&(s.writable=!0),Object.defineProperty(t,s.key,s)}}return function(e,a,s){return a&&t(e.prototype,a),s&&t(e,s),e}}(),_get=function t(e,a,s){null===e&&(e=Function.prototype);var i=Object.getOwnPropertyDescriptor(e,a);if(void 0===i){var r=Object.getPrototypeOf(e);return null===r?void 0:t(r,a,s)}if("value"in i)return i.value;var u=i.get;if(void 0!==u)return u.call(s)},_neuralNetwork=require("./neural-network"),_neuralNetwork2=_interopRequireDefault(_neuralNetwork),_lookup=require("./lookup"),_lookup2=_interopRequireDefault(_lookup),_gpu=require("gpu.js"),_gpu2=_interopRequireDefault(_gpu),NeuralNetworkGPU=function(t){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};_classCallCheck(this,e);var a=_possibleConstructorReturn(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t));return a.forwardPropagate=[],a.backwardPropagate=[],a.changesPropagate=[],a.biasesPropagate=[],a.biasCopies=[],a.copyBias=[],a.changesCopies=[],a.copyChanges=[],a.weightsCopies=[],a.copyWeights=[],a.errorCheckInterval=100,a.gpu=new _gpu2.default({mode:t.mode}),a}return _inherits(e,t),_createClass(e,[{key:"_initialize",value:function(){_get(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"_initialize",this).call(this),this.buildRunInput(),this.buildCalculateDeltas(),this.buildGetChanges(),this.buildChangeBiases(),this.buildGetMSE()}},{key:"setActivation",value:function(){}},{key:"_trainPattern",value:function(t,e,a){return this.runInput(t),this.calculateDeltas(e),this.getChanges(),this.changeBiases(),a?this.getMSE(this.errors[this.outputLayer])[0]:null}},{key:"buildRunInput",value:function(){var t=null;switch(this.activation){case"sigmoid":t=weightedSumSigmoid;break;case"relu":t=weightedSumRelu;break;case"leaky-relu":t=weightedSumLeakyRelu;break;case"tanh":t=weightedSumTanh;break;default:throw new Error("unknown activation "+this.activation)}for(var e=1;e<=this.outputLayer;e++)this.forwardPropagate[e]=this.gpu.createKernel(t,{output:[this.sizes[e]],outputToTexture:!0,hardcodeConstants:!0,constants:{size:this.sizes[e-1]}});this._texturizeInputData=this.gpu.createKernel(function(t){return t[this.thread.x]},{output:[this.sizes[1]],outputToTexture:!0,hardcodeConstants:!0,outputImmutable:!0})}},{key:"runInput",value:function(t){var e=void 0;this.outputs[0]=t;for(var a=1;a<=this.outputLayer;a++)this.outputs[a]=this.forwardPropagate[a](this.weights[a],this.biases[a],t),e=t=this.outputs[a];return e}},{key:"buildCalculateDeltas",value:function(){var t=null;switch(this.activation){case"sigmoid":t=calcDeltasSigmoid;break;case"relu":t=calcDeltasRelu;break;case"leaky-relu":t=calcDeltasLeakyRelu;break;case"tanh":t=calcDeltasTanh;break;default:throw new Error("unknown activation "+this.activation)}for(var e=this.outputLayer;e>0;e--)e===this.outputLayer?this.backwardPropagate[e]=this.gpu.createKernelMap({error:_gpu2.default.alias("calcErrorOutput",calcErrorOutput),deltas:_gpu2.default.alias("calcDeltas",t)},function(e,a){var s=e[this.thread.x];return t(calcErrorOutput(s,a),s)},{output:[this.sizes[e]],outputToTexture:!0,hardcodeConstants:!0}):this.backwardPropagate[e]=this.gpu.createKernelMap({error:_gpu2.default.alias("calcError",calcError),deltas:_gpu2.default.alias("calcDeltas",t)},function(e,a,s){var i=a[this.thread.x];return t(calcError(e,s),i)},{output:[this.sizes[e]],outputToTexture:!0,hardcodeConstants:!0,constants:{size:this.deltas[e+1].length}})}},{key:"calculateDeltas",value:function(t){for(var e=this.outputLayer;e>0;e--){var a=void 0;a=e===this.outputLayer?this.backwardPropagate[e](this.outputs[e],t):this.backwardPropagate[e](this.weights[e+1],this.outputs[e],this.deltas[e+1]),this.deltas[e]=a.deltas,this.errors[e]=a.error}}},{key:"buildGetChanges",value:function(){for(var t=1;t<=this.outputLayer;t++)this.changesPropagate[t]=this.gpu.createKernelMap({weights:_gpu2.default.alias("addWeights",addWeights),changes:_gpu2.default.alias("calcChanges",calcChanges)},function(t,e,a,s){return addWeights(calcChanges(s,e,t),a)},{output:[this.sizes[t-1],this.sizes[t]],outputToTexture:!0,hardcodeConstants:!0,constants:{size:this.outputs[t-1].length,learningRate:this.trainOpts.learningRate,momentum:this.trainOpts.momentum}}),this.copyChanges[t]=this.gpu.createKernel(function(t){return t[this.thread.y][this.thread.x]},{output:this.changesPropagate[t].output,outputToTexture:!0,hardCodeConstants:!0}),this.copyWeights[t]=this.gpu.createKernel(function(t){return t[this.thread.y][this.thread.x]},{output:this.changesPropagate[t].output,outputToTexture:!0,hardCodeConstants:!0})}},{key:"getChanges",value:function(){for(var t=1;t<=this.outputLayer;t++){var e=this.changesPropagate[t](this.outputs[t-1],this.deltas[t],this.weightsCopies[t]||this.weights[t],this.changesCopies[t]||this.changes[t]);this.changes[t]=e.changes,this.weights[t]=e.weights,this.changesCopies[t]=this.copyChanges[t](e.changes),this.weightsCopies[t]=this.copyWeights[t](e.weights)}}},{key:"buildChangeBiases",value:function(){for(var t=1;t<=this.outputLayer;t++)this.biasesPropagate[t]=this.gpu.createKernel(addBiases,{output:[this.sizes[t]],outputToTexture:!0,hardcodeConstants:!0,constants:{learningRate:this.trainOpts.learningRate}}),this.copyBias[t]=this.gpu.createKernel(function(t){return t[this.thread.x]},{output:this.biasesPropagate[t].output,outputToTexture:!0,hardCodeConstants:!0})}},{key:"changeBiases",value:function(){for(var t=1;t<=this.outputLayer;t++)this.biases[t]=this.biasesPropagate[t](this.biasCopies[t]||this.biases[t],this.deltas[t]),this.biasCopies[t]=this.copyBias[t](this.biases[t])}},{key:"buildGetMSE",value:function(){this.getMSE=this.gpu.createKernel(mse,{output:[1],hardcodeConstants:!0,constants:{size:this.sizes[this.outputLayer]}})}},{key:"run",value:function(t){if(!this.isRunnable)return null;this.inputLookup&&(t=_lookup2.default.toArray(this.inputLookup,t));var e=this._texturizeInputData(t),a=this.runInput(e),s=a.toArray(this.gpu);return this.outputLookup&&(s=_lookup2.default.toHash(this.outputLookup,s)),s}},{key:"_verifyIsInitialized",value:function(t){var e=this;this.sizes||(this.sizes=[],t[0].size||(t[0].size={input:t[0].input.length,output:t[0].output.length}),this.sizes.push(t[0].size.input),this.hiddenLayers?this.hiddenLayers.forEach(function(t){e.sizes.push(t)}):this.sizes.push(Math.max(3,Math.floor(t[0].size.input/2))),this.sizes.push(t[0].size.output),this._initialize())}},{key:"_prepTraining",value:function(t,e){var a=this;this._updateTrainingOptions(e),t=this._formatData(t);var s=Date.now()+this.trainOpts.timeout,i={error:1,iterations:0};this._verifyIsInitialized(t);var r=this.gpu.createKernel(function(t){return t[this.thread.x]},{output:[t[0].output.length],outputToTexture:!0,hardcodeConstants:!0,outputImmutable:!0});return{data:t.map(function(t){return{size:t.size,input:a._texturizeInputData(t.input),output:r(t.output)}}),status:i,endTime:s}}},{key:"toFunction",value:function(){throw new Error("not implemented on NeuralNetworkGPU")}}]),e}(_neuralNetwork2.default);exports.default=NeuralNetworkGPU; |
| 124 | |
| 125 | },{"./lookup":3,"./neural-network":5,"gpu.js":85}],5:[function(require,module,exports){ |
| 126 | "use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{default:t}}function _toConsumableArray(t){if(Array.isArray(t)){for(var i=0,e=Array(t.length);i<t.length;i++)e[i]=t[i];return e}return Array.from(t)}function _classCallCheck(t,i){if(!(t instanceof i))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function t(t,i){for(var e=0;e<i.length;e++){var s=i[e];s.enumerable=s.enumerable||!1,s.configurable=!0,"value"in s&&(s.writable=!0),Object.defineProperty(t,s.key,s)}}return function(i,e,s){return e&&t(i.prototype,e),s&&t(i,s),i}}(),_lookup=require("./lookup"),_lookup2=_interopRequireDefault(_lookup),_max=require("./utilities/max"),_max2=_interopRequireDefault(_max),_mse=require("./utilities/mse"),_mse2=_interopRequireDefault(_mse),_randos=require("./utilities/randos"),_randos2=_interopRequireDefault(_randos),_range=require("./utilities/range"),_range2=_interopRequireDefault(_range),_toArray=require("./utilities/to-array"),_toArray2=_interopRequireDefault(_toArray),_zeros=require("./utilities/zeros"),_zeros2=_interopRequireDefault(_zeros),_thaw=require("thaw.js"),_thaw2=_interopRequireDefault(_thaw),NeuralNetwork=function(){function t(){var i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};_classCallCheck(this,t),Object.assign(this,this.constructor.defaults,i),this.hiddenLayers=i.hiddenLayers,this.trainOpts={},this._updateTrainingOptions(Object.assign({},this.constructor.trainDefaults,i)),this.sizes=null,this.outputLayer=null,this.biases=null,this.weights=null,this.outputs=null,this.deltas=null,this.changes=null,this.errors=null,this.errorCheckInterval=1,this.constructor.prototype.hasOwnProperty("runInput")||(this.runInput=null),this.constructor.prototype.hasOwnProperty("calculateDeltas")||(this.calculateDeltas=null)}return _createClass(t,null,[{key:"_validateTrainingOptions",value:function(i){var e={iterations:function(t){return"number"==typeof t&&t>0},errorThresh:function(t){return"number"==typeof t&&t>0&&t<1},log:function(t){return"function"==typeof t||"boolean"==typeof t},logPeriod:function(t){return"number"==typeof t&&t>0},learningRate:function(t){return"number"==typeof t&&t>0&&t<1},momentum:function(t){return"number"==typeof t&&t>0&&t<1},callback:function(t){return"function"==typeof t||null===t},callbackPeriod:function(t){return"number"==typeof t&&t>0},timeout:function(t){return"number"==typeof t&&t>0}};Object.keys(t.trainDefaults).forEach(function(t){if(e.hasOwnProperty(t)&&!e[t](i[t]))throw new Error("["+t+", "+i[t]+"] is out of normal training range, your network will probably not train.")})}},{key:"trainDefaults",get:function(){return{iterations:2e4,errorThresh:.005,log:!1,logPeriod:10,learningRate:.3,momentum:.1,callback:null,callbackPeriod:10,timeout:1/0,praxis:null,beta1:.9,beta2:.999,epsilon:1e-8}}},{key:"defaults",get:function(){return{leakyReluAlpha:.01,binaryThresh:.5,hiddenLayers:[3],activation:"sigmoid"}}}]),_createClass(t,[{key:"_initialize",value:function(){if(!this.sizes)throw new Error("Sizes must be set before initializing");this.outputLayer=this.sizes.length-1,this.biases=[],this.weights=[],this.outputs=[],this.deltas=[],this.changes=[],this.errors=[];for(var t=0;t<=this.outputLayer;t++){var i=this.sizes[t];if(this.deltas[t]=(0,_zeros2.default)(i),this.errors[t]=(0,_zeros2.default)(i),this.outputs[t]=(0,_zeros2.default)(i),t>0){this.biases[t]=(0,_randos2.default)(i),this.weights[t]=new Array(i),this.changes[t]=new Array(i);for(var e=0;e<i;e++){var s=this.sizes[t-1];this.weights[t][e]=(0,_randos2.default)(s),this.changes[t][e]=(0,_zeros2.default)(s)}}}this.setActivation()}},{key:"setActivation",value:function(t){switch(this.activation=t||this.activation,this.activation){case"sigmoid":this.runInput=this.runInput||this._runInputSigmoid,this.calculateDeltas=this.calculateDeltas||this._calculateDeltasSigmoid;break;case"relu":this.runInput=this.runInput||this._runInputRelu,this.calculateDeltas=this.calculateDeltas||this._calculateDeltasRelu;break;case"leaky-relu":this.runInput=this.runInput||this._runInputLeakyRelu,this.calculateDeltas=this.calculateDeltas||this._calculateDeltasLeakyRelu;break;case"tanh":this.runInput=this.runInput||this._runInputTanh,this.calculateDeltas=this.calculateDeltas||this._calculateDeltasTanh;break;default:throw new Error("unknown activation "+this.activation+", The activation should be one of ['sigmoid', 'relu', 'leaky-relu', 'tanh']")}}},{key:"run",value:function(t){if(!this.isRunnable)return null;this.inputLookup&&(t=_lookup2.default.toArray(this.inputLookup,t));var i=[].concat(_toConsumableArray(this.runInput(t)));return this.outputLookup&&(i=_lookup2.default.toHash(this.outputLookup,i)),i}},{key:"_runInputSigmoid",value:function(t){this.outputs[0]=t;for(var i=null,e=1;e<=this.outputLayer;e++){for(var s=0;s<this.sizes[e];s++){for(var a=this.weights[e][s],r=this.biases[e][s],n=0;n<a.length;n++)r+=a[n]*t[n];this.outputs[e][s]=1/(1+Math.exp(-r))}i=t=this.outputs[e]}return i}},{key:"_runInputRelu",value:function(t){this.outputs[0]=t;for(var i=null,e=1;e<=this.outputLayer;e++){for(var s=0;s<this.sizes[e];s++){for(var a=this.weights[e][s],r=this.biases[e][s],n=0;n<a.length;n++)r+=a[n]*t[n];this.outputs[e][s]=r<0?0:r}i=t=this.outputs[e]}return i}},{key:"_runInputLeakyRelu",value:function(t){this.outputs[0]=t;for(var i=this.leakyReluAlpha,e=null,s=1;s<=this.outputLayer;s++){for(var a=0;a<this.sizes[s];a++){for(var r=this.weights[s][a],n=this.biases[s][a],u=0;u<r.length;u++)n+=r[u]*t[u];this.outputs[s][a]=n<0?0:i*n}e=t=this.outputs[s]}return e}},{key:"_runInputTanh",value:function(t){this.outputs[0]=t;for(var i=null,e=1;e<=this.outputLayer;e++){for(var s=0;s<this.sizes[e];s++){for(var a=this.weights[e][s],r=this.biases[e][s],n=0;n<a.length;n++)r+=a[n]*t[n];this.outputs[e][s]=Math.tanh(r)}i=t=this.outputs[e]}return i}},{key:"_verifyIsInitialized",value:function(t){var i=this;this.sizes||(this.sizes=[],this.sizes.push(t[0].input.length),this.hiddenLayers?this.hiddenLayers.forEach(function(t){i.sizes.push(t)}):this.sizes.push(Math.max(3,Math.floor(t[0].input.length/2))),this.sizes.push(t[0].output.length),this._initialize())}},{key:"_updateTrainingOptions",value:function(i){var e=this;Object.keys(t.trainDefaults).forEach(function(t){return e.trainOpts[t]=i.hasOwnProperty(t)?i[t]:e.trainOpts[t]}),t._validateTrainingOptions(this.trainOpts),this._setLogMethod(i.log||this.trainOpts.log),this.activation=i.activation||this.activation}},{key:"_getTrainOptsJSON",value:function(){var i=this;return Object.keys(t.trainDefaults).reduce(function(t,e){return"timeout"===e&&i.trainOpts[e]===1/0?t:(i.trainOpts[e]&&(t[e]=i.trainOpts[e]),"log"===e&&(t.log="function"==typeof t.log),t)},{})}},{key:"_setLogMethod",value:function(t){this.trainOpts.log="function"==typeof t?t:!!t&&console.log}},{key:"_calculateTrainingError",value:function(t){for(var i=0,e=0;e<t.length;++e)i+=this._trainPattern(t[e].input,t[e].output,!0);return i/t.length}},{key:"_trainPatterns",value:function(t){for(var i=0;i<t.length;++i)this._trainPattern(t[i].input,t[i].output,!1)}},{key:"_trainingTick",value:function(t,i,e){return!(i.iterations>=this.trainOpts.iterations||i.error<=this.trainOpts.errorThresh||Date.now()>=e)&&(i.iterations++,this.trainOpts.log&&i.iterations%this.trainOpts.logPeriod==0?(i.error=this._calculateTrainingError(t),this.trainOpts.log("iterations: "+i.iterations+", training error: "+i.error)):i.iterations%this.errorCheckInterval==0?i.error=this._calculateTrainingError(t):this._trainPatterns(t),this.trainOpts.callback&&i.iterations%this.trainOpts.callbackPeriod==0&&this.trainOpts.callback(Object.assign(i)),!0)}},{key:"_prepTraining",value:function(t,i){this._updateTrainingOptions(i),t=this._formatData(t);var e=Date.now()+this.trainOpts.timeout,s={error:1,iterations:0};return this._verifyIsInitialized(t),{data:t,status:s,endTime:e}}},{key:"train",value:function(t){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},e=void 0,s=void 0,a=this._prepTraining(t,i);for(t=a.data,e=a.status,s=a.endTime,"adam"===i.praxis&&this._setupAdam();this._trainingTick(t,e,s););return e}},{key:"trainAsync",value:function(t){var i=this,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},s=void 0,a=void 0,r=this._prepTraining(t,e);return t=r.data,s=r.status,a=r.endTime,new Promise(function(e,r){try{var n=new _thaw2.default(new Array(i.trainOpts.iterations),{delay:!0,each:function(){return i._trainingTick(t,s,a)||n.stop()},done:function(){return e(s)}});n.tick()}catch(t){r({trainError:t,status:s})}})}},{key:"_trainPattern",value:function(t,i,e){return this.runInput(t),this.calculateDeltas(i),this._adjustWeights(),e?(0,_mse2.default)(this.errors[this.outputLayer]):null}},{key:"_calculateDeltasSigmoid",value:function(t){for(var i=this.outputLayer;i>=0;i--)for(var e=0;e<this.sizes[i];e++){var s=this.outputs[i][e],a=0;if(i===this.outputLayer)a=t[e]-s;else for(var r=this.deltas[i+1],n=0;n<r.length;n++)a+=r[n]*this.weights[i+1][n][e];this.errors[i][e]=a,this.deltas[i][e]=a*s*(1-s)}}},{key:"_calculateDeltasRelu",value:function(t){for(var i=this.outputLayer;i>=0;i--)for(var e=0;e<this.sizes[i];e++){var s=this.outputs[i][e],a=0;if(i===this.outputLayer)a=t[e]-s;else for(var r=this.deltas[i+1],n=0;n<r.length;n++)a+=r[n]*this.weights[i+1][n][e];this.errors[i][e]=a,this.deltas[i][e]=s>0?a:0}}},{key:"_calculateDeltasLeakyRelu",value:function(t){for(var i=this.leakyReluAlpha,e=this.outputLayer;e>=0;e--)for(var s=0;s<this.sizes[e];s++){var a=this.outputs[e][s],r=0;if(e===this.outputLayer)r=t[s]-a;else for(var n=this.deltas[e+1],u=0;u<n.length;u++)r+=n[u]*this.weights[e+1][u][s];this.errors[e][s]=r,this.deltas[e][s]=a>0?r:i*r}}},{key:"_calculateDeltasTanh",value:function(t){for(var i=this.outputLayer;i>=0;i--)for(var e=0;e<this.sizes[i];e++){var s=this.outputs[i][e],a=0;if(i===this.outputLayer)a=t[e]-s;else for(var r=this.deltas[i+1],n=0;n<r.length;n++)a+=r[n]*this.weights[i+1][n][e];this.errors[i][e]=a,this.deltas[i][e]=(1-s*s)*a}}},{key:"_adjustWeights",value:function(){for(var t=1;t<=this.outputLayer;t++)for(var i=this.outputs[t-1],e=0;e<this.sizes[t];e++){for(var s=this.deltas[t][e],a=0;a<i.length;a++){var r=this.changes[t][e][a];r=this.trainOpts.learningRate*s*i[a]+this.trainOpts.momentum*r,this.changes[t][e][a]=r,this.weights[t][e][a]+=r}this.biases[t][e]+=this.trainOpts.learningRate*s}}},{key:"_setupAdam",value:function(){this.biasChangesLow=[],this.biasChangesHigh=[],this.changesLow=[],this.changesHigh=[],this.iterations=0;for(var t=0;t<=this.outputLayer;t++){var i=this.sizes[t];if(t>0){this.biasChangesLow[t]=(0,_zeros2.default)(i),this.biasChangesHigh[t]=(0,_zeros2.default)(i),this.changesLow[t]=new Array(i),this.changesHigh[t]=new Array(i);for(var e=0;e<i;e++){var s=this.sizes[t-1];this.changesLow[t][e]=(0,_zeros2.default)(s),this.changesHigh[t][e]=(0,_zeros2.default)(s)}}}this._adjustWeights=this._adjustWeightsAdam}},{key:"_adjustWeightsAdam",value:function(){var t=this.trainOpts;this.iterations++;for(var i=1;i<=this.outputLayer;i++)for(var e=this.outputs[i-1],s=0;s<this.sizes[i];s++){for(var a=this.deltas[i][s],r=0;r<e.length;r++){var n=a*e[r],u=this.changesLow[i][s][r]*t.beta1+(1-t.beta1)*n,o=this.changesHigh[i][s][r]*t.beta2+(1-t.beta2)*n*n,h=u/(1-Math.pow(t.beta1,this.iterations)),l=o/(1-Math.pow(t.beta2,this.iterations));this.changesLow[i][s][r]=u,this.changesHigh[i][s][r]=o,this.weights[i][s][r]+=this.trainOpts.learningRate*h/(Math.sqrt(l)+t.epsilon)}var p=this.deltas[i][s],c=this.biasChangesLow[i][s]*t.beta1+(1-t.beta1)*p,f=this.biasChangesHigh[i][s]*t.beta2+(1-t.beta2)*p*p,g=this.biasChangesLow[i][s]/(1-Math.pow(t.beta1,this.iterations)),v=this.biasChangesHigh[i][s]/(1-Math.pow(t.beta2,this.iterations));this.biasChangesLow[i][s]=c,this.biasChangesHigh[i][s]=f,this.biases[i][s]+=t.learningRate*g/(Math.sqrt(v)+t.epsilon)}}},{key:"_formatData",value:function(t){var i=this;if(!Array.isArray(t)){var e=[];e.push(t),t=e}var s=t[0].input;return Array.isArray(s)||s instanceof Float32Array||(this.inputLookup||(this.inputLookup=_lookup2.default.buildLookup(t.map(function(t){return t.input}))),t=t.map(function(t){var e=_lookup2.default.toArray(i.inputLookup,t.input);return Object.assign({},t,{input:e})},this)),Array.isArray(t[0].output)||(this.outputLookup||(this.outputLookup=_lookup2.default.buildLookup(t.map(function(t){return t.output}))),t=t.map(function(t){var e=_lookup2.default.toArray(i.outputLookup,t.output);return Object.assign({},t,{output:e})},this)),t}},{key:"test",value:function(t){var i=this;t=this._formatData(t);for(var e=1===t[0].output.length,s=0,a=0,r=0,n=0,u=[],o=0,h=0;h<t.length;h++)!function(h){var l=i.runInput(t[h].input),p=t[h].output,c=void 0,f=void 0;if(e?(c=l[0]>i.binaryThresh?1:0,f=p[0]):(c=l.indexOf((0,_max2.default)(l)),f=p.indexOf((0,_max2.default)(p))),c!==f){var g=t[h];Object.assign(g,{actual:c,expected:f}),u.push(g)}e&&(0===c&&0===f?n++:1===c&&1===f?r++:0===c&&1===f?a++:1===c&&0===f&&s++);var v=l.map(function(t,i){return p[i]-t});o+=(0,_mse2.default)(v)}(h);var l=o/t.length,p={error:l,misclasses:u};return e&&Object.assign(p,{trueNeg:n,truePos:r,falseNeg:a,falsePos:s,total:t.length,precision:r>0?r/(r+s):0,recall:r>0?r/(r+a):0,accuracy:(n+r)/t.length}),p}},{key:"toJSON",value:function(){for(var t=[],i=0;i<=this.outputLayer;i++){t[i]={};var e=void 0;e=0===i&&this.inputLookup?Object.keys(this.inputLookup):i===this.outputLayer&&this.outputLookup?Object.keys(this.outputLookup):(0,_range2.default)(0,this.sizes[i]);for(var s=0;s<e.length;s++){var a=e[s];if(t[i][a]={},i>0){t[i][a].bias=this.biases[i][s],t[i][a].weights={};for(var r in t[i-1]){var n=r;1===i&&this.inputLookup&&(n=this.inputLookup[r]),t[i][a].weights[r]=this.weights[i][s][n]}}}}return{sizes:this.sizes,layers:t,outputLookup:!!this.outputLookup,inputLookup:!!this.inputLookup,activation:this.activation,trainOpts:this._getTrainOptsJSON()}}},{key:"fromJSON",value:function(t){this.sizes=t.sizes,this._initialize();for(var i=0;i<=this.outputLayer;i++){var e=t.layers[i];if(0!==i||e[0]&&!t.inputLookup?i!==this.outputLayer||e[0]&&!t.outputLookup||(this.outputLookup=_lookup2.default.lookupFromHash(e)):this.inputLookup=_lookup2.default.lookupFromHash(e),i>0){var s=Object.keys(e);this.sizes[i]=s.length;for(var a in s){var r=s[a];this.biases[i][a]=e[r].bias,this.weights[i][a]=(0,_toArray2.default)(e[r].weights)}}}return t.hasOwnProperty("trainOpts")&&this._updateTrainingOptions(t.trainOpts),this.setActivation(this.activation||"sigmoid"),this}},{key:"toFunction",value:function(){function t(a,r,n){if(0===r)return"string"==typeof n?"input['"+n+"']":"input["+n+"]";var u=a[r],o=u[n],h=["(",o.bias];for(var l in o.weights)o.weights[l]<0?h.push(o.weights[l]+"*"+t(a,r-1,l)):h.push("+"+o.weights[l]+"*"+t(a,r-1,l));switch(h.push(")"),i){case"sigmoid":return"1/(1+1/Math.exp("+h.join("")+"))";case"relu":return s=!0,"((v="+h.join("")+")<0?0:v)";case"leaky-relu":return s=!0,"((v="+h.join("")+")<0?0:"+e+"*v)";case"tanh":return"Math.tanh("+h.join("")+")";default:throw new Error("unknown activation type "+i)}}var i=this.activation,e=this.leakyReluAlpha,s=!1,a=this.toJSON().layers,r=[],n=void 0;for(var u in a[a.length-1])r.push(t(a,a.length-1,u));return n=this.outputLookup?"{"+Object.keys(this.outputLookup).map(function(t,i){return"'"+t+"':"+r[i]})+"}":"["+r.join(",")+"]",new Function("input",(s?"var v;":"")+"return "+n+";")}},{key:"isRunnable",get:function(){var t=this;if(!this.runInput)return console.error("Activation function has not been initialized, did you run train()?"),!1;var i=["sizes","outputLayer","biases","weights","outputs","deltas","changes","errors"].filter(function(i){return null===t[i]});return!(i.length>0)||(console.error("Some settings have not been initialized correctly, did you run train()? Found issues with: "+i.join(", ")),!1)}}]),t}();exports.default=NeuralNetwork; |
no test coverage detected